Unity 2D平台游戏AI空引用异常求助:Dusman.cs第19行报错
Unity 2D敌人AI触发NullReferenceException的解决方法
错误定位
报错信息:
NullReferenceException: Object reference not set to an instance of an object
Dusman.Update () (at Assets/Scripts/Dusman.cs:19)
错误发生在Dusman.Update()第19行的mevcutDurum.Execute();,核心原因是mevcutDurum变量未被初始化,处于null状态。
问题根源
查看Dusman类的DurumDegistir方法:
public void DurumDegistir(DusmanDurum yeniDurum) { if (mevcutDurum != null) { mevcutDurum = yeniDurum; mevcutDurum.Enter(this); } }
在Start方法中第一次调用DurumDegistir(new DusunmeDurum())时,mevcutDurum初始值为null,导致if条件不成立,代码块内的赋值和Enter调用都不会执行,最终mevcutDurum保持null,Update循环调用Execute时触发空引用错误。
修复方案
修改DurumDegistir方法,调整状态切换逻辑:
public void DurumDegistir(DusmanDurum yeniDurum) { // 如果当前状态存在,先执行退出逻辑(完善状态机生命周期) if (mevcutDurum != null) { mevcutDurum.Exit(); } // 赋值新状态并执行进入逻辑 mevcutDurum = yeniDurum; mevcutDurum.Enter(this); }
逻辑说明
- 移除错误的条件判断,确保无论当前状态是否为空,都会赋值新状态
- 增加旧状态的
Exit()调用(如果存在),符合状态机完整的生命周期流程(进入-执行-退出) - 第一次调用时,
mevcutDurum为null,跳过Exit(),直接赋值新状态并执行Enter(),保证mevcutDurum不再为null
额外检查建议
- 确保挂载
Dusman脚本的游戏对象上存在Animator组件,否则Skeleton类的MyAnimator会为null,后续调用MyAnimator.SetFloat也会触发空引用 - 检查状态类(如
DusunmeDurum、DevriyeDurum)的Enter方法是否正确接收并赋值dusman引用
内容的提问来源于stack exchange,提问作者Emir
相关产品推荐
相关产品推荐

