void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
dir = new Vector2(h, v);
if (dir != Vector2.zero)
{
float angle = Vector2.SignedAngle(dir,new Vector3(0, 1));
transform.localEulerAngles = new Vector3(0, angle, 0);
transform.Translate(transform.forward * 0.03f,Space.World);
}
}
通过键盘上下左右控制人物角色的前方朝向,最重要是Vector2.SignedAngle这个API, 第二个参数是 vector3(0,1)这个是以世界坐标的前方为基准,求出 角色与前方的角度偏移
一下代码是控制UI的摇杆的
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class drag : MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler
{
Vector3 startPos;
public void OnDrag(PointerEventData eventData)
{
Vector3 dir = Input.mousePosition - startPos;
Vector2 img = Vector2.ClampMagnitude(dir, 50);
transform.localPosition = img;
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log(eventData.position);
startPos = transform.position;
}
public void OnPointerUp(PointerEventData eventData)
{
transform.localPosition = Vector3.zero;
}
}
引入using UnityEngine.EventSystems;命名空间
接着使用Unity提供的接口
原理就是利用Unity提供的接口,点击中间的正方形时,也就是摇杆中心,给startPos赋值 也就是中心点的位置
当拖动UI时,也就是调用OnDrag 通过鼠标位置减去startPos 计算出方向,利用 Vector2.ClampMagnitude限制向量的长度 也就是这个方法的第二个参数,这个根据摇杆的半径而定。 最后将返回值 赋值给中间图片的本地坐标。