unity 固定摇杆
实现原理
- 固定的摇杆:
- 其实就是围绕一个固定点绕其旋转
- 这里需要计算一个向量 (Vector2) ,圆点到摇杆的方向,通过这个向量就可以得到摇杆左右朝向信息
- 向量相减就能得到一个指向被减向量的新向量
tmpDir = targetPos - orginPos
,如👇 图 其中:orginPos
:固定原点targetPos
:摇杆原点tmpDir
:算出的向量
- 然后限制摇杆活动范围,其实就是算出
tmpDir
这个向量的大小也叫模长,用勾股定理可以得到,当然也可以用unity提供的实例函数magnitude
得到 (其实magnitude == Vector2.Distance() )。然后让tmpDir
向量的大小距离<=
一个固定范围radius
- 当摇杆位置小于这个范围时,就把直接把这个位置设为摇杆位置
+ 当摇杆位置大于这个范围时,就要先把tmpDir
给归一化变成单位向量只关心方向,然后乘以范围得出固定长度,最后加上原点向量得到最后的位置 如👇图
- 摇杆状态
- 待机
- 按下
IPointerDownHandler
- - unity提供的接口可以返回一个以屏幕坐标系为坐标的点(vector2) 仅对UI有效 - 拖拽
IDragHandler
- - 拖拽时就设置摇杆位置 - 抬起
IPointerUpHandler
- - 摇杆回到原点也就是待机时的位置 - 待机
实现
- 创建摇杆背景和摇杆(父子关系)编写脚本并挂载到摇杆上
using UnityEngine;
using UnityEngine.EventSystems;
public class FixedJoystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler {
public float Angle { get { return angle; } }
public Vector2 Direction { get { return direction; } }
public static FixedJoystick Instance;
[SerializeField] float radius;
Vector2 orginPos;
Vector2 direction;
float distance;
float power;
float angle;
private void Start () {
orginPos = transform.GetComponentInParent<Transform> ().position;
Instance = this;
distance = radius;
}
public void OnPointerDown (PointerEventData eventData) {
transform.position = eventData.position;
}
public void OnDrag (PointerEventData eventData) {
Vector2 tmpDir = eventData.position - orginPos; //朝向
if (tmpDir.magnitude < distance) { //小于最大距离就在 距离内活动
transform.position = eventData.position;
power = tmpDir.magnitude / distance;
} else { //否则 限制最大活动范围
transform.position = orginPos + tmpDir.normalized * distance;
power = distance / distance;
}
direction.x = tmpDir.x > 0 ? 1 : -1;
direction.y = tmpDir.y > 0 ? 1 : -1;
direction *= power;
//反切计算角度
angle = Mathf.Atan2 (tmpDir.y, tmpDir.x) * Mathf.Rad2Deg;
}
//抬起归原点
public void OnPointerUp (PointerEventData eventData) {
transform.localPosition = Vector2.zero;
direction = Vector2.zero;
}
}
效果图
- 需要方向用:
FixedJoystick.Instance.Direction
- 需要角度用:
FixedJoystick.Instance.Angle
最后
学习笔记,仅供参考,如有不正,欢迎指正