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

问题是我无法编写一个脚本,使敌人旋转以使“up”指向玩家(我的意思是让它通过transform.up接近玩家)。到目前为止,我还没有找到任何有效的解决方案(据我所知)。

我正在尝试制作一个小型2D游戏,仅供我的朋友们玩。我尝试过让敌人看向玩家,然后将“z”轴旋转设置为与“x”轴旋转相同,之后重置“x”和“y”轴旋转(这样“up”就指向玩家)。但敌人只是直线向上移动。

using UnityEngine;public class Enemy : MonoBehaviour{    public Transform Player;  // 你可以控制的玩家的Transform    public float MoveSpeed = 4; // 敌人移动的速度    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;    }}

所以我希望发生的情况是敌人会移动到玩家那里,但旋转部分不起作用,它只是直线向上飞,而不是跟随玩家。我可能只是太笨了,错过了什么简单的东西…


回答:

通过使用

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

这两次你都覆盖了旋转值,并且混合使用了欧拉角(Vector3)和Quaternion字段… transform.rotation.x并不是你在Unity检查器中看到的纯粹围绕X轴的旋转。


这在某种程度上取决于你最终希望enemy如何旋转,但你可以简单地使用Transform.RotateAround,如

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

LookAt默认会导致旋转,使transform.forward指向目标,transform.right保持指向右侧(差不多),transform.up保持指向上方(差不多)。所以你需要做的就是围绕那个局部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应该只用于与物理相关的操作。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注