Unity DOTS中的baking(五)prefabs

本文详细介绍了UnityDOTS中的Prefab烘焙过程,包括如何使用EntityPrefabReference进行烘焙,以及如何在运行时加载和管理entityprefabs,涉及PrefabAssetReference、RequestEntityPrefabLoaded等组件的工作原理和生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity DOTS中的baking(五)prefabs

在DOTS的baking过程中,prefabs会被烘焙成entity prefabs。entity prefabs也是一个entity,可以在运行时实例化,就像是prefab一样。我们可以使用EntityPrefabReference这个struct,将prefab注册到baker中。

首先,我们需要定义一个包含EntityPrefabReference的ECS component:

public struct Config : IComponentData
{
    public EntityPrefabReference PrefabReference;
}

然后,再定义一个authoring component,用来给entity添加Config这个component:

public class ConfigAuthoring : MonoBehaviour
{
    public GameObject Prefab;

    class Baker : Baker<ConfigAuthoring>
    {
        public override void Bake(ConfigAuthoring authoring)
        {
            var prefabEntity = new EntityPrefabReference(authoring.Prefab);

            var entity = GetEntity(TransformUsageFlags.None);
            AddComponent(entity, new Config
            {
                PrefabReference = prefabEntity,
            });
        }
    }
}

此时我们使用传入的prefab新建了一个EntityPrefabReference类型的对象。自此,prefab的baking过程就结束了。接下来,就是要如何加载这个entity prefab了。

要加载 EntityPrefabReference 引用的prefab,还需要将 RequestEntityPrefabLoaded 这个component添加到entity中。当prefab加载结束时,Unity会将PrefabLoadResult这个component添加到包含RequestEntityPrefabLoaded的同一entity中。我们可以在统一的一个system中完成这项工作:

public partial struct LoadPrefabSystem : ISystem
{
    public void OnCreate(ref SystemState state)
    {
        state.RequireForUpdate<Config>();
    }

    [BurstCompile]
    public void OnUpdate(ref SystemState state)
    {
        state.Enabled = false;

        var config = SystemAPI.GetSingleton<Config>();
        var configEntity = SystemAPI.GetSingletonEntity<Config>();

        state.EntityManager.AddComponentData(configEntity, new RequestEntityPrefabLoaded
        {
            Prefab = config.PrefabReference
        });
    }
}

最后,在使用这个prefab的system中,只有当获取到PrefabLoadResult这个component时,system才会执行:

    public partial struct SpawnSystem : ISystem
    {
        public void OnCreate(ref SystemState state)
        {
            state.RequireForUpdate<Config>();
            state.RequireForUpdate<PrefabLoadResult>();
        }

        [BurstCompile]
        public void OnUpdate(ref SystemState state)
        {
            var config = SystemAPI.GetSingleton<Config>();

            var configEntity = SystemAPI.GetSingletonEntity<Config>();
            if (!SystemAPI.HasComponent<PrefabLoadResult>(configEntity))
            {
                return;
            }

            var prefabLoadResult = SystemAPI.GetComponent<PrefabLoadResult>(configEntity);
            var entity = state.EntityManager.Instantiate(prefabLoadResult.PrefabRoot);
            var random = Random.CreateFromIndex((uint) state.GlobalSys
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值