Unity 虚拟摇杆的实现

一般地,虚拟摇杆是放在UI层的。

所以先在Canvas建立一个空对象(这里被命名成MoveController),再在空对象里面放一个作为摇杆图片的Image。

Unity 虚拟摇杆的实现

然后通过覆盖重写UnityEngine.UI的ScrollRect成一个新的脚本,加载到Image对象上。

脚本代码:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class MoveController : ScrollRect{
float mMaxRadius;
public bool ifmove;
public Vector2 moveDelta = new Vector2(); protected override void Start()
{
base.Start();
//计算摇杆块的半径 = 摇杆的宽的一半
mMaxRadius = content.sizeDelta.x * 0.5f;
} //拖动时
public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
{
base.OnDrag(eventData); var contentPostion = this.content.anchoredPosition;
//如果超出摇杆范围
if (contentPostion.magnitude > mMaxRadius)
{
contentPostion = contentPostion.normalized * mMaxRadius;
SetContentAnchoredPosition(contentPostion);
}
//获取拖动的delta值 (-1<DeltaX<1,-1<DeltaY<1)
moveDelta.x = contentPostion.x/ mMaxRadius;
moveDelta.y = contentPostion.y/ mMaxRadius;
//表示正在移动摇杆
ifmove = true;
} public void Update()
{
//,,,,,,,
//可根据moveDelta值做某些事情
} //当结束拖动时
public override void OnEndDrag(PointerEventData eventData)
{
base.OnEndDrag(eventData); moveDelta.x = ;
moveDelta.y = ;
//表示停止移动摇杆
ifmove = false;
//重置位置
SetContentAnchoredPosition(Vector3.zero);
}
}

在Unity面板调好脚本属性(如下图示例),然后将Image拖到脚本的Content属性里

Unity 虚拟摇杆的实现

我们可能还需要额外的公开变量放在MoveController里面,以便在Unity面板调用调试。

但是由于MoveController脚本是覆盖于ScrollRect的,无论你在MoveController脚本里写多少公开的成员变量。

在Unity的面板显示的永远是ScrollView的面板。

这时候可以额外写多一个辅助脚本,间接访问MoveController,从而让公开变量可以在面板调试。

(如下图的MoveController_CallBack示例)

Unity 虚拟摇杆的实现

上一篇:开源一个定时任务调度器 webscheduler


下一篇:PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】