unity3d Unity 3D,如何找出物体的运动相对于其旋转的方向?

xnifntxz  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(199)

我需要制作一个3d的自上而下的角色控制器,并制作动画。开始,我制作了一个角色相对于摄像头的运动代码。这个代码很好用,角色可以很好的行走和转弯。

Vector3 inputDirection = new Vector3(_input.GetAxis.x, 0, _input.GetAxis.y);

float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + _camera.rotation.eulerAngles.y;
float angle = Mathf.SmoothDampAngle(transformPlayer.eulerAngles.y, targetAngle, ref _turnVelocity, TurnSmoothTime);

transformPlayer.rotation = Quaternion.Euler(0f, angle, 0f);

Vector3 moveDirection = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
moveDirectionNormalized = moveDirection.normalized;

_characterPlayer.Move(moveDirectionNormalized * SpeedMultiplier * Time.deltaTime);

角色模型是_characterPlayer的一个子对象。如果当角色移动时,敌人进入了他的半径范围,那么玩家的模型将转向敌人,而角色自己将沿着moveDirectionNormalized走得更远。对于转向,我编写了以下代码:

if (NearestEnemyAtAttackRadius != null)
{
    Quaternion rotation = Quaternion.LookRotation(NearestEnemyAtAttackRadius.transform.position - MeshCharacter.position);

    MeshCharacter.rotation = Quaternion.RotateTowards(MeshCharacter.rotation, rotation, 800f * Time.deltaTime);
}
else
{
    MeshCharacter.localRotation = Quaternion.RotateTowards(MeshCharacter.localRotation, Quaternion.Euler(Vector3.zero), 800f * Time.deltaTime);
}

现在如果附近有敌人,我的角色会向敌人挥棒,如果没有敌人或者敌人已经离开了半径范围,那么就回到初始状态。我的问题就从这里开始了。我想添加一个动作的动画。角色有4个动画:在Animator中,我做了一个混合树(2D简单方向),4个动画。添加了2个浮点值MoveDirectionXMoveDirectionY,正确配置为所有运动位置x和位置y。如果我在MoveDirectionX中,MoveDirectionY将提供向量moveDirectionNormalized,那么它就不能正确工作。moveDirectionNormalized的值在任何方面都不依赖于我的模型的重复,如果我的角色远离敌人,他看着敌人但实际上是向后走,当他向后倾斜时,动画应该打开。但是现在moveDirectionNormalized不依赖于我的模型的重复,角色倾斜动画随机切换取决于moveDirectionNormalized。据我所知,有必要创建一个考虑模型旋转的新向量,但我不知道如何操作。
因此,我想得到一个向量,其中x -表示角色向左或向右移动的位置(从-1到1),y -表示向前移动,向后移动(也是从-1到1),并且这个向量应该考虑到玩家的旋转。此刻,在角色模型中,moveDirectionNormalized返回一个值,该值指示移动相对于世界空间的方向。我需要创建一个向量,该向量将返回相对于玩家旋转的方向。也就是说,如果角色的目光指向敌人,而角色自己从他身上撤退,我希望得到一个向量(0,-1)。如果玩家的目光指向敌人,他走到右边(我提醒你,玩家是不停地看着敌人的,也就是说,你可以绕着敌人走,角色会不停地转向他的方向),那么我想得到一个向量(1,0)

aiazj4mn

aiazj4mn1#

我不能100%肯定我理解了,但如果我理解了,这应该会有所帮助:您可以在播放器的旋转上使用Quaternion.Inverse(),并将其乘以向量。

Vector3 yourVector;
Quaternion inverse = Quaternion.Inverse([player rotation]);
return inverse * yourVector;

将四元数乘以一个向量会随四元数旋转,因此如果反转它,则会抵消播放器的旋转。

相关问题