【发布时间】:2021-05-30 23:20:48
【问题描述】:
我创建了一个 TileMap。我的敌人是一个简单的圆柱体,附加了“EnemyMover.cs”脚本,并且在按下播放之前位于场景(层次结构)中。 (运行时不实例化)
在一个单独的对象上,我有一个“TargetLocator”脚本,它在运行时通过单击地图上的图块实例化时尝试利用 GetComponent 来查找圆柱体脚本组件。
public class TargetLocator : MonoBehaviour
{
[SerializeField] private Transform weapon;
private Transform target;
void Start()
{
target = GetComponent<EnemyMover>().transform;
}
void Update()
{
AimWeapon();
}
void AimWeapon()
{
weapon.LookAt(target);
}
}
错误:
NullReferenceException:对象引用未设置为对象的实例 TargetLocator.Start()(在 Assets/Towers/TargetLocator.cs:12)
我应该提到我已经尝试过:
- 重置 Unity
- 移除转换并仅验证对象
- 为敌人(圆柱体)添加刚体
- 添加对撞机
除了刚体之外,所有都仍然返回 null,但这会导致项目从地板上掉下来,仍然不会瞄准敌人。
public class EnemyMover : MonoBehaviour
{
[SerializeField] private List<Waypoint> path = new List<Waypoint>();
[SerializeField] [Range(0f, 5f)] private float speed = 1f;
void Start()
{
StartCoroutine(FollowPath());
}
IEnumerator FollowPath()
{
foreach (Waypoint waypoint in path)
{
Vector3 startPos = transform.position;
Vector3 endPos = waypoint.transform.position;
float travelPercent = 0f;
// todo reintroduce when object can face
// transform.LookAt(endPos);
while (travelPercent < 1f)
{
travelPercent += Time.deltaTime * speed;
transform.position = Vector3.Lerp(startPos, endPos, travelPercent);
yield return new WaitForEndOfFrame();
}
}
}
}
【问题讨论】:
-
可能是一个简单的脚本执行顺序问题?要快速确认,您可以尝试在您的
AimWeapon方法中将weapon.LookAt(target);更改为weapon.LookAt(GetComponent<EnemyMover>().transform);。