DOTS-StreamingSamples是Unity官方的DOTS系列案例之一,目前还处于开发阶段。对于Unity未来的编程模式来说,DOTS一定是趋势。另外由于DOTS良好的多线程能力,所以很适合做资源加载方面的案例。所以这次先以DOTS-StreamingSamples来上手熟悉一下DOTS以及Streaming。

项目克隆

项目地址是https://github.com/Unity-Technologies/DOTS-StreamingSamples.git
目前的版本是:

使用git Clone以后在本地使用Unity打开。项目结构如下:

主要代码结构

使用编辑器打开,我这里用的是Rider,在Assets/Scripts下面是主要的脚本,不多,只有三个。
分别是:

  1. ProceduralScatter:Tile的内部逻辑
  2. ProceduralScatterAuthoring:Entity实体和mono转换逻辑
  3. TrivialScatterSystem:System处理Tile逻辑

使用时,会将Authoring挂载到GameObject上,作为程序的实体输入。进入系统后TrivialScatterSystem会先处理Tile逻辑,ProceduralScatter则后处理Tile内逻辑。最终显示出来想要的效果。

ProceduralScatterAuthoring

为了理解方便,我们先从ProceduralScatterAuthoring开始,以下是具体实现:

Data是基本数据,用来在面板上指定预制体和初始化所需参数。

public struct Data
{  
    public GameObject Prefab;  //待实例的物体名称
    public float ScatterRadius;  //物体半径
    public float3 PlacementOffset;  //物体实例时的偏移
}  

Convert方法和DeclareReferencedPrefabs将数据推入System中

public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)

entity为实体,
dstManager为实例管理者,
conversionSystem为接收实体的System

public void DeclareReferencedPrefabs(List<GameObject> referencedPrefabs)

referencedPrefabs为待使用的实体引用(可以供System在场景中显示的物体列表)

TrivialScatterSystem

TrivialScatterSystem是系统中处理Tile的地方。

JobComponentSystem的书写风格沿用MonoBehaviour,脚本内逻辑如下:
1. OnCreate() 中对各个变量进行初始化
2. OnUpdate(JobHandle inputDeps)中会在每次循环时进行更新处理
3. 一般在处理过程中会调用继承Job接口的结构体,执行结构体内的Execute()逻辑
4. OnUpdate提供一个JobHandle参数并且最终返回一个JobHandle,这个参数可以作为在OnUpdate内部链接多个Job的一个主线。同时也是多个OnUpdate自动串联的依据。