将该脚本挂在摇杆内部的小圆上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class HandlerController : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
public bool isDragging = false;
public const int largeCircleRadius = 90;
public const int littleCircleRadius = 30;
public Vector2 dragPos = new Vector2(0, 0);
private Vector2 initPos = new Vector2(0, 0);
private Vector2 rawEventPos = new Vector2(0, 0);
public Camera uiCamera = null;
// Start is called before the first frame update
void Start()
{
initPos = uiCamera.WorldToScreenPoint(transform.position); //摇杆初始位置的屏幕坐标
//initPos.x *= initPos.x * Screen.width;
//initPos.y *= initPos.y * Screen.height;
}
// Update is called once per frame
void Update()
{
}
public void OnDrag(PointerEventData eventData)
{
rawEventPos = eventData.position; //拖动位置的屏幕坐标
dragPos = new Vector2(rawEventPos.x - initPos.x, rawEventPos.y - initPos.y); //摇杆相对初始位置的坐标
float dragPosRadius = dragPos.magnitude;
if (dragPosRadius >= largeCircleRadius - littleCircleRadius)
{
dragPos.Normalize();
dragPos = dragPos * (largeCircleRadius - littleCircleRadius);
}
transform.localPosition = dragPos;
}
public void OnBeginDrag(PointerEventData eventData)
{
this.isDragging = true;
}
public void OnEndDrag(PointerEventData eventData)
{
this.isDragging = false;
transform.localPosition = new Vector2(0, 0);
}
}