使用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;
    }
}


运行效果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值