Ugui 实现简易版的Joystick

来源:互联网 发布:sheme数据库方案 编辑:程序博客网 时间:2024/05/17 22:34
Ugui 实现托拉拽的接口 在UnityEngine.EventSystems 只要找到相应的接口,怎么实现都很简单
遇到自适应问题,请调节好开发时候的Canvas 分辨率,以及调好Anchor
以下代码asix 即是最后摇杆需要的值

在使用自适应的过程发现,eventData.position 与 背景的大小 貌似有一点问题,明明宽度 大小是对的,可是经过检查,宽度  256的背景,坐标x 并非是从 0~256,而是要乘上 Canvas 的 scaleFactor 才是得到真是的坐标。


using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using UnityEngine.EventSystems;using System;/// <summary>/// 简易版的摇杆/// </summary>public class TJoystick : MonoBehaviour ,IPointerDownHandler,IDragHandler,IPointerUpHandler{    public Image bg;    public Image knob;    public float radius;    public Vector2 asix;    public Vector2 orgin;    public Vector2 pos;    /// <summary>    /// 是否仅仅需要方向    /// </summary>    public bool isPureDirection;    public event Action OnUpEvent;    public event Action OnDragEvent;    private RectTransform knobRect;    private Canvas canvas;// Use this for initializationvoid Start () {        canvas = this.GetComponentInParent<Canvas>();        //矩形 x y应该一样大小才对        radius = bg.GetComponent<RectTransform>().sizeDelta.x/2 * canvas.scaleFactor;        orgin = knob.GetComponent<RectTransform>().position;        knobRect = knob.GetComponent<RectTransform>();        }    public void OnDrag(PointerEventData eventData)    {        if (bg == null || knob == null)        {            Debug.Log("摇杆未赋值");            return;        }        float dis = Vector2.Distance(eventData.position, orgin);        Vector2 direction = eventData.position - orgin;        Debug.Log(radius * direction.normalized);        if (dis > radius)            knobRect.position = orgin + radius * direction.normalized;        else            knobRect.position = eventData.position;        asix = direction.normalized;        //如果还需要长度        if (!isPureDirection)        {            dis = Vector2.Distance(knobRect.position, orgin);            float len = dis / radius;            asix *= len;        }        if (OnDragEvent != null)            OnDragEvent();    }    public void OnPointerDown(PointerEventData eventData)    {        OnDrag(eventData);    }    public void OnPointerUp(PointerEventData eventData)    {        knobRect.position = orgin;        asix = Vector2.zero;        if (OnUpEvent != null)            OnUpEvent();    }}



0 0
原创粉丝点击