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         }

 

posted @ 2025-04-07 14:37  sun_dust_shadow  阅读(24)  评论(0)    收藏  举报