问题是我无法编写一个脚本,使敌人旋转以使“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
指向目标。
这将导致
如果你还想改变其他轴,你仍然可以围绕局部transform.up
轴额外旋转,例如将forward
向量“向上”翻转:
transform.LookAt(Player);transform.RotateAround(transform.position, transform.right, 90);transform.RotateAround(transform.position, transform.up, 180);
你实际上有特殊原因在FixedUpdate
中这样做而不是在Update
中吗?FixedUpdate
应该只用于与物理相关的操作。