創建搖桿
- 還是要提醒一下Canvas設置size隨屏幕大小變化而變化。
- 創建UI內的Image,設置爲搖桿背景。需要設置錨點爲左下角。
- 在Rocker下再創一個Image,RockerCenter。錨點要在正中間。
- 創建腳本ScrollCircle,並給Rocker。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ScrollCircle : ScrollRect
{
// 自己設置大小使得搖桿最大距離合適
private float distanceRate = 0.25f;
// 可以移動半徑
public float radius = 0f;
// 自己設置有效感應半徑是最大感應半徑的多少
private float validRate = 0.5f;
// 有效感應半徑
public float radiusValid = 0f;
protected override void Start()
{
base.Start();
radius = content.sizeDelta.x * content.localScale.x * distanceRate;
radiusValid = radius * validRate;
}
// 通過content.anchoredPosition來得到偏移的方向向量
// 注意釋放後還是有0.003左右的誤差,且釋放後會慢慢往中心拉,所以需要設置有效感應半徑
public override void OnDrag(PointerEventData eventData)
{
base.OnDrag(eventData);
// 獲取搖桿位置,根據錨點的位置。
Vector2 pos = content.anchoredPosition;
// 通過偏移向量的長度計算距離,如果超出就拉回來
if (pos.magnitude > radius)
{
pos = pos.normalized * radius;
SetContentAnchoredPosition(pos);
}
}
}
- 我們通過content.anchoredPosition來得到偏移的方向向量。
- 注意釋放後還是有0.003左右的誤差,且釋放後會慢慢往中心拉,所以需要設置有效感應半徑。
綁定角色移動
- 之前是用Input.GetAxisRaw通過鍵盤移動,按照規則來應該是當搖桿往左移動時X=-1,否則X=1;Y同理。
- 由於釋放後的誤差以及緩慢的恢復過程,我們寫一個標準函數,讓(-V,V)之間的數變爲0,大於V的變爲1,小於-V的變爲-1。其中V是ScrollCircle中設定的有效半徑。
// 通過L,R來讓數變爲-1,0,1
public static void SetNumberWithOneAndZero(ref float number,float l,float r)
{
if (number > l && number < r) number = 0;
else if (number > r) number = 1;
else number = -1;
}
Player:
rocker = GameObject.FindGameObjectWithTag("Rocker").GetComponent<ScrollCircle>();
Vector2 moveDirection = rocker.content.anchoredPosition;
float radiusValid = rocker.radiusValid;
Helper.SetNumberWithOneAndZero(ref moveDirection.x, -radiusValid, radiusValid);
Helper.SetNumberWithOneAndZero(ref moveDirection.y, -radiusValid, radiusValid);
完成: