Unity - 计算相对于目标的运动矢量以制作扫射动画

问题描述 投票:0回答:1

我正在 Unity 中制作 3D 自上而下的射击游戏,但我遇到了一个问题。相机是固定的并且不旋转,因此当您按下左按钮时,它将旋转播放器并向左移动。它运行良好,但问题在于玩家瞄准时。在我的游戏中,玩家可以按住鼠标右键进行瞄准。我想在瞄准时制作扫射动画。我在动画师中创建了这个混合树:

我有两个参数:AimingWalkHorizontal 和 AimingWalkVertical。当值为 [1,0] 时,它将播放向右平移动画。

我有两个向量。一根用于移动,一根用于瞄准:

Vector3 movementVector = new Vector3(_movementVector.x, 0, _movementVector.y);
Vector3 aimingDirection = new Vector3((MouseWorldPosition - PlayerController.PlayerObj.transform.position).x, 0, (MouseWorldPosition - PlayerController.PlayerObj.transform.position).z);

我想实现这个:

我怎样才能获得这个相对运动向量以便将其提供给动画师?

PlayerController.Animator.SetFloat("AimingWalkHorizontal", /* ??? */);
PlayerController.Animator.SetFloat("AimingWalkVertical", /* ??? */);

谢谢你

c# unity-game-engine animation vector
1个回答
0
投票

我终于通过计算运动和目标矢量之间的顺时针角度解决了这个问题。比我将角度转换为标准化向量并推送给动画师。

Vector3 movementVector = new Vector3(_movementVector.x, 0, _movementVector.y).normalized;
Vector3 aimingDirection = new Vector3((MouseWorldPosition - PlayerController.PlayerObj.transform.position).x, 0, (MouseWorldPosition - PlayerController.PlayerObj.transform.position).z).normalized;

// Calculate clockwise angle between movement and aiming direction
float dotProduct = Vector3.Dot(movementVector, aimingDirection);
float crossProductMagnitude = Vector3.Cross(movementVector, aimingDirection).y;
float clockwiseAngle = Mathf.Atan2(crossProductMagnitude, dotProduct) * Mathf.Rad2Deg;

// In my game I have ability to rotate camera with middle mouse button, so I have to decrease angle by camera rotation
// If you have fixed camera rotation do not use this line
clockwiseAngle -= CameraController.Instance.CameraObj.transform.eulerAngles.y;

// Adjust the angle to be positive (0 to 360 degrees)
clockwiseAngle = (clockwiseAngle + 360) % 360;

// Convert angle to normalized vector

// Convert to radians
float radians = clockwiseAngle * Mathf.Deg2Rad;

// Calculate vector axis
float x = Mathf.Cos(radians);
float z = Mathf.Sin(radians);

// Create normalized vector
Vector3 relativeMovement = new Vector3(x, 0f, z).normalized;

// Set values to animator
PlayerController.Animator.SetFloat("AimingWalkHorizontal", relativeMovement.z * -1f);
PlayerController.Animator.SetFloat("AimingWalkVertical", relativeMovement.x);
© www.soinside.com 2019 - 2024. All rights reserved.