EventTrigger摇杆应用
本文使用EventTrigger实现手机游戏的摇杆控制玩家移动的功能。
面板代码部分
关于EventTrigger在start函数中的注册
函数定义
//摇杆内容
//RectTransform是定义ui位置的类
public RectTransform imgJoy;
public EventTrigger et;
注册代码
//为摇杆在事件触发器上注册事件
//创建新的事件
EventTrigger.Entry en = new EventTrigger.Entry();
//定义新事件的类型
en.eventID = EventTriggerType.Drag;
//给出这一新事件类型要做的事情(函数)
en.callback.AddListener(JoyDrag);
//在事件触发器的triggers列表中加入新事件
et.triggers.Add(en);
//创建第二个(只不过可以用同一个名字加入)
en = new EventTrigger.Entry();
//定义新事件的类型
en.eventID = EventTriggerType.EndDrag;
//给出这一新事件类型要做的事情(函数)
en.callback.AddListener(EndJoyDrag);
//在事件触发器的triggers列表中加入新事件
et.triggers.Add(en);
摇杆拖拽事件以及停止拖曳
其中涉及到的move函数在player脚本中 用于2dui和3d物体的坐标转换从而使玩家可以在3d空间正常移动
private void JoyDrag(BaseEventData data)
{
//获取data中的内容 (很重要) 里氏替换原则
PointerEventData eventData = data as PointerEventData;
imgJoy.position += new Vector3(eventData.delta.x, eventData.delta.y, 0);
if(imgJoy.anchoredPosition.magnitude > 170)
{
imgJoy.anchoredPosition = imgJoy.anchoredPosition.normalized * 170;
}
Player.Move(imgJoy.anchoredPosition);
}
private void EndJoyDrag(BaseEventData data)
{
//回归原点
imgJoy.anchoredPosition = Vector2.zero;
//停止移动
Player.Move(Vector2.zero);
}
玩家脚本内容
参数定义
//玩家在3d空间 所以定义vector3
private Vector3 nowMoveDir = Vector3.zero;
//移动速度
public float moveSpeed = 10;
//转向速度
public float rotateSpeed = 10;
update函数(用于判定玩家的移动)
void Update()
{
if(nowMoveDir != Vector3.zero)
{
this.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(nowMoveDir), Time.deltaTime * rotateSpeed);
}
}
move函数用于转换坐标
public void Move(Vector2 dic)
{
nowMoveDir.x = dic.x;
nowMoveDir.z = dic.y;
nowMoveDir.y = 0;
}