UGUI 摇杆

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

/// <summary>
/// 基于UGUI的摇杆
/// </summary>
public class JoystickUGUI : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
    private Transform cacheTransform;
    private GameObject cacheGameObject;

    private RectTransform rect;//范围

    private RectTransform center;//中心球

    private Canvas canvas;//画布


    public delegate void JoystickTouchEvent();//点击事件
    public delegate void JoystickDragEvent(Vector2 joystickAxis);//拖拽事件

    public JoystickTouchEvent OnJoystickDragStart;//开始拖拽
    public JoystickDragEvent OnJoystickDrag;//拖拽中
    public JoystickTouchEvent OnJoystickDragEnd;//拖拽结束
    public JoystickTouchEvent OnTouchStart;//开始点击
    public JoystickTouchEvent OnTouchUp;//点击结束

    private float radio = 200;//球拖拽最大距离

    private Vector2 lastJoystickAxis;//上一次计算分发的向量

    private bool isDraging;//是否在拖拽中

    void Awake()
    {
        cacheGameObject = gameObject;
        cacheTransform = transform;
        rect = cacheTransform.Find("Border").GetComponent<RectTransform>();
        center = cacheTransform.Find("Border/Center").GetComponent<RectTransform>();
        canvas = cacheTransform.parent.GetComponent<Canvas>();
    }

    void Update()
    {
        if (isDraging && OnJoystickDrag != null)//没有松开时,以最后一次拖拽位置执行事件
        {
            OnJoystickDrag(lastJoystickAxis);
        }
    }

    //Unity Method
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log($"OnBeginDrag {eventData.position}");
        isDraging = true;
        if (OnJoystickDragStart != null)
        {
            OnJoystickDragStart();
        }
    }

    //Unity Method
    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log($"OnEndDrag {eventData.position}");
        isDraging = false;
        center.anchoredPosition = Vector2.zero;
        if (OnJoystickDragEnd != null)
        {
            OnJoystickDragEnd();
        }
    }

    //Unity Method
    public void OnDrag(PointerEventData eventData)
    {
        Vector2 uiPos = ScreenToRectPos(eventData.position);
        //Debug.Log($"OnDrag {eventData.position}, screen pos:{eventData.position},uiPos:{uiPos}");
        float dis = Vector2.Distance(uiPos, Vector2.zero);//如果pivot不是(0.5,0.5),距离计算需要修改
        if (dis > radio)//超过最大移动半径,按照相似三角形,算坐标
        {
            uiPos = new Vector2(radio * uiPos.x / dis, radio * uiPos.y / dis);

        }
        center.anchoredPosition = uiPos;

        if (OnJoystickDrag != null)
        {
            lastJoystickAxis = uiPos.normalized;//归一化后分发给事件,限定范围在-1,1之间
            OnJoystickDrag(lastJoystickAxis);
        }
    }

    //Unity Method
    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log($"OnPointerDown {eventData.position}");
        if (OnTouchStart != null)
        {
            OnTouchStart();
        }
    }

    /// <summary>
    /// 屏幕坐标转矩形内坐标
    /// </summary>
    /// <param name="screentPos"></param>
    /// <returns></returns>
    private Vector2 ScreenToRectPos(Vector2 screentPos)
    {
        Vector2 uiPos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, screentPos, canvas.worldCamera, out uiPos);
        return uiPos;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log($"OnPointerUp {eventData.position}");
        if (OnTouchUp != null)
        {
            OnTouchUp();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UGUIUnity图形用户界面) 是Unity引擎中用于创建用户界面的工具。摇杆物体移动是指使用UGUI中的摇杆(Joytstick)组件来控制游戏中的物体移动。下面是一种实现摇杆物体移动的方法: 首先,创建一个新的Canvas,并在其上创建一个RawImage对象作为摇杆的图像显示区域。然后,在这个RawImage对象上添加一个Image组件,并将摇杆的图片资源赋给它。 接下来,需要在摇杆图像上添加一个摇杆触摸的事件监听脚本。这个脚本可以通过实现Unity提供的接口来监听用户的触摸操作,并进行相应的处理。可以通过监听摇杆图像上的Touch事件来实现。 在监听脚本中,可以通过判断触摸事件类型,来处理用户的触摸操作。当用户按下手指时,获取到按下位置和摇杆图像的原始位置,并将其保存下来。然后,根据用户触摸的位置,计算出摇杆的偏移量(相对于原始位置),并将其映射到游戏中物体的移动范围上。 在每一帧更新中,可以根据摇杆的偏移量来计算出物体应该移动的速度和方向。可以使用Unity提供的刚体组件来控制物体的移动。将计算得到的速度和方向赋给物体的刚体组件上的力或速度属性,即可实现物体的移动。 需要注意的是,对于3D场景中的物体移动,可以使用Rigidbody组件来实现物体受力和冲量等物理效果。对于2D场景中的物体移动,可以使用Rigidbody2D组件。 通过以上步骤,就可以在Unity引擎中实现使用UGUI摇杆来控制游戏中物体的移动。具体操作可以根据实际需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值