在DOTS中实例化Prefab的方法
前言
实例化Prefab的方法常规方法:
1.利用Baker的方式,以及getEntity方法,将prefab转化为一个对应的Entity原型,再利用EntityManager或ECB的Instantiate方法实例化这个Entity原型得到对应Prefab的实例化(其实是Entity对象)。
2.利用EntityPrefabReference获取Entity上Prefab引用,然后利用RequestEntityPrefabLoaded异步加载,PrefabLoadResult获取这个Prefab的对应Entity原型,同上再利用Instantiate方法实例化。
除了以上方法,本文介绍另外两种方法实例化Prefab。
一、利用托管的ECS模式实例化托管的Prefab
1.在Component对象中存放托管对象(因此此Component为托管组件)
2.利用SystemBase(托管的System),访问上面的托管组件。
3.利用GameObject.Instantiate对托管组件里面的GameObject进行实例化
这种方式与传统的monobehaviour方式差不多,只是利用了ECS框架,做了一层包装。
二、通过脚本动态创建一个Entity
利用Prefab身上的数据信息,完全通过脚本去构造一个Entity,及对应的Entity组件去组合出一个与Prefab转换后一样组合的Entity。
因为需要渲染,而渲染组件的添加方式,与普通组件不同。
需要借助RenderMeshUtility提供的方法。
其他特殊的组件也都是类似的方式来添加特殊组件,这样就能动态组合组件来创建一个你想要的Entity。
注意:不过RenderMeshUtility的方法为一个主线程方法,意味着不能在job这样去拼装一个可渲染的Entity出来。可以在主线程(system中)拼装一个Entity,把他当作原型来传递到Job中,再利用ECB的Instantiate来高效克隆大量此类Entity。
总结
第一种方式,只是一种可能的ECS架构下的实例化方法。
第二种方式,比较高级,但是用起来需要手动去创建所有相关的组件,更加灵活。但对于特殊的组件需要了解其添加方法来组合。