Topdown游戏中Input朝向的转化
前提
在Topdown双摇杆游戏中,我们需要将摇杆输入朝向转到摄像机空间,以实现往前走是往屏幕的前方,往后是往屏幕的后方,而不是原始的输入朝向。
我们只讨论固定视角并且player只有y轴旋转的游戏。
实现
需要进行一个Vector2的映射
1 private static Vector3 ViewSpaceToGroundSpace(float cameraAngleY, Vector2 vec) 2 { 3 float angleRad = -cameraAngleY * Mathf.Deg2Rad; 4 float cos = Mathf.Cos(angleRad); 5 float sin = Mathf.Sin(angleRad); 6 7 Vector2 rotated = new Vector2( 8 vec.x * cos - vec.y * sin, 9 vec.x * sin + vec.y * cos 10 ); 11 12 return new Vector3(rotated.x, 0f, rotated.y); 13 }
旋转和瞄准
双摇杆下我们需要区分旋转和瞄准的实现。
其中旋转的实现,鼠标和摇杆是一致的
1 private static Vector3 GetMovementInputGroundSpace(Transform camera, int horizontalActionId, int verticalActionId, float deadZone) 2 { 3 var input = InputExtension.GetAxis2D(horizontalActionId, verticalActionId); 4 if (input.sqrMagnitude > 1) input = input.normalized; 5 input = InputExtension.InputWithRadialDeadZone(input.x, input.y, deadZone); 6 return ViewUtils.ViewSpaceToGroundSpace(camera, input).normalized; 7 }
瞄准朝向的获取,鼠标相对复杂一点,需要在开火的水平面做映射
1 private static Vector3 GetAimInputInGroundSpace(GameEntity gameEntity, Camera camera, int horizontalActionId, int verticalActionId) 2 { 3 if (InputExtension.IsKeyboarding()) 4 { 5 if (InputExtension.GetButton(InputAction.Aim)) 6 { 9 var playerFirePoint = gameEntity.GetObject<WeaponFirePointTag>().Component; 10 Transform playerTransform = gameEntity.Get<Transform>(); 11 Vector3 refPosition = playerTransform.position; 13 refPosition.y = playerFirePoint.position.y; 14 var ray = camera.ScreenPointToRay(InputExtension.MousePosition); 15 //we need a plane to project the aim direction to the aiming ground : https://forum.unity.com/threads/3rd-person-look-at-mouse-script.1078358/ 16 var aimingPlane = new Plane(Vector3.up, refPosition); 17 aimingPlane.Raycast(ray, out float distance); 18 var aimDestDirection = (ray.origin + distance * ray.direction - refPosition).normalized; 19 var rotation = Quaternion.LookRotation(aimDestDirection); 20 return rotation * Vector3.forward; 21 } 22 23 return Vector3.zero; 24 } 25 26 var input = InputExtension.GetAxis2D(horizontalActionId, verticalActionId); 27 return ViewUtils.ViewSpaceToGroundSpace(camera, input).normalized; 28 }

浙公网安备 33010602011771号