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

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

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

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。

 

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

posted @ 2018-04-04 19:36  charsoul  阅读(249)  评论(0编辑  收藏  举报