• 武器的方向,人物和武器的翻转


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

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

    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。

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

  • 相关阅读:
    Nginx的启动、停止与重启
    linux环境下安装nginx步骤
    关于Nginx的负载均衡
    【Nginx】实现动静分离
    nginx中的反向代理
    Nignx的简介
    ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'orderite
    mysql出现“ You can't specify target table '表名' for update in FROM clause”解决方法
    SpringMvc的工作原理图
    【Java多线程】Java中的13个原子操作类(十九)
  • 原文地址:https://www.cnblogs.com/charsoul/p/8718993.html
Copyright © 2020-2023  润新知