為了實現虛擬搖桿來控制移動,我用了兩個img
調了一下,讓它們看起來像一個虛擬搖桿
然后寫了個腳本,通過計算手指的位置和背景圖的位置差,來判斷里面的圖的位置
1 _pointPos = Input.GetTouch(eventData.pointerId).position; 2 _dir = _pointPos - initPosition; 3 //如果手指到虛擬鍵盤原點的位置 < 半徑r 4 if (Vector2.Distance(_pointPos, initPosition) < r) 5 { 6 //虛擬鍵跟隨手指 7 m_image.transform.position = _pointPos; 8 } 9 else 10 { 11 m_image.transform.position = initPosition + _dir.normalized * r; 12 }
然后給信息中心發消息
1 private void Update() 2 { 3 MessageCenter.SendMessage("MOVE", new KeyValues("ROLE_MOVE", _dir)); 4 }
另一個腳本監聽此消息
1 void Start () { 2 MessageCenter.AddMessageListener("MOVE",OnMove); 3 4 } 5 6 void Update () { 7 UpdateMove(); 8 } 9 10 private void UpdateMove() 11 { 12 if (_dirction != Vector2.zero) 13 { 14 this.gameObject.transform.position += new Vector3(_dirction.normalized.x, _dirction.normalized.y, 0) * Time.deltaTime * GameManager.Instance.speed; 15 } 16 } 17 18 private void OnMove(KeyValues keyValues) 19 { 20 //Debug.Log(_dirction); 21 _dirction = (Vector2)keyValues.Values; 22 }
然后是寫松開手指的回調
1 public void OnPointerUp(PointerEventData eventData) 2 { 3 Debug.Log("up" + this.name); 4 _dir = Vector2.zero; 5 //松開手指虛擬搖桿回到原點 6 m_image.transform.position = initPosition; 7 }
試了試, 成功實現了移動。
但是又出現了一個問題:這樣寫無法復用到右邊的虛擬搖桿。想了想,1.寫個父類讓兩個子類繼承,2.都發送到另一個腳本再統一發給messageCenter。不知道孰好孰壞,於是就選擇了第二種,寫了一個inputManager來管理所有的UI(好像應該叫UIManager?)
然后簡單地寫了個靜態函數:
1 public static void UISendMessage(string name, KeyValues kV) 2 { 3 MessageCenter.SendMessage(name, kV); 4 }
這樣的話代碼就改為:
1 InputManager.UISendMessage(this.name, new KeyValues("MOVE", _dir));
實驗了一下 成功運行。
都沒有寫 if(xxx == null),因為是一個人做的一個小項目,所以也就沒有去想這些了。。。