zoukankan      html  css  js  c++  java
  • 武器的方向,人物和武器的翻转

        人物行走处理好后,来写武器的方向操控。

        来看右边的虚拟摇杆发送的信息:

    1  InputManager.UISendMessage(this.name, new KeyValues("MOVE", _dir));

        于是我在RoleControler.cs里加上了一个监听

    1 MessageCenter.AddMessageListener("VirtlRocker_Right", OnWeaponMove);

        并写出回调

    1     private void OnWeaponMove(KeyValues kv)
    2     {
    3         _weapon_dir = ((Vector2)kv.Values).normalized;
    4     }

        这样就获得了左边虚拟摇杆的一个标准化向量 _weapon_dir。想要让武器随右摇杆转动,只需要

    1 if (Vector2.Dot(_weapon_dir, Vector2.up) < 0)
    2                     _weapon.eulerAngles = new Vector3(0, 0, -Vector2.Angle(_weapon_dir, Vector2.right));
    3                 else
    4                     _weapon.eulerAngles = new Vector3(0, 0, Vector2.Angle(_weapon_dir, Vector2.right));

        为什么这样做呢?是因为 Vector2.Angle返回的是一个正数,我以Vector2.right为源,正方向走从0到180,到了Vector2.left后又从180到0,所以我需要判断这个数是上面的还是下面的。以Vector2.right为源是因为我的武器是这样的(别吐槽,自己画的……)

        虽然能转动,但是看着很违和。于是改进一下: 人物和武器 需要在各自对应的摇杆向左的时候,将自身图片镜面翻转(即Scale.x *= -1),向右又转回来。考虑到上面的情况,代码为:

     1     private void RoleMoveUpdate()
     2     {
     3         if (_dirction != Vector2.zero)
     4         {
     5             if (Vector2.Dot(_dirction, Vector2.right) < 0)
     6                 _body.localScale = new Vector3(-1, 1, 1);
     7             else
     8                 _body.localScale = new Vector3(1, 1, 1);
     9             this.gameObject.transform.position += new Vector3(_dirction.x, _dirction.y, 0) * Time.deltaTime * GameManager.Instance.speed;          
    10         }     
    11     }
    12 
    13     private void WeaponMoveUpdate()
    14     {
    15         if (_weapon_dir != Vector2.zero)
    16         {
    17             Vector3 tmpDir = new Vector3(0, 0, Vector2.Angle(_weapon_dir, Vector2.right));
    18             if (Vector2.Dot(_weapon_dir, Vector2.right) < 0)
    19             {
    20                 _weapon.localScale = new Vector3(-1, 1, 1);
    21                 if (Vector2.Dot(_weapon_dir, Vector2.up) < 0)
    22                     _weapon.eulerAngles = new Vector3(0, 0, (180 - Vector2.Angle(_weapon_dir, Vector2.right)));
    23                 else
    24                     _weapon.eulerAngles = new Vector3(0, 0, (Vector2.Angle(_weapon_dir, Vector2.right) - 180));
    25             }
    26             else
    27             {
    28                 _weapon.localScale = new Vector3(1, 1, 1);
    29                 if (Vector2.Dot(_weapon_dir, Vector2.up) < 0)
    30                     _weapon.eulerAngles = new Vector3(0, 0, -Vector2.Angle(_weapon_dir, Vector2.right));
    31                 else
    32                     _weapon.eulerAngles = new Vector3(0, 0, Vector2.Angle(_weapon_dir, Vector2.right));
    33             }              
    34         }
    35     }

         这里写死(-1,1,1)是因为两个都是包在空物体下的,所以可以一直保持scale。

         虽然能用,但是非常不美观,希望有大神能简化一下。

  • 相关阅读:
    各类运算符练习
    用if语句把24小时制转换成12小时制
    Android课程---优化ListView列表视图
    Android课程---关于ListView列表视图的学习
    Android课程---时间日期对话框
    Android课程---关于对话框的学习
    Android课程---用进度条改变图片透明度
    Android课程---进度条及菜单的学习
    Android课程---final关键字
    Android课程---日历选择器和时间选择器
  • 原文地址:https://www.cnblogs.com/charsoul/p/8718993.html
Copyright © 2011-2022 走看看