Unity中如何为敌人AI脚本设置默认跟随的玩家对象?
报错原因
你直接在字段声明时赋值的写法会触发空引用,是因为C#脚本的字段默认初始化动作发生在脚本实例被创建的序列化阶段,此时游戏逻辑还未执行,PlayerManager的单例instance以及内部存储的player对象都还没有完成初始化,自然取不到有效值。
正确实现方案
保留Start生命周期方法里的赋值逻辑即可,同时可以保留public字段兼容手动赋值的需求:
public class EnemyController : MonoBehaviour { // 保留public字段,支持手动赋值覆盖默认逻辑 public GameObject player; Transform target; // Start is called before the first frame update void Start() { // 未手动赋值时自动调用PlayerManager的玩家对象 if (player == null) { player = PlayerManager.instance.player; } target = player.transform; } }
补充优化建议
为了避免PlayerManager初始化晚于EnemyController导致的偶发空引用,可以在Unity的「Edit -> Project Settings -> Script Execution Order」面板中,将PlayerManager的执行顺序调整到EnemyController之前,保证单例优先完成初始化。
如果需要在编辑阶段就批量给所有敌人预制体/场景内敌人填充默认值,可以写个简单的编辑器工具批量赋值,无需逐个拖拽。
内容的提问来源于stack exchange,提问作者Jef
相关产品推荐
相关产品推荐

