如何异步利用Prefab实例化为一个Entity
前言
一般Prefab实例化为一个Entity的方式为利用在subScene中的Monobehaviour脚本的显示引用,再利用baker的方式,直接获取一个对应的Entity的原型。然后再用Inistacne接口,针对这个原型来实例化对应的Entity。Unity还提供了一种异步化的方式,通过prefab实例化Entity。
一、EntityPrefabReference与RequestEntityPrefabLoaded
EntityPrefabReference是一种对Entity上的Prefab的弱引用对象。利用这个对象,我们可以不拿到Prefab bake出来的Entity来获取Prefab与Entity这种关系。
RequestEntityPrefabLoaded通过名字上就可以知道,他是一种预加载Prefab的一种请求组件。查看文档可知,它请求的预加载Prefab,就是通过EntityPrefabReference引用的。
public struct RequestEntityPrefabLoaded : IComponentData, IQueryTypeParameter
{
public EntityPrefabReference Prefab;
}
二、异步步骤
1.实例化一个EntityPrefabReference 对象
直接通过new 一个EntityPrefabReference对象,然后传入Prefab对象的GameObject对象即可得到一个实例化的EntityPrefabReference 对象。
2.添加RequestEntityPrefabLoaded组件
给你想要获取对应Prefab原型的Entity上添加RequestEntityPrefabLoaded组件,组件成员变量Prefab赋值为上面构造好的EntityPrefabReference。
3.查询PrefabLoadResult组件
在上面添加了RequestEntityPrefabLoaded的Entity上,通过Update去轮询查看这个Entity上是否已经填加了PrefabLoadResult组件(通过HasComponent方法)。
一旦添加了这个组件,意味着异步的Prefab对应的Entity原型已经加载好了。通过PrefabLoadResult组件的data.PrefabRoot就可以获取到。然后再根据需求,利用Instantiate接口去实例化这个Entity原型即可(这一点跟之前一样)。
总结
利用RequestEntityPrefabLoaded组件,以及PrefabLoadResult组件,可以以异步的方式来获取对应Prefab的Entity原型。