创建摇杆
- 还是要提醒一下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);
完成: