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

时间:2019-04-15 18:48:36

标签: c# unity3d rotation artificial-intelligence

问题是我无法制作使敌人旋转的脚本,以使“ up”指向玩家,(这意味着它可以通过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;

    }
}

所以我想发生的是敌人将移动到播放器,但是旋转部分无法正常工作,它只是在空中直线上升,而不是跟随播放器。我可能只是愚蠢,错过了一些简单的事情……

1 个答案:

答案 0 :(得分:2)

使用

transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.x);
transform.rotation = Quaternion.Euler(0, 0, transform.rotation.z);

两次用新值覆盖轮换,并将Euler(Vector3)与Quaternion字段混合在一起... transform.rotation.x 不是< / strong>您在Unity检查器中看到的绕X轴的纯旋转。


这取决于您到底希望enemy到底旋转了多少,但是您可以像这样简单地使用Transform.RotateAround

transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
默认情况下,

LookAt导致旋转,使得transform.forward指向目标,transform.right保持指向右侧(ish),transform.up保持指向上方(ish) 。因此,您要做的就是绕着本地X轴transform.right精确地90°旋转,所以现在transform.forward指向下方,transform.up指向目标。

结果

enter image description here


如果您还想更改其他轴,则仍然可以另外绕着本地transform.up轴旋转它,例如,将forward向量“向上”翻转:

transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
transform.RotateAround(transform.position, transform.up, 180);

您实际上是在FixedUpdate中而不是在Update中这样做的特殊原因吗? FixedUpdate仅应用于与物理相关的内容。