首先用两张image拼出一个摇杆的样式
Joy:设置一下锚点 和 轴心点
JoyImg:锚点设置为joy的中心,轴心点默认为中心
在JoyImg上再添加一个Event Tirgger组件
新建一个地面,一个物体作移动使用
新建一个脚本,随意取个名称
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Joy : MonoBehaviour
{
public EventTrigger et;
public RectTransform joyImg;
public Player player;
private bool isDrag = false;
private PointerEventData eventData;
void Start()
{
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.BeginDrag;
entry.callback.AddListener((data) => {
isDrag = true;
});
et.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.Drag;
entry.callback.AddListener((data) => {
eventData = data as PointerEventData;
joyImg.position += new Vector3(eventData.delta.x, eventData.delta.y, 0);
if (joyImg.anchoredPosition.magnitude > 140)
{
joyImg.anchoredPosition = joyImg.anchoredPosition.normalized * 140;
}
player.Move(joyImg.anchoredPosition);
});
et.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.EndDrag;
entry.callback.AddListener((data) => {
isDrag = false;
joyImg.anchoredPosition = Vector2.zero;
});
et.triggers.Add(entry);
}
void Update()
{
if (eventData?.delta == Vector2.zero && isDrag)
{
player.Move(joyImg.anchoredPosition);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveSpeed = 10;
public float roundSpeed = 10;
private Vector3 nowVect;
public void Move(Vector2 vec)
{
nowVect.x = vec.x;
nowVect.y = 0;
nowVect.z = vec.y;
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(nowVect), roundSpeed * Time.deltaTime);
}
}
另一种控制摇杆移动的方法
RectTransformUtility.ScreenPointToLocalPointInRectangle(
joyImg.parent as RectTransform,
eventData.position,
eventData.enterEventCamera,
out Vector2 pos
);
joyImg.localPosition = pos;
将新建的Joy脚本,拖拽到场景当中的一个物体上,将Player脚本拖给负责移动的物体上。之后给Joy脚本拖拽赋值
EventTrigger.Entry是用于定义事件触发器(EventTrigger)中的事件条目的类。EventTrigger组件允许为UI元素添加多个事件监听器,每个事件监听器都对应一个EventTrigger.Entry对象。
EventTrigger.Entry包含了以下主要属性:
- eventID:指定事件类型,比如PointerEnter、PointerExit、Drag等。
- callback:UnityEvent类型,用于添加回调函数,当事件被触发时会执行这些回调。
delta:指针移动增量
anchoredPosition 是 轴心点距锚点的偏移位置