c# - Unity - 当脚本附加到场景中的游戏对象时,为什么脚本的getcomponent返回null
问题描述
我创建了一个 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)
我应该提到我试图:
- 重置团结
- 删除转换并仅验证对象
- 为敌人(圆柱体)添加刚体
- 添加对撞机
除了刚体之外,所有都仍然返回 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();
}
}
}
}
解决方案
transform
尝试调用该脚本中的方法,而不是对象的真实位置。EG
EnemyMover
public class EnemyMover: MonoBehaviour
{
private Transform target;
public Transform CalculateTarget()
{
target = GetComponent<Player>().transform;
return target;
}
}
然后TargetLocator
你会打电话:
target = GetComponent<EnemyMover>().CalculateTarget();
推荐阅读
- ubuntu - 如何从我的 ubuntu 18.04 机器中删除 tomcat 9 安装?
- c++ - 以未知格式输出的二次方程求解器
- mysql - 使用 mysql 和正则表达式模式转换和提取行
- angular - 是否保证标准角度 for 循环的迭代顺序?
- mysql - 为什么我看到“server_audit:日志记录已刷新”。在我的 AWS Aurora RDS 日志中?
- javascript - 在 JavaScript 中将数字转换为带有两位小数的百万
- ios - Firebase 添加 iOS 应用程序错误 - 处理请求时出现未知错误。再试一次
- java - 如何逐步移动二维数组的每一行
- java - Paint() 方法未执行,当我调用 repaint()
- kubernetes - 使用 topologyKey 的反关联规则部署失败:kubernetes.io/hostname - 必需值:不能为空