在3D教程中,使用了观察者的模式将 Player 反向注册给 GameManager ,但是当将注册语句从 Start() 函数切换到 OnEnable() 函数中时,会发现许多位置出现了空引用的情况。
出现上述问题,是因为在 Player 向 GamaManager 注册时,需要将自身的组件提前初始化,否则则会将空的组件注册到GameManager上,从而导致很多地方出现空引用。
将初始化的函数执行也调整到 OnEnable() 函数中,并在注册语句之前执行即可。
在学习3DRPG教程中,为石头人Boss扔出的石头增添了对象池,以防在石头人扔出过多的石头导致内存溢出。
但在对象池最初的存量用完时,石头人再次扔出石头,石头的方向会出现不正常的偏移。
Debug后发现,问题原因是:在给予扔出的石头一个新的力时,石头的位置还未重置。 即,石头对自身与目标的相对位置计算发生在重置位置语句之前,导致了计算的错误。
根本原因是代码的执行逻辑出现了问题。
共有两种:
- 重载对象池出队函数,将物体生成的坐标传给出队函数,并在计算与角色相对位置之前,将石块的位置重置
- 从对象池返回一个 SetActive(false) 的对象,在外部启用,保证其在重置位置之后再计算与角色的相对位置。
两种方式各有优缺点。
前者可以不需要更改外部与对象池交互的逻辑,但是如果重构次数过多,对象池中的代码量可能会成倍增加。
后者则截然相反,有点是代码量不会改变,缺点是外部与对象池的交互逻辑改变了。