天天看點

使用UGUI制作虛拟搖杆

原文連結:http://blog.csdn.net/qinyuanpei/article/details/49510021

因為最近的項目要增加一個虛拟搖杆,然後檢視了一些相關資料後,就自己做了一個,分享出來:

隻有兩個腳本,一個是用來控制按鈕的,一個是用來被控制物體移動的腳本:

如下:

/*************************************************************************
 *  FileName: JoyStick.cs
 *  Author: LaiZhangYin(Eagle)   Version: 1.0   Date: 6/12/2017
 * if you have some question, please call 
 *  QQ/Wechat : 782966734
 *************************************************************************/

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;

public class JoyStick : MonoBehaviour,  IPointerDownHandler, IPointerUpHandler, IDragHandler
{
   
    public float radius = 50.0f;
    public float speed = 5.0f;
    private RectTransform selfTransform;
    private bool isTouched = false;
    private Vector2 originPosition;
    private Vector2 touchedAxis;
    public Vector2 TouchedAxis
    {
        get
        {
            if (touchedAxis.magnitude < radius)
                return touchedAxis.normalized / radius;
            return touchedAxis.normalized;
        }
    }

    public delegate void TouchBegin(Vector2 vec);
    public delegate void TouchMove(Vector2 vec);
    public delegate void TouchEnd();

    public event TouchBegin Begin;
    public event TouchMove Move;
    public event TouchEnd End;


    void Start()
    {
        selfTransform = this.GetComponent<RectTransform>();
        originPosition = selfTransform.anchoredPosition;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isTouched = true;
        touchedAxis = GetAxis(eventData);
        if (this.Begin != null)
            this.Begin(TouchedAxis);
    }


    void Update()
    {
        if(isTouched && touchedAxis.magnitude >= radius)
        {
            if (this.Move != null)
                this.Move(TouchedAxis);
        }

        if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)
            selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * speed;
    }

    private Vector2 GetAxis(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 >= radius)
        {
            touchAxis = touchAxis.normalized * radius;
            selfTransform.anchoredPosition = touchAxis;
        }
        return touchAxis;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isTouched = false;
        selfTransform.anchoredPosition = originPosition;
        touchedAxis = Vector2.zero;
        if (this.End != null)
            this.End();
    }

    public void OnDrag(PointerEventData eventData)
    {
        touchedAxis = GetAxis(eventData);
        if (this.Move != null)
            this.Move(TouchedAxis);
    }
}
           
/*************************************************************************
 *  FileName: JoyStickTest.cs
 *  Author: LaiZhangYin(Eagle)   Version: 1.0   Date: 6/12/2017
 * if you have some question, please call 
 *  QQ/Wechat : 782966734
 *************************************************************************/

using UnityEngine;
using System.Collections;

public class JoyStickTest : MonoBehaviour 
{
    public  JoyStick js;
    public Vector2 vec;
    public float speed = 10.0f;
    void Start()
    {
        vec = Vector2.right;
        js.Begin += Begin;
        js.Move += Move;
        js.End += End;
    }

    void Update()
    {
        transform.Translate(vec * Time.deltaTime * speed);
    }

    private void Begin(Vector2 vec)
    {

    }

    private void Move(Vector2 vec)
    {
       //規範化,避免數值過小暫停了
        this.vec = vec.normalized;
    }

    private void End()
    {

    }
}
           
/*************************************************************************
 *  FileName: JoyStickTest.cs
 *  Author: LaiZhangYin(Eagle)   Version: 1.0   Date: 6/12/2017
 * if you have some question, please call 
 *  QQ/Wechat : 782966734
 *************************************************************************/

using UnityEngine;
using System.Collections;

public class JoyStickTest : MonoBehaviour 
{
    public  JoyStick js;
    public Vector2 vec;
    public float speed = 10.0f;
    void Start()
    {
        vec = Vector2.right;
        js.Begin += Begin;
        js.Move += Move;
        js.End += End;
    }

    void Update()
    {
        transform.Translate(vec * Time.deltaTime * speed);
    }

    private void Begin(Vector2 vec)
    {

    }

    private void Move(Vector2 vec)
    {
       //規範化,避免數值過小暫停了
        this.vec = vec.normalized;
    }

    private void End()
    {

    }

    void OnDestroy()
    {
        js.Begin -= Begin;
        js.Move -= Move;
        js.End -= End;
    }
}
           

運作效果:

使用UGUI制作虛拟搖杆

繼續閱讀