如何让 LookAt 对齐 transform.up 向量而不是 transform.forward?
How to make LookAt align the transform.up vector instead of transform.forward?
问题是我无法制作一个让敌人旋转的脚本,以便 "up" 指向玩家,(我的意思是这样它会通过 transform.up) 而且我还没有找到任何可行的解决方案,(据我所知)
我正在尝试制作一款小型2D游戏,仅供朋友们玩。我尝试的是让敌人看着玩家,然后将 "z" 旋转设置为与 "x" 旋转相同,然后重置 "x" 和 "y" 旋转(因此 "up" 指向玩家)。但是敌人直接上去。
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;
}
}
所以我想要发生的是,敌人将移动到玩家身上,但旋转部分不起作用,它只是直接在空中而不是跟随玩家。我可能只是愚蠢而错过了一些简单的东西......
通过使用
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
指向目标。
这导致
如果您还想更改另一个轴,您仍然可以另外围绕局部 transform.up
轴旋转它,例如翻转 forward
向量 "upwards":
transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
transform.RotateAround(transform.position, transform.up, 180);
您在 FixedUpdate
而不是 Update
中这样做是否真的有特殊原因? FixedUpdate
应该只用于物理相关的东西。
问题是我无法制作一个让敌人旋转的脚本,以便 "up" 指向玩家,(我的意思是这样它会通过 transform.up) 而且我还没有找到任何可行的解决方案,(据我所知)
我正在尝试制作一款小型2D游戏,仅供朋友们玩。我尝试的是让敌人看着玩家,然后将 "z" 旋转设置为与 "x" 旋转相同,然后重置 "x" 和 "y" 旋转(因此 "up" 指向玩家)。但是敌人直接上去。
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;
}
}
所以我想要发生的是,敌人将移动到玩家身上,但旋转部分不起作用,它只是直接在空中而不是跟随玩家。我可能只是愚蠢而错过了一些简单的东西......
通过使用
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
指向目标。
这导致
如果您还想更改另一个轴,您仍然可以另外围绕局部 transform.up
轴旋转它,例如翻转 forward
向量 "upwards":
transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
transform.RotateAround(transform.position, transform.up, 180);
您在 FixedUpdate
而不是 Update
中这样做是否真的有特殊原因? FixedUpdate
应该只用于物理相关的东西。