虚拟摇杆
基于UGUI的IDragHandler, IEndDragHandler, IPointerDownHandler接口实现。
1.鼠标指针移动到摇杆区域,记录鼠标指针和摇杆之间的偏移;
2.OnDrag不断更新摇杆位置;
3.Update更新移动的方向
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
/// <summary>
/// 虚拟摇杆
/// </summary>
public class VirtualJoy : MonoBehaviour, IDragHandler, IEndDragHandler, IPointerDownHandler
{
bool isDrag;
Vector3 offest;
Vector3 origionPos;
Vector2 moveDirction;
public float radius;//半径
public static event UnityAction<Vector2> OnMoveDirection;
void Start()
{
isDrag = false;
offest = Vector3.zero;
origionPos = transform.localPosition;
moveDirction = Vector2.zero;
}
public void OnPointerDown(PointerEventData eventData)
{
offest = Input.mousePosition - transform.localPosition;
}
public void OnDrag(PointerEventData eventData)
{
isDrag = true;
transform.localPosition = Input.mousePosition - offest;
//移动距离超出半径 重置位置
if (Vector3.Distance(transform.localPosition, origionPos) >= radius)
{
var moveDirection = transform.localPosition - origionPos;
var newPos = moveDirection.normalized * radius + origionPos;
transform.localPosition = newPos;
}
//获取新的 移动方向
moveDirction = transform.localPosition - origionPos;
//标椎化
moveDirction = moveDirction / radius;
}
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
offest = Vector3.zero;
moveDirction = Vector2.zero;
transform.localPosition = origionPos;
}
void Update()
{
if (isDrag)
{
OnMoveDirection?.Invoke(moveDirction);
}
}
}