在游戏中,避免不了要大量使用某一个物体模型,比如说,子弹,敌人这样的模型。我们当然不想一个一个手动复制,而是想通过程序来控制他们的产生和消灭。unity3d在这方面做的很好,它通过预制体(prefab)来达到这样的目的,预制体,相当于一个工具套件一样,假如我们做好了一个带AI的敌人,那么我们要大量的使用复制这样的敌人,我们就需要把它封装成预制体(prefab),然后在程序中使用Instantiate函数来克隆物体,如果敌人的生命值耗尽,让它消失,只要调用gameobject.destroy就可以了。非常简单的使用逻辑,然而,有一些需要注意的地方,如果使用不当,可能会造成一些麻烦。举个栗子:
我们要设置4秒钟出现一个敌人(敌人的AI脚本已经写好,是自动靠近玩家主动攻击的基本脚本),如果我们把prefab直接拿来做复制,那么,后果就是,第一次4秒到了,调用Instantiate,我们看到了第一个敌人,然而,第二次也就是8秒钟的时候,调用Instantiate,新出来了两个敌人,而不是一下子出来一个,第三次也就是12秒的时候调用Instantiate,一下子新出来了4个敌人,那么造成这个的原因,简单来讲,就是不能直接把instantiate脚本绑到prefab上,因为如果一旦调用这个脚本,那么产生的克隆物体将作为prefab的子物体,那么下一次调用的时候,上一次的子物体一起被克隆,就出来了2个,同理,再次调用,把前面克隆的子物体都包括进来,就是新出来了4个了。
那么如何规避这样的问题呢?其实业界一个解决方案就是,设置空物体,用空物体绑定克隆脚本,然后克隆的脚本上关联prefab对象。那么这样就会达到一次复制一个的效果了。