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號