
ECS
两水先木示
有时候,你不知不觉就完成了一个BUG!
展开
-
【Unity3D】利用IJob、Burst优化处理切割物体
麻烦的地方是所有List都要改成NativeArray,所有Dictionary都要改成NativeHashMap,以及不能传递GameObject,Transform等,也就是不能有任何的引用类型对象出现在继承了IJob接口的脚本,而且CutJob是一个struct结构体。使用Job、Burst会将切割数据处理放到一个非主线程处理,并行加速计算。原创 2025-01-11 22:24:17 · 367 阅读 · 0 评论 -
【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体
场景上创建一个Cube和LineRenderer(注意Line的位置要设置到(0,0,0) 如下图 摄像机保持位置(0,1,-10))利用如下代码,生成一个Texture3D资源,它只能脚本生成,是一个32*32*32的立方体,导出路径记得改下,不然报错。PackageManager下载Burst插件 如果有搜到Jobs也一同下载,我的版本搜不到Jobs插件。新建一个空物体Jobs,挂载脚本JobsTest.cs。版本:Unity2019.4.0f1。原创 2024-12-26 01:53:43 · 795 阅读 · 0 评论 -
【Unity3D】ECS入门学习(十三)Unity Physics
搜索:Unity Physics创建球体预制体如下脚本设置: 二、ECS 物理 射线检测代码只创建一个球体,且球体设置为静态的物体。使用Job Burst优化代码如下:注意:不能将BuildPhysicsWorld、CollisionWorld直接传递进Job类,而是将PhysicsWorld传入,使用NativeArray缓存射线检测到的刚体数组,而不是实体。原创 2024-12-29 17:24:38 · 657 阅读 · 0 评论 -
【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor
IJob:开启单个线程进行计算,线程内不允许对同一个数据进行操作,也就是如果你想用多个IJob分别计算,将其结果存储到同一个NativeArray数组是不允许的,所以不要这样做,如下例子就是反面教材,应该直接用一个IJob去进行for循环,将结果存储到传入的NativeArray。IJobParallelFor:进行并行计算移动物体的位置信息(帧数在35左右)或者并发与并行兼容的,允许并行操作情况下才会进行并行。原创 2024-12-29 15:04:46 · 477 阅读 · 0 评论 -
【Unity3D】ECS入门学习(十一)ComponentSystem、JobComponentSystem
ScheduleParallel:仅能获取局部成员,可以读取实体,但不能修改实体,并且可读数据只允许存储到WithReadOnly(xxx)方法标记的只读变量内。JobComponentSystem:仅支持多线程,不支持主线程,可以使用扩展方法,并且重写的方法与其他都不同,它需要一个JobHandle返回值。ComponentSystem:仅支持主线程执行,不支持多线程,并且无法使用SystemBase介绍的扩展方法。Schedule:仅能获取局部成员,可修改实体。【新开一个后台线程执行】原创 2024-12-29 00:02:22 · 596 阅读 · 0 评论 -
【Unity3D】ECS入门学习(十)NativeContainer、EntityCommandBuffer、CompleteDependency
当前的lambda表达式在主线程执行,并且禁用Burst,让你可以在里面对entity进行架构的改变。不过,为了效率,尽量使用EntityCommandBuffer,而不是使用这个。为保证数据在多线程下的安全准确性,需要使用[NativeContainer]修饰的存储结构类来定义变量NativeArray 数组。AddComponent(entity, component) 追加一个针对实体进行添加组件操作放入实体指令缓存器。不正确的指针使用可能导致应用程序中出现细微的错误、不稳定和崩溃)原创 2024-12-28 22:08:41 · 446 阅读 · 0 评论 -
【Unity3D】ECS入门学习(九)SystemBase
EntityQueryOptions.FilterWriteGroup:筛选带[WriteGroup(typeof(xxx))特性的组件。EntityQueryOptions.IncludeDisabled:具有Disabled(已禁用)组件的实体。ForEach方法筛选,传递一个有参委托函数进去,参数ref xxx组件类(可填多个)代表筛选条件。WithSharedComponentFilter:筛选共享组件(指定特定数据)WithNone: 筛选出不带某组件的。WithAny: || 形式筛选组件。原创 2024-12-28 19:03:55 · 695 阅读 · 0 评论 -
【Unity3D】ECS入门学习(八)块组件 ArchetypeChunk
全局唯一组件,修改数值后不会产生新的组件,而是全部实体的块组件内容都同步变化。修改其中一个Chunk对象的值其他实体的Chunk组件也会同步修改。原创 2024-12-28 12:40:42 · 338 阅读 · 0 评论 -
【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData
使用EntityManager对象GetBuffer(array[0])获取动态缓存区对象,它是一个列表,可以分别对它进行索引获取值输出,插入,遍历等操作。使用AddBuffer(entity)添加缓存区组件,返回的是一个动态缓存区对象正常通过query的方式查询获取组件的实体数组,我们只有1个所以直接取array[0]实体对象,组件继承于IBufferElementData,可以让一个实体拥有多个相同的组件。原创 2024-12-27 22:43:33 · 712 阅读 · 0 评论 -
【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
当需要获知组件是否被销毁时,ECS是没有回调告知的,因此可以将组件继承于ISystemStateComponentData接口,这样即使组件的实体被销毁了,该组件本身是不会消失的,所以可以通过在组件实体销毁后,去设置状态组件的数据来标记为已销毁状态,从而得知该组件的实体已销毁。原创 2024-12-27 22:02:47 · 398 阅读 · 0 评论 -
【Unity3D】ECS入门学习(五)共享组件 ISharedComponentData
共享组件使用AddSharedComponentData接口添加、SetSharedComponentData设置、GetSharedComponentData获取。仅有index=0的被修改为5,另一个不会,也就是说修改共享组件会生成一个新的组件,能让共享组件发挥作用就是不要修改内容,这样才会保持使用同一个。运行测试会发现如下图。原创 2024-12-27 16:47:32 · 430 阅读 · 0 评论 -
【Unity3D】ECS入门学习(四)World、System、SystemGroup、Entity
GenerateAuthoringComponent]特性:将组件转变成可以类似Monobehaviour一样挂载到物体身上,实际上就是辅助创建那个预制体实体时自动帮你把这个挂载的组件添加到实体去。以下代码有:实体(创建、销毁、查询、实例化)、实体数组(创建、销毁、查询)、组件(添加、移除、查询、赋值操作)[DisableAutoCreation]特性是阻止生成系统实例,测试发现系统仍然已经创建了,不满足需求。假设A世界已有A系统,如果从B世界创建A系统会导致A世界的A系统销毁。原创 2024-12-27 15:57:39 · 555 阅读 · 0 评论 -
【Unity3D】ECS入门学习(三)JobComponentSystem、Burst编译、GPUInstancing提高FPS
【代码】【Unity3D】ECS入门学习(三)JobComponentSystem、Burst编译、GPUInstancing提高FPS。原创 2024-12-27 14:05:21 · 166 阅读 · 0 评论 -
【Unity3D】ECS入门学习(二)实例化预制体
注意:如果发现位置没生效,那肯定是有ComponentSystem获取到了实体并持续修改位置。如下代码,让系统不生效即可,加上[DisableAutoCreation]特性。创建Cube预制体,挂载脚本如下。创建空物体挂载脚本如下。原创 2024-12-27 11:51:40 · 461 阅读 · 0 评论 -
【Unity3D】ECS入门学习(一)导入及基础学习
继承了ComponentSystem的系统通过ForEach从实体列表中筛选出带有RotationEulerXYZ和Translation组件的,并将它们的旋转角度和位置修改。系统:class 一个继承于ComponentSystem(还有其他的)类用于从世界中根据组件筛选实体,有很多种筛选方式。运行游戏后,发现Cube无法在Hierarchy面板看见了,我们只能从Entity Debugger查看实体数据。实体:作用唯一ID(世界唯一,ECS有世界概念,每个世界是独立的,你无法搜索到另一个世界的实体?原创 2024-12-27 00:44:52 · 533 阅读 · 0 评论