如何使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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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