为了实现虚拟摇杆来控制移动,我用了两个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),因为是一个人做的一个小项目,所以也就没有去想这些了。。。