1. 程式人生 > >unity3d 虛擬搖桿 ugui

unity3d 虛擬搖桿 ugui

網上找了好多都嫌麻煩,谷歌了一下,完美解決。

這裡寫圖片描述

需要先建立 Canvas,如下:
這裡寫圖片描述

程式碼拖拽到 backImage裡:
JoyStick.cs

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

public class JoyStick : MonoBehaviour,IDragHandler,IPointerUpHandler,IPointerDownHandler{
    private
Image outImage; // 搖桿背景 private Image inImage; // 搖桿 private Vector3 inputVector; void Start() { outImage = GetComponent<Image>(); inImage = transform.GetChild(0).GetComponent<Image>(); } public virtual void OnDrag(PointerEventData ped) { Vector2 pos; if
(RectTransformUtility.ScreenPointToLocalPointInRectangle(outImage.rectTransform ,ped.position ,ped.pressEventCamera ,out pos)) { pos.x = (pos.x / outImage.rectTransform.sizeDelta.x); pos.y = (pos.y / outImage.rectTransform.sizeDelta.y); inputVector = new
Vector3(pos.x * 2 - 1, 0, pos.y * 2 - 1); inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector; Debug.Log(inputVector); // Move inImage inImage.rectTransform.anchoredPosition = new Vector3(inputVector.x * (outImage.rectTransform.sizeDelta.x / 2) , inputVector.z * (outImage.rectTransform.sizeDelta.y / 2)); } } // 按住搖桿 public virtual void OnPointerDown(PointerEventData ped) { OnDrag(ped); } // 鬆開搖桿 public virtual void OnPointerUp(PointerEventData ped) { inputVector = Vector3.zero; inImage.rectTransform.anchoredPosition = Vector3.zero; } // 外部呼叫的方法 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"); } public Vector3 getInputVector() { return inputVector; } }

需要用的時候,直接拖拽backImage到Player裡,然後呼叫:

...

public JoyStick joystick;
public JoyStick joystick2;

...

float h = joystick.Horizontal();
float v = joystick.Vertical();

附上一個角色子彈方向控制的指令碼:

float x = joystick2.getInputVector().x;
float z = joystick2.getInputVector().z;
Quaternion newQuaternion = Quaternion.LookRotation(new Vector3(x,0,z));
playerRigidbody.MoveRotation(newQuaternion);

注意: anchor 設定的時候 需要調整new Vector3(pos.x * 2 - 1, 0, pos.y * 2 - 1); 中的 ‘1’ ,試下把,具體原理是判斷UI的座標,沒深入研究,以後再看~

根據滑鼠點選顯示搖桿

// 按下搖桿
    public virtual void OnPointerDown(PointerEventData ped)
    {
        isMoving = true;

        // 改變out搖桿位置
        Vector2 p_pos;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_mask_limit.rectTransform
            , ped.position
            , ped.pressEventCamera
            , out p_pos))
        {
            // 這裡是為了調整位置
            m_outImage.rectTransform.anchoredPosition = p_pos 
                + new Vector2(0.5f * m_mask_limit.rectTransform.sizeDelta.x, 0.5f * m_mask_limit.rectTransform.sizeDelta.x);
        }
        // 顯示按鈕
        m_outImage.gameObject.SetActive(true);
    }

注意事項:
1、通過判斷ugui位置時需要image是正方形 或者 圓
2、pivot要設定成 0.5 0.5