Unity實(shí)現(xiàn)虛擬搖桿
本文實(shí)例為大家分享了Unity實(shí)現(xiàn)虛擬搖桿的具體代碼,供大家參考,具體內(nèi)容如下
面板上設(shè)置一些屬性,比如搖桿拖拽的距離,是否始終可視,是否限制虛擬搖桿位置(我是把虛擬搖桿限制在了屏幕的左下區(qū)域)。
使用GetDirAndLength()方法去獲得移動(dòng)的方向和長(zhǎng)度即可
using UnityEngine; /// <summary> /// 虛擬搖桿管理器 /// </summary> public class VirtualJoystickManager : MonoBehaviour { private static VirtualJoystickManager _instance; public static VirtualJoystickManager Instance { get { if (_instance == null) { _instance = FindObjectOfType<VirtualJoystickManager>(); } 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(); } } /// <summary> /// 更新顯示 /// </summary> 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); } } } /// <summary> /// 更新虛擬搖桿位置 /// </summary> private void UpdateVirtualJoystickPos() { //得到虛擬軸的中心位置 virtualJoystickCenter = ScreenToWorld(Input.mousePosition); //設(shè)置虛擬軸的位置 virtualJoystick.transform.position = virtualJoystickCenter; } /// <summary> /// 更新內(nèi)環(huán)位置 /// </summary> 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; } } /// <summary> /// 判斷是否為有效的范圍 /// </summary> /// <returns>是否為有效的范圍</returns> 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; } /// <summary> /// 屏幕坐標(biāo)轉(zhuǎn)世界坐標(biāo) /// </summary> /// <param name="screenPos">屏幕坐標(biāo)位置</param> /// <param name="camera">相機(jī)</param> /// <returns>轉(zhuǎn)換后的世界坐標(biāo)</returns> 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; } /// <summary> /// 得到運(yùn)動(dòng)的方向和長(zhǎng)度 /// </summary> /// <returns>方向和長(zhǎng)度</returns> public Vector3 GetDirAndLength() { return inside.transform.position - virtualJoystickCenter; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Unity虛擬搖桿的實(shí)現(xiàn)方法
- unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick
- unity實(shí)現(xiàn)手游虛擬搖桿
- Unity3D使用UGUI開(kāi)發(fā)原生虛擬搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
- unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng)
- Unity實(shí)現(xiàn)虛擬搖桿效果
- Unity實(shí)現(xiàn)簡(jiǎn)單的虛擬搖桿
- Unity3D基于UGUI實(shí)現(xiàn)虛擬搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
- Unity UGUI通過(guò)搖桿控制角色移動(dòng)
- Unity使用ScrollRect制作搖桿
相關(guān)文章
基于C#實(shí)現(xiàn)員工IC卡的讀寫(xiě)功能
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)讀寫(xiě)員工IC卡的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器的示例代碼
這篇文章主要介紹了C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03WPF利用ValueConverter實(shí)現(xiàn)值轉(zhuǎn)換器
值轉(zhuǎn)換器在WPF開(kāi)發(fā)中是非常常見(jiàn)的,值轉(zhuǎn)換器可以幫助我們很輕松地實(shí)現(xiàn),界面數(shù)據(jù)展示的問(wèn)題。本文將通過(guò)WPF?ValueConverter實(shí)現(xiàn)簡(jiǎn)單的值轉(zhuǎn)換器,希望對(duì)大家有所幫助2023-03-03Ruby創(chuàng)建數(shù)組方法總結(jié)
在本篇文章里小編給大家分享了關(guān)于Ruby創(chuàng)建數(shù)組方法的知識(shí)點(diǎn)內(nèi)容,對(duì)戲有興趣的朋友們學(xué)習(xí)下。2019-01-01C#中的multipart/form-data提交文件和參數(shù)
這篇文章主要介紹了C#中的multipart/form-data提交文件和參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法,涉及C#窗體事件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06