一般地,虛擬搖桿是放在UI層的。
所以先在Canvas建立一個空對象(這里被命名成MoveController),再在空對象里面放一個作為搖桿圖片的Image。
然后通過覆蓋重寫UnityEngine.UI的ScrollRect成一個新的腳本,加載到Image對象上。
腳本代碼:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 using UnityEngine.EventSystems; 6 7 public class MoveController : ScrollRect{ 8 float mMaxRadius; 9 public bool ifmove; 10 public Vector2 moveDelta = new Vector2(); 11 12 protected override void Start() 13 { 14 base.Start(); 15 //計算搖桿塊的半徑 = 搖桿的寬的一半 16 mMaxRadius = content.sizeDelta.x * 0.5f; 17 } 18 19 //拖動時 20 public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData) 21 { 22 base.OnDrag(eventData); 23 24 var contentPostion = this.content.anchoredPosition; 25 //如果超出搖桿范圍 26 if (contentPostion.magnitude > mMaxRadius) 27 { 28 contentPostion = contentPostion.normalized * mMaxRadius; 29 SetContentAnchoredPosition(contentPostion); 30 } 31 //獲取拖動的delta值 (-1<DeltaX<1,-1<DeltaY<1) 32 moveDelta.x = contentPostion.x/ mMaxRadius; 33 moveDelta.y = contentPostion.y/ mMaxRadius; 34 //表示正在移動搖桿 35 ifmove = true; 36 } 37 38 public void Update() 39 { 40 //,,,,,,, 41 //可根據moveDelta值做某些事情 42 } 43 44 //當結束拖動時 45 public override void OnEndDrag(PointerEventData eventData) 46 { 47 base.OnEndDrag(eventData); 48 49 moveDelta.x = 0; 50 moveDelta.y = 0; 51 //表示停止移動搖桿 52 ifmove = false; 53 //重置位置 54 SetContentAnchoredPosition(Vector3.zero); 55 } 56 }
在Unity面板調好腳本屬性(如下圖示例),然后將Image拖到腳本的Content屬性里
我們可能還需要額外的公開變量放在MoveController里面,以便在Unity面板調用調試。
但是由於MoveController腳本是覆蓋於ScrollRect的,無論你在MoveController腳本里寫多少公開的成員變量。
在Unity的面板顯示的永遠是ScrollView的面板。
這時候可以額外寫多一個輔助腳本,間接訪問MoveController,從而讓公開變量可以在面板調試。
(如下圖的MoveController_CallBack示例)