环境配置
PlayerSetting设置中确保.NET库在4.X以上
需要在Window->PackageManager中导入以下几个包
- Entites
- Mathematics
- Hybrid Render
- Jobs
- Burst
注意:Burst需要在Entites之后导入,不然会导入报错
全部导入之后没有报错就准备完毕了,没有修改什么文件之类的东西
相关脚本
说明:在ECS中属性字段跟逻辑是分开的,并且属性是写在结构体中
这里定义了一个level的属性,需要继承IComponentData
using Unity.Entities;
public struct LevelComponent : IComponentData
{
public float level;
}
相对应的逻辑System部分,需要继承ComponentSystem
using UnityEngine;
using Unity.Entities;
public class LevelUpSystem : ComponentSystem
{
protected override void OnUpdate()
{
//会自动调用这个,过滤出所有带LevelComponent组件的实体进行操作
ForEach((ref LevelComponent levelComponent) => {
levelComponent.level += 1f * Time.deltaTime;
});
}
}
总管理部分,这个脚本挂载在场景中
这里的MoveSpeedCompoent组件是另外又写的一个,跟上面方法一样,报错不会弄可以先删除掉
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;
public class Testing : MonoBehaviour
{
[SerializeField] private Mesh mesh;
[SerializeField] private Material material;
// Start is called before the first frame update
private void Start()
{
EntityManager entityManager = World.Active.GetOrCreateManager<EntityManager>();
//这里是组件管理
EntityArchetype entityArchetype = entityManager.CreateArchetype(
typeof(LevelComponent),//关卡等级组件
typeof(Position),//位置
typeof(RenderMesh),//模型显示
typeof(LocalToWorld),//
typeof(MoveSpeedComponent),//移动速度组件
typeof(Scale)
);
//XXX实体数量
NativeArray<Entity> entityArray = new NativeArray<Entity>(1000,Allocator.Temp);
//创建的同时添加组件
entityManager.CreateEntity(entityArchetype, entityArray);
//设置默认值
for (int i = 0; i < entityArray.Length; i++)
{
Entity entity = entityArray[i];
entityManager.SetComponentData(entity, new LevelComponent { level = Random.Range(10,20) });
entityManager.SetComponentData(entity, new MoveSpeedComponent { moveSpeed = Random.Range(1f,2f) });
entityManager.SetComponentData(entity, new Position { Value= new Unity.Mathematics.float3 (Random.Range(-8f,8f), Random.Range(-5f, 5f),0f)});
entityManager.SetComponentData(entity, new Scale { Value = new Unity.Mathematics.float3(0.1f, 0.1f, 0.1f) });
entityManager.SetSharedComponentData(entity, new RenderMesh {
mesh = mesh,
material = material
});
}
//释放
entityArray.Dispose();
}
}
这些弄完之后就可以运行场景了,这里我是加载了1000个Quad,FPS在80左右还是可以的,
我们可以再Windows->Analysis->Entity Debugger中查看我们生成的物体,如图,点击实体会在Inspector中显示我们添加的组件信息
遇到的问题
- 在学习别人代码的时候发现好多API都不一样了,后来查了好多资料才发现API改了,而且改的还挺勤,所以有可能以后还会改,所以遇到跟我写的一样但是报错可能就是API改了,这里发个ECS的官方文档:https://docs.unity3d.com/Packages/com.unity.entities@0.1/changelog/CHANGELOG.html
- 大量的Debug.Log会让程序变卡QAQ
- 勾选Jobs->Burst->Enable Compilation会让性能好一点(没有感觉出来)