Unity 虛擬搖桿的實現


 一般地,虛擬搖桿是放在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示例)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM