如何使LookAt对齐transform.up向量而不是transform.forward?

3 c# artificial-intelligence rotation unity-game-engine

问题是我无法制作一个让敌人旋转的脚本,以便“向上”指向玩家(我的意思是这样它会通过transform.up到达玩家)并且我还没有找到任何有效的方法解决方案还没有,(据我所知)

我正在尝试制作一个小型2D游戏,仅供我的朋友玩。我尝试过的是让敌人看着玩家,然后将“z”旋转设置为与“x”旋转相同,然后重置“x”和“y”旋转(以便“向上”指向)在播放器上)。但敌人却径直上来。

using UnityEngine;
public class Enemy : MonoBehaviour
{
    public Transform Player;  // The Transform of the Player that you can controll
    public float MoveSpeed = 4; // How fast the enemy should go
    void FixedUpdate()
    {
        transform.LookAt(Player);
        transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.x);
        transform.rotation = Quaternion.Euler(0, 0, transform.rotation.z);
        transform.position += transform.up * MoveSpeed * Time.deltaTime;

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想要发生的是,敌人将移动到玩家身上,但旋转部分不起作用,它只是直接在空中上升,而不是跟随玩家。我可能只是愚蠢,错过了一些简单的事情......

der*_*ugo 5

通过使用

\n\n
transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.x);\ntransform.rotation = Quaternion.Euler(0, 0, transform.rotation.z);\n
Run Code Online (Sandbox Code Playgroud)\n\n

两次用新值覆盖旋转,另外将 Euler ( Vector3) 与Quaternion字段混合...transform.rotation.x不是您在 Unity 检查器中看到的围绕 - 轴的纯粹旋转。X

\n\n
\n\n

这在某种程度上取决于您enemy最终想要旋转的程度,但您可以简单地使用Transform.RotateAround

\n\n
transform.LookAt(Player);\ntransform.RotateAround(transform.position, transform.right, 90);\n
Run Code Online (Sandbox Code Playgroud)\n\n

LookAt默认情况下会导致旋转,即transform.forward指向目标,transform.right保持指向右(左右)并transform.up保持指向上(左右)。因此,您所要做的就是围绕局部 X 轴transform.right精确旋转90\xc2\xb0,因此现在transform.forward指向下方并transform.up指向目标。

\n\n

这导致

\n\n

在此输入图像描述

\n\n
\n\n

如果您还想更改另一个轴,您仍然可以另外围绕局部transform.up轴旋转它,例如forward“向上”翻转矢量:

\n\n
transform.LookAt(Player);\ntransform.RotateAround(transform.position, transform.right, 90);\ntransform.RotateAround(transform.position, transform.up, 180);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

实际上有什么特殊原因让你这样做FixedUpdate而不是 in 吗UpdateFixedUpdate应该只用于物理相关的东西。

\n