欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity Joystick 虚拟摇杆的实现

程序员文章站 2024-03-24 11:12:22
...


直接调用VirtualJoystick.cs中的公有horizontal 和 Vertical方法来获得原点中心按钮距离圆心的位置。

教学视频看本链接:

制作虚拟摇杆的视频(需要*)


先贴代码:

VirtualJoystick.cs


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

public class VirtualJoystick : MonoBehaviour , IDragHandler, IPointerDownHandler, IPointerUpHandler{
    private Image bgImg;
    private Image joystickImg;
    private Vector3 inputVector;
    private void Start() {
        bgImg = GetComponent<Image>();
        joystickImg = transform.GetChild(0).GetComponent<Image>();
        //Debug.Log(bgImg);
        //Debug.Log(joystickImg);
    }

    public virtual void OnPointerDown(PointerEventData ped)
    {
        OnDrag(ped);
    }
    public virtual void OnPointerUp(PointerEventData ped)
    {
        inputVector = Vector3.zero;
        joystickImg.rectTransform.anchoredPosition = inputVector;
    }

    public virtual void OnDrag(PointerEventData ped)
    {
        Vector2 pos;

        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform
                                                                    , ped.position
                                                                    , ped.pressEventCamera
                                                                    , out pos
                                                                   ))
        {
            pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
            pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
            pos.x = pos.x * 2 + 1;
            pos.y = pos.y * 2 - 1;
            inputVector = new Vector3(pos.x, 0, pos.y);
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
            joystickImg.rectTransform.anchoredPosition =
                new Vector3(inputVector.x * (bgImg.rectTransform.sizeDelta.x / 3), inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3), 0);
        }
    }
    public float Horizontal() {
        if (inputVector.x != 0) {
            return inputVector.x;
        }
        else{
            return Input.GetAxis("Horizontal");
        }
    }
    public float Vertical()
    {
        if (inputVector.z != 0)
        {
            return inputVector.z;
        }
        else {
           return  Input.GetAxis("Vertical");
        }
    }

}