【Unity DOTS1.0】学习之路---基础课7-10笔记

Entity Jobs接口
1.IJobEntity: 适合绝大多数情况使用
2.IJobChunk:

在这里插入图片描述

=========================================================================
通过预制体实例化Entity

namespace DOTS.DOD.LESSON3
{
    struct CubeGeneratorByPrefab : IComponentData
    {
        //用于克隆实例的Entity
        public Entity cubeEntityProtoType;
        //控制Entity数量
        public int cubeCount;
    }
    
    class CubeGeneratorByPrefabAuthoring : Singleton<CubeGeneratorByPrefabAuthoring>  //单例模板抽象类
    {
        public GameObject cubePrefab = null;
        [Range(1, 10)] public int CubeCount = 6;
        //自定义数据Baker
        class CubeBaker : Baker<CubeGeneratorByPrefabAuthoring>
        {
            public override void Bake(CubeGeneratorByPrefabAuthoring authoring)
            {
                AddComponent(GetEntity(TransformUsageFlags.Dynamic), new CubeGeneratorByPrefab   //如何将组件覆盖到游戏实体
                {
                    cubeEntityProtoType = GetEntity(authoring.cubePrefab, TransformUsageFlags.None),
                    cubeCount = authoring.CubeCount
                });
            }
        }
    }
}

同一个World只能使用一个Singleton Component,不同World可以有多个Singleton Component。

namespace DOTS.DOD.LESSON3
{
    [BurstCompile]
    //当实体的Query为空,跳过OnUpdate
    [RequireMatchingQueriesForUpdate]
    [UpdateInGroup(typeof(CreateEntitiesByPrefabSystemGroup))]
    partial struct CubeGenerateByPrefabSystem : ISystem
    {
        [BurstCompile]
        public void OnCreate(ref SystemState state)
        {
            //当CubeGeneratorByPrefab存在时,组件运行
            state.RequireForUpdate<CubeGeneratorByPrefab>();
        }
    
        [BurstCompile]
        public void OnDestroy(ref SystemState state)
        {
    
        }
    
        [BurstCompile]
        public void OnUpdate(ref SystemState state)
        {
            //获取CubeGeneratorByPrefab生成器对象
            var generator = SystemAPI.GetSingleton<CubeGeneratorByPrefab>();
            //生成NativeArray数组
            var cubes = CollectionHelper.CreateNativeArray<Entity>(generator.cubeCount, Allocator.Temp);
            //实例化实例
            state.EntityManager.Instantiate(generator.cubeEntityProtoType, cubes);
            int count = 0;
            foreach (var cube in cubes)
            {
                //添加旋转和移动数据
                state.EntityManager.AddComponentData<RotateAndMoveSpeed>(cube, new RotateAndMoveSpeed
                {
                    rotateSpeed = count*math.radians(60.0f),
                    moveSpeed = count
                });
                //设置每个Cube的初始位置
                var position = new float3((count - generator.cubeCount * 0.5f) * 1.2f, 0, 0);
                //var transform = SystemAPI.GetComponentRW<LocalTransform>(cube);
                //Aspect下的一个子集??
                var transform = SystemAPI.GetAspectRW<transformAspect>(cube);
                transform.ValueRW.Position = position;
                count++;
            }
            //销毁该临时数组
            cubes.Dispose();
            // 此System只在启动时运行一次,所以在第一次更新后关闭它。
            state.Enabled = false;
        }
    }
}

(太难了,想呕吐🤮…)

Aspect相关属性和API如下:

Unity DOTS 1.0文档

在这里插入图片描述

个人对Aspect在查询上的理解,请大佬指正!!!在这里插入图片描述

=========================================================================
Entity的随机访问

使用ComponentLookup :本质上是一个nativecontainer(数组容器??),访问方式类似数组,可以在Job工作线程中安全读取ComponentLookup,但一般并行情况情况下要避免写入ComponentLookup,除非你可以保证两个实例永远不会写入到容器中的同一索引(造成冲突),你可以使用NativeDisableParallelForRestrictionAttribute属性添加ComponentLookup的字段。例如以下这种情况:
在这里插入图片描述
补充;Job之外的随机访问
在这里插入图片描述

=========================================================================

EntityCommandBuffer

参考链接:Unity DOTS:详解 EntityCommandBuffer 的使用方法

为什么要使用ECB,原因在于Job无法直接创建销毁Entity,也无法直接添加和删除组件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

需要注意的知识点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值