Unity3D基于UGUI實(shí)現(xiàn)虛擬搖桿
虛擬搖桿在移動(dòng)游戲開(kāi)發(fā)中,是很常見(jiàn)的需求,今天我們?cè)赨nity中,使用UGUI來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的虛擬搖桿功能。
1.打開(kāi)Unity,新創(chuàng)建一個(gè)UIJoystick.cs腳本,代碼如下:
using UnityEngine; using UnityEngine.EventSystems; public class UIJoystick : MonoBehaviour, IDragHandler, IEndDragHandler { /// <summary> /// 被用戶拖動(dòng)的操縱桿 /// </summary> public Transform target; /// <summary> /// 操縱桿可移動(dòng)的最大半徑 /// </summary> public float radius = 50f; /// <summary> /// 當(dāng)前操縱桿在2D空間的x,y位置 /// 搖桿按鈕的值【-1,1】之間 /// </summary> public Vector2 position; //操縱桿的RectTransform組件 private RectTransform thumb; void Start() { thumb = target.GetComponent<RectTransform>(); } /// <summary> /// 當(dāng)操縱桿被拖動(dòng)時(shí)觸發(fā) /// </summary> public void OnDrag(PointerEventData data) { //獲取搖桿的RectTransform組件,以檢測(cè)操縱桿是否在搖桿內(nèi)移動(dòng) RectTransform draggingPlane = transform as RectTransform; Vector3 mousePos; //檢查拖動(dòng)的位置是否在拖動(dòng)rect內(nèi), //然后設(shè)置全局鼠標(biāo)位置并將其分配給操縱桿 if (RectTransformUtility.ScreenPointToWorldPointInRectangle (draggingPlane, data.position, data.pressEventCamera, out mousePos)) { thumb.position = mousePos; } //觸摸向量的長(zhǎng)度(大?。? //計(jì)算操作桿的相對(duì)位置 float length = target.localPosition.magnitude; //如果操縱桿超過(guò)了搖桿的范圍,則將操縱桿設(shè)置為最大半徑 if (length > radius) { target.localPosition = Vector3.ClampMagnitude (target.localPosition, radius); } //在Inspector顯示操縱桿位置 position = target.localPosition; //將操縱桿相對(duì)位置映射到【-1,1】之間 position = position / radius * Mathf.InverseLerp (radius, 2, 1); } /// <summary> /// 當(dāng)操縱桿結(jié)束拖動(dòng)時(shí)觸發(fā) /// </summary> public void OnEndDrag(PointerEventData data) { //拖拽結(jié)束,將操縱桿恢復(fù)到默認(rèn)位置 position = Vector2.zero; target.position = transform.position; } }
2.如圖創(chuàng)建UGUI,所用資源可在網(wǎng)上自行下載。
效果圖如下:
3.打包運(yùn)行即可。這樣一個(gè)簡(jiǎn)單的虛擬搖桿就實(shí)現(xiàn)了。
下面是對(duì)以上虛擬搖桿代碼的擴(kuò)展(ps:只是多了一些事件,便于其他腳本訪問(wèn)使用)廢話不多說(shuō)來(lái)代碼了
using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; // // Joystick component for controlling player movement and actions using Unity UI events. // There can be multiple joysticks on the screen at the same time, implementing different callbacks. // public class UIJoystick : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { /// /// Callback triggered when joystick starts moving by user input. /// public event Action onDragBegin; /// /// Callback triggered when joystick is moving or hold down. /// public event Action onDrag; /// /// Callback triggered when joystick input is being released. /// public event Action onDragEnd; /// /// The target object i.e. jostick thumb being dragged by the user. /// public Transform target; /// /// Maximum radius for the target object to be moved in distance from the center. /// public float radius = 50f; /// /// Current position of the target object on the x and y axis in 2D space. /// Values are calculated in the range of [-1, 1] translated to left/down right/up. /// public Vector2 position; //keeping track of current drag state private bool isDragging = false; //reference to thumb being dragged around private RectTransform thumb; //initialize variables void Start() { thumb = target.GetComponent(); //in the editor, disable input received by joystick graphics: //we want them to be visible but not receive or block any input #if UNITY_EDITOR Graphic[] graphics = GetComponentsInChildren(); // for(int i = 0; i < graphics.Length; i++) // graphics[i].raycastTarget = false; #endif } /// /// Event fired by UI Eventsystem on drag start. /// public void OnBeginDrag(PointerEventData data) { isDragging = true; if(onDragBegin != null) onDragBegin(); } /// /// Event fired by UI Eventsystem on drag. /// public void OnDrag(PointerEventData data) { //get RectTransforms of involved components RectTransform draggingPlane = transform as RectTransform; Vector3 mousePos; //check whether the dragged position is inside the dragging rect, //then set global mouse position and assign it to the joystick thumb if (RectTransformUtility.ScreenPointToWorldPointInRectangle(draggingPlane, data.position, data.pressEventCamera, out mousePos)) { thumb.position = mousePos; } //length of the touch vector (magnitude) //calculated from the relative position of the joystick thumb float length = target.localPosition.magnitude; //if the thumb leaves the joystick's boundaries, //clamp it to the max radius if (length > radius) { target.localPosition = Vector3.ClampMagnitude(target.localPosition, radius); } //set the Vector2 thumb position based on the actual sprite position position = target.localPosition; //smoothly lerps the Vector2 thumb position based on the old positions position = position / radius * Mathf.InverseLerp(radius, 2, 1); } //set joystick thumb position to drag position each frame void Update() { //in the editor the joystick position does not move, we have to simulate it //mirror player input to joystick position and calculate thumb position from that #if UNITY_EDITOR target.localPosition = position * radius; target.localPosition = Vector3.ClampMagnitude(target.localPosition, radius); #endif //check for actual drag state and fire callback. We are doing this in Update(), //not OnDrag, because OnDrag is only called when the joystick is moving. But we //actually want to keep moving the player even though the jostick is being hold down if(isDragging && onDrag != null) onDrag(position); } /// /// Event fired by UI Eventsystem on drag end. /// public void OnEndDrag(PointerEventData data) { //we aren't dragging anymore, reset to default position position = Vector2.zero; target.position = transform.position; //set dragging to false and fire callback isDragging = false; if (onDragEnd != null) onDragEnd(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# FTP上傳文件實(shí)例代碼(簡(jiǎn)易版)
下面小編就為大家分享一篇c# FTP上傳文件的實(shí)例代碼,超簡(jiǎn)單哦~希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,2017-12-12100行C#代碼實(shí)現(xiàn)經(jīng)典掃雷游戲
這篇文章主要為大家詳細(xì)介紹了如何用100行C#代碼實(shí)現(xiàn)經(jīng)典的掃雷游戲,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn)
這篇文章主要介紹了詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn),對(duì)泛型的支持時(shí)C#語(yǔ)言中的重要特性,需要的朋友可以參考下2016-02-02C#實(shí)現(xiàn)漢字轉(zhuǎn)換為拼音縮寫(xiě)的代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)漢字轉(zhuǎn)換為拼音縮寫(xiě)的代碼,感興趣的小伙伴們可以參考一下2016-07-07