這篇文章主要講解了Unity實(shí)現(xiàn)虛擬搖桿的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供哈巴河企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站制作、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為哈巴河眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
面板上設(shè)置一些屬性,比如搖桿拖拽的距離,是否始終可視,是否限制虛擬搖桿位置(我是把虛擬搖桿限制在了屏幕的左下區(qū)域)。
使用GetDirAndLength()方法去獲得移動的方向和長度即可
using UnityEngine; ////// 虛擬搖桿管理器 /// public class VirtualJoystickManager : MonoBehaviour { private static VirtualJoystickManager _instance; public static VirtualJoystickManager Instance { get { if (_instance == null) { _instance = FindObjectOfType(); } return _instance; } } [Header("是否始終可視")] public bool alwaysVisible;//是否始終可視 [Header("是否限制虛擬搖桿位置")] public bool restrictVirtualJoystickPos;//是否限制虛擬搖桿位置 [Header("虛擬搖桿物體")] [Header("==========")] public GameObject virtualJoystick;//虛擬搖桿父物體 public GameObject inside;//內(nèi)環(huán) public GameObject outside;//外環(huán) [Header("最大拖拽距離")] [Header("==========")] public float maxDragLength;//最大拖拽距離 private Vector3 virtualJoystickCenter;//虛擬軸中心 private void Update() { //如果限制虛擬軸位置并且虛擬軸位置超出了限制范圍則不進(jìn)行任何操作 if (restrictVirtualJoystickPos && JudgeIsValidRange() == false) { return; } //更新顯示 UpdateShow(); //更新虛擬搖桿位置 if (Input.GetMouseButtonDown(0)) { UpdateVirtualJoystickPos(); } else if (Input.GetMouseButtonUp(0)) { inside.transform.position = virtualJoystickCenter; } //更新內(nèi)環(huán)位置(限制拖拽范圍) if (Input.GetMouseButton(0)) { UpdateInsidePos(); } } /// /// 更新顯示 /// private void UpdateShow() { if (alwaysVisible) { inside.SetActive(true); outside.SetActive(true); } else if (alwaysVisible == false) { if (Input.GetMouseButtonDown(0)) { inside.SetActive(true); outside.SetActive(true); } if (Input.GetMouseButtonUp(0)) { inside.SetActive(false); outside.SetActive(false); } } } ////// 更新虛擬搖桿位置 /// private void UpdateVirtualJoystickPos() { //得到虛擬軸的中心位置 virtualJoystickCenter = ScreenToWorld(Input.mousePosition); //設(shè)置虛擬軸的位置 virtualJoystick.transform.position = virtualJoystickCenter; } ////// 更新內(nèi)環(huán)位置 /// private void UpdateInsidePos() { inside.transform.position = ScreenToWorld(Input.mousePosition); if (Vector3.Distance(inside.transform.position, virtualJoystickCenter) > maxDragLength) { Vector3 normalizedPos = (inside.transform.position - virtualJoystickCenter).normalized; inside.transform.position = normalizedPos * maxDragLength + virtualJoystickCenter; } } ////// 判斷是否為有效的范圍 /// ///是否為有效的范圍 private bool JudgeIsValidRange() { if (inside.activeInHierarchy) { return true; } Vector2 v = Input.mousePosition; if (v.x > Screen.width / 2 || v.x < 0) { return false; } else if (v.y > Screen.height / 2 || v.y < 0) { return false; } return true; } ////// 屏幕坐標(biāo)轉(zhuǎn)世界坐標(biāo) /// /// 屏幕坐標(biāo)位置 /// 相機(jī) ///轉(zhuǎn)換后的世界坐標(biāo) public static Vector3 ScreenToWorld(Vector3 screenPos, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 _screenPos = new Vector3(screenPos.x, screenPos.y, -camera.transform.position.z); Vector3 v = camera.ScreenToWorldPoint(_screenPos); return v; } ////// 得到運(yùn)動的方向和長度 /// ///方向和長度 public Vector3 GetDirAndLength() { return inside.transform.position - virtualJoystickCenter; } }
看完上述內(nèi)容,是不是對Unity實(shí)現(xiàn)虛擬搖桿的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。