UGUI实现虚拟手柄功能

用Uniyt自带的UGUI实现虚拟摇杆功能,使用摇杆控制物体移动

首先新建一个unity工程,建一个画布,两张Image 父子关系,像这样:


建好之后把准备好的素材拉上去,素材在最后上传,效果图如下:


然后新建两个C#脚本


JoyStick:控制虚拟手柄的拖动脚本

JoyStick3D:控制物体移动脚本

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
/// 
/// 摇杆的控制 需要UGUI的两个Image父子关系子节点作为控制父节点作为显示
/// 
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
    /// 
    /// 摇杆最大半径
    /// 以像素为单位
    /// 
    public float JoyStickRadius = 50;
    /// 
    /// 摇杆重置所诉
    /// 
    public float JoyStickResetSpeed = 5.0f;
    /// 
    /// 当前物体的Transform组件
    /// 
    private RectTransform selfTransform;
    /// 
    /// 是否触摸了虚拟摇杆
    /// 
    private bool isTouched = false;
    /// 
    /// 虚拟摇杆的默认位置
    /// 
    private Vector2 originPosition;
    /// 
    /// 虚拟摇杆的移动方向
    /// 
    private Vector2 touchedAxis;
    public Vector2 TouchedAxis
    {
        get
        {
            if (touchedAxis.magnitude < JoyStickRadius)
                return touchedAxis.normalized / JoyStickRadius;
            return touchedAxis.normalized;
        }
    }
    /// 
    /// 定义触摸开始事件委托
    /// 
    public delegate void JoyStickTouchBegin(Vector2 vec);
    /// 
    /// 定义触摸过程事件委托
    /// 
    /// 虚拟摇杆的移动方向
    public delegate void JoyStickTouchMove(Vector2 vec);
    /// 
    /// 定义触摸结束事件委托
    /// 
    public delegate void JoyStickTouchEnd();
    /// 
    /// 注册触摸开始事件
    /// 
    public event JoyStickTouchBegin OnJoyStickTouchBegin;
    /// 
    /// 注册触摸过程事件
    /// 
    public event JoyStickTouchMove OnJoyStickTouchMove;
    /// 
    /// 注册触摸结束事件
    /// 
    public event JoyStickTouchEnd OnJoyStickTouchEnd;
    void Start()
    {
        //初始化虚拟摇杆的默认方向
        selfTransform = this.GetComponent
  
  
   
   ();
        originPosition = selfTransform.anchoredPosition;
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        isTouched = true;
        touchedAxis = GetJoyStickAxis(eventData);
        if (this.OnJoyStickTouchBegin != null)
            this.OnJoyStickTouchBegin(TouchedAxis);
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        isTouched = false;
        selfTransform.anchoredPosition = originPosition;
        touchedAxis = Vector2.zero;
        if (this.OnJoyStickTouchEnd != null)
            this.OnJoyStickTouchEnd();
    }
    public void OnDrag(PointerEventData eventData)
    {
        touchedAxis = GetJoyStickAxis(eventData);
        if (this.OnJoyStickTouchMove != null)
            this.OnJoyStickTouchMove(TouchedAxis);
    }
    void Update()
    {
        //当虚拟摇杆移动到最大半径时摇杆无法拖动
        //为了确保被控制物体可以继续移动
        //在这里手动触发OnJoyStickTouchMove事件
        if (isTouched && touchedAxis.magnitude >= JoyStickRadius)
        {
            if (this.OnJoyStickTouchMove != null)
                this.OnJoyStickTouchMove(TouchedAxis);
        }
        //松开虚拟摇杆后让虚拟摇杆回到默认位置
        if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)
            selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetSpeed;
    }
    /// 
   
   
    /// 返回虚拟摇杆的偏移量
    /// 
    /// 
   
   
    
    The joy stick axis.
   
   
    /// 
   
   Event data.
    private Vector2 GetJoyStickAxis(PointerEventData eventData)
    {
        //获取手指位置的世界坐标
        Vector3 worldPosition;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,
                 eventData.position, eventData.pressEventCamera, out worldPosition))
            selfTransform.position = worldPosition;
        //获取摇杆的偏移量
        Vector2 touchAxis = selfTransform.anchoredPosition - originPosition;
        //摇杆偏移量限制
        if (touchAxis.magnitude >= JoyStickRadius)
        {
            touchAxis = touchAxis.normalized * JoyStickRadius;
            selfTransform.anchoredPosition = touchAxis;
        }
        return touchAxis;
    }
}using UnityEngine;
using System.Collections;
/// 
   
   
/// 摇杆需要控制的物体脚本 绑定到需要控制的物体上
/// 
public class JoyStick3D : MonoBehaviour
{
    private JoyStick js;
    void Start()
    {
        js = GameObject.FindObjectOfType
   
   
    
    ();
        js.OnJoyStickTouchBegin += OnJoyStickBegin;
        js.OnJoyStickTouchMove += OnJoyStickMove;
        js.OnJoyStickTouchEnd += OnJoyStickEnd;
    }
    void OnJoyStickBegin(Vector2 vec)
    {
        Debug.Log("开始触摸虚拟摇杆");
    }
    void OnJoyStickMove(Vector2 vec)
    {
        Debug.Log("正在移动虚拟摇杆");
        //设置角色朝向
        Quaternion q = Quaternion.LookRotation(new Vector3(vec.x, 0, vec.y));
        transform.rotation = q;
        //移动角色并播放奔跑动画
        transform.Translate(Vector3.forward * 5f * Time.deltaTime);
       // animation.CrossFade("Run");
    }
    void OnJoyStickEnd()
    {
        Debug.Log("触摸移动摇杆结束");
        //播放默认待机动画
        //animation.CrossFade("idle");
    }
    void OnGUI()
    {
        GUI.Label(new Rect(30, 30, 200, 30), "3D模式下的虚拟摇杆测试");
    }
}
   
   
  
  

将JoyStick脚本绑定到子节点上

建一个方块 将JoyStick3D脚本绑定到该物体上 接下来就成功了!

下面是摇杆素材


大功告成!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值