武器的方向,人物和武器的翻转
人物行走处理好后,来写武器的方向操控。
来看右边的虚拟摇杆发送的信息:
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。
虽然能用,但是非常不美观,希望有大神能简化一下。