沙盘引擎 (SEngine)

创意诞生沙盘世界,不止如此想象!

用户工具

站点工具


侧边栏

scripting:extend:issue

📚 脚本问题及规范事项

本文将记录目前已知或可能出现的脚本问题,以及脚本开发阶段的相关规范事项

如果开发过程中出现了问题,可以参考本文所说明的内容,或者反馈给开发组跟进。

📒 对象销毁后,引用仍然存在

在一些情况下,我们可能习惯性将某些对象引用到变量中(主要针对Entity类)

这样虽然可能为开发阶段带来方便,但是也可能会引起一些小的隐患。

let chara = Character.Create(...);
if(chara) chara.Remove();
 
DLog(chara); //结果不为null

根据上方的代码示例,一个有点奇怪的问题就出现了,明明角色对象已经被Remove()销毁,为什么仍然可以输出chara变量?并且其中的值基本都是正常的。

这是由于GC(垃圾处理)机制并非实时的,虽然此时已经Remove了对象,但是let chara对其的引用是仍然存在的。

这时虽然可以正常访问chara变量,但实际上如果继续操作对象将会产生提示报错。*

如果希望避免这类问题,应该在判断非null的基础上,额外进行合法化(IsValid())的判定

let chara = Character.Create(...);
if(chara) chara.Remove();
 
DLog(chara); //结果不为null
if(chara != null) DLog(chara.IsValid()); //结果返回false

聪明的你应该已经看出来,关键在于entity.IsValid()方法,这可以用来判断一个对象是否是真实存在的,返回false则表示对象已经销毁,只是GC没来得及清理。

总结:对于Entity类型的【引用】对象,判断是否存在时不仅要判断null,同时也要判断不为空时entity.IsValid()是否存在。

scripting/extend/issue.txt · 最后更改: 2023/09/09 10:38 由 bibiboxs