创建一个Unity的手游摇杆
1. 步骤1:搭建一个UI摇杆
1.1. 将JoyStick(可以用image组件)设置为左侧一半的区域(大概全屏幕四分之一的区域,可以适当调整)
1.2. JoyStick下有一个Background背景层为摇杆的背景,而Background下有一个Handle作为摇杆。
显示效果类似这样:
2.步骤2:写一个脚本让UI上的摇杆在规定的区域动起来
这个脚本放在JoyStick这个对象身上
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class JoyStickBtn : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler {
#region JoyStick Event
public Transform TransBG;
public Transform TransHandle;
int FingerId = int.MinValue;
Vector3 PointDownPos;
public float MaxRadius;
private Vector3 _Dir;
//外部访问的只读方向向量
public Vector3 Dir => (_Dir);
public void OnPointerDown(PointerEventData eventData) {
//相当于鼠标左键,手点击才可以触发
if (eventData.pointerId < -1) {
return;
}
FingerId = eventData.pointerId;
//获取点击的位置,并将摇杆的背景位置设为点击位置
TransBG.position = PointDownPos = eventData.position;
}
public void OnDrag(PointerEventData eventData) {
//相当于只有鼠标左键点击是触发
if (eventData.pointerId < -1) {
return;
}
FingerId = eventData.pointerId;
//计算拖拽的位置和开始点击的位置的距离
var dis = eventData.position - (Vector2)PointDownPos;
//获取移动摇杆的定值、最小值、最大值(限定摇杆的范围)
var radius = Mathf.Clamp(Vector3.Magnitude(dis), 0, MaxRadius);
//计算出摇杆的位置
TransHandle.localPosition = radius * dis.normalized;
//拿到摇杆的方向,在移动脚本中获取Dir这个只读的属性(以防被更改)
//这个_Dir的值经过归一化会返回[-1,1]
_Dir = TransHandle.localPosition.normalized;
}
public void OnPointerUp(PointerEventData eventData) {
if (eventData.pointerId < -1) {
return;
}
FingerId = eventData.pointerId;
//将摇杆位置重置
TransHandle.localPosition = Vector3.zero;
_Dir = Vector3.zero;
}
#endregion
}
3.写一个移动脚本
/* 获取到 JoyStickBtn 脚本后和使用以下两个Input的方法一样获取两个轴的向量
hor = Input.GetAxis("Horizontal");
ver = Input.GetAxis("Vertical");
*/
hor = JoyStickBtn.Dir.x;
ver = JoyStickBtn.Dir.y;
transform.postion+=
new Vector3(hor * speed * Time.deltaTime, 0.0f, ver * speed * Time.deltaTime);
具体的移动脚本可以参考我的另一篇博客角色移动