Unity ECS学习记录
文章平均质量分 54
Data-Oriented-Tech-Stack(Dots): 多线程式数据导向型技术堆栈。
ECS(Entites,Compoent system)
不要呵呵
我爱扒源码
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
EntitiesSample_13. CustomTransforms
0.0源码看不懂,暂时略略略。原创 2024-06-09 02:27:12 · 154 阅读 · 0 评论 -
EntitiesSample_12. FixedTimestep
这个系统标签标识这,系统在FixedStepSimulationSystemGroup这个组里面执行更新逻辑,FixedStepSimulationSystemGroup是一个固定真速度的仿真系统组。托管代码中使用World.DefaultGameObjectInjectionWorld这个接口和ecs进行通讯,查看源码可以知道,可以通过这个接口拿到ecs世界中的实体,组件 和 系统。2.给实体身上的组件设置数据时,可以使用这面的这个api设置数据。ok,就是个这,别的代码逻辑不需要在说了,之前都注释过。原创 2024-06-09 02:17:40 · 348 阅读 · 0 评论 -
EntitiesSample_11. FirstPersonController
因为相机是托管对象,需要像之前给托管对象赋值一样,函数不能打这个BurstCompile标签,主要的逻辑是获取实体,然后通过人物的位置和键鼠的数组,计算相机的位置,代码中采用了一种新的查询方式,使用ComponentLookup组件获取实体的位置组件。通过查看源码知道,Input类调用的是InputUnsafeUtility类,也就是键鼠的输入是一个非托管代码的封装,所以在ecs中可以直接调用,并且在函数中可以加上BurstCompile这个标签,下面是Input类的源码。3.控制System执行的顺序。原创 2024-06-09 01:54:07 · 444 阅读 · 0 评论 -
EntitiesSample_10. RandomSpawn
5.SpawnSystem的主要逻辑是:查找所有的NewSpawn组件的实体,删除这个组件,然后克隆新的预制体,然后调用job设置实体位置,这个调度是针对那些新生成的物体,新生成的物体都带有NewSpawn这个组件(也就是标签)2.如果需要在Job中对实体世界进行修改,那在job中需要ECB的ParallelWriter对象,通过源码可以看到出来ParallelWriter是ecb的一个内部构造体,里面包含了很多ecb的api。原创 2024-06-09 01:14:46 · 305 阅读 · 0 评论 -
EntitiesSample_9. CrossQuery
1.URPMaterialPropertyBaseColor:Unity.Rendering空间下的材质组件,该结构体拥有一个float4颜色的变量,赋值和其他的组件一样。在Chunk作业中,需要使用ArchetypeChunk chunk获取当前要操作的变量值,示例代码是这样的没什么好解释的,就是双循环判断距离。2.EntityQuery转数组。3.IJobChunk的使用。原创 2024-06-09 00:42:13 · 376 阅读 · 0 评论 -
EntitiesSample_8. GameObjectSync
1.UNITY_DISABLE_MANAGED_COMPONENTS:示例中使用这个宏,表示系统中是否需要托管组件的支持,在该示例中是需要访问托管组件的,所以这个值是false,在unity中,有的时候需要宏定义来区分代码,比如对应不同的平台编译不同的代码,通常在一下的位置添加脚本的宏定义。如果我们要在ISystem中控制托管世界中的对象,就需要找到上面创建的实体,然后获取引用设置组件的值,特别注意的是在所有的访问托管的函数中,都不可以加上爆发编译的标签。// 托管组件引用复制到非托管组件。原创 2024-06-08 23:57:30 · 527 阅读 · 0 评论 -
EntitiesSample_7. EnableableComponents
容易忽略的点是EntityQueryOptions.IgnoreComponentEnabledState,这个查询选项忽略组件的状态,都可以查询到,就像的Mono中,物体不激活,GameObject.Find是查询不到的。ValueRW的值和ValueRO的值有很大的关系也就是说,在修改组件的数据的时候,要看这个组件只读(RO)状态是不是true。1.早baker的时候使用这个api设置组件的状态 SetComponentEnabled,这个是baker类中的一个api。原创 2024-06-08 23:03:21 · 361 阅读 · 0 评论 -
EntitiesSample_6. Reparenting
其中有两个循环的简写。原创 2024-06-08 22:22:07 · 264 阅读 · 0 评论 -
EntitiesSample_5. IJobChunk
/当区块中的一个或多个实体具有禁用的查询组件时,useEnableMask参数为true。//以上是百度的翻译,我的理解是 state.Dependency 类似于函数的回调,该系统依赖于事 务调度的完成。//创建一个事务,这个事务针对于LocalTransform,RotationSpeed组件的实体。//在执行中,需要判断一下,当前的实体的组件是不是禁用状态。//(这种传递和分配状态的模式。/// 通过成员变量的句柄确定实体。/// 函数的参数是固定的。原创 2024-06-02 22:14:52 · 442 阅读 · 0 评论 -
EntitiesSample_2. IJobEntity
该示例主要说明的是: IJobEntity是实体处理事务的一个接口,在Execute函数中编写事务逻辑,通过参数对应操作的实体对象上的组件数据,然后在ISystem中的Update函数调度该事务,每帧执行,IJobEntity是处理事务的一个接口,之后还有其他的接口和该接口类型。// PostTransformMatrix是实体的一个变换矩阵数据,LocalTransform是实体本地变换,类似于Mono的Transform和Matrix.TRF(pos,rot,scale);//总累计运行的时间。原创 2024-06-02 19:41:28 · 437 阅读 · 0 评论 -
EntitiesSample_4. Prefabs
这示例内容是控制物体生成,移动,销毁。原创 2024-06-02 21:19:55 · 592 阅读 · 0 评论 -
EntitiesSample_3. Aspects
SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>()的作用是一模一样的。//查询的条件就是包含这两个组件的RefRW<LocalTransform> ,RefRO<RotationSpeed>的实体。该示例重点是解释Aspects接口的使用,定义的VerticalMovementAspect结构体,只能是只读的结构体,成员也是只读的。//此方面的实例包装单个实体的LocalTransform和RotationSpeed组件。原创 2024-06-02 20:17:44 · 352 阅读 · 0 评论 -
理解知识点和关键API
c:为了不影响主线程的性能,有时也会使用多线程处理一些事务,比如本地批量的文件处理,网络数据通讯等,但是使用线程的时候,我们无法访问Mono的对象,是因为线程本身是不安全,而Mono是安全的,所有在操作的时候会创建数据类,Mono去访问数据类,线程去访问数据类,隔断Mono与Thread线程之间的交互,如果遇到需要开启大量的线程,那程序的性能也会下降,因为多线程之间的通讯会产生大量的垃圾,然后触发多次GC,造成程序卡顿,假死等。上面代码的意思的创建一个长度500的数组,每个元素的类型是Entity。原创 2024-06-02 16:35:35 · 902 阅读 · 0 评论 -
EntitiesSample_1. MainThread
/等待ExecuteMainThread存在了之后,才会执行OnUpdate,不想Mono一样,只能通过这种方式控制OnUpdate执行的顺序,官方示例HelloCube 注释理解:这是一个旋转逻辑的脚本,场景中存在一个挂载LocalTransform, RotationSpeed脚本的对象,控制该对象旋转。//查找每一个具有RefRW, RefRO组件的实体,然后遍历,跟新位置。原创 2024-06-02 16:48:12 · 354 阅读 · 0 评论
分享