zoukankan      html  css  js  c++  java
  • 实现虚拟摇杆的移动

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

  • 相关阅读:
    Linux命令笔记
    Linux服务安装集合(1)
    浅谈GIT之通讯协议
    浅谈GIT之底层对象理解
    友情链接
    当黑客被抓是种怎样的体验?
    PHP 中 include 和 require 的区别详解
    论假如有一台无限算力的主机
    msf渗透安卓手机
    aws ec2 安装Elastic search 7.2.0 kibana 并配置 hanlp 分词插件
  • 原文地址:https://www.cnblogs.com/charsoul/p/8697112.html
Copyright © 2011-2022 走看看