unity3d 虛擬搖桿 ugui
阿新 • • 發佈:2019-01-22
網上找了好多都嫌麻煩,谷歌了一下,完美解決。
需要先建立 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