ECS初步了解

1 篇文章 0 订阅

环境配置

PlayerSetting设置中确保.NET库在4.X以上

需要在Window->PackageManager中导入以下几个包

  1. Entites
  2. Mathematics
  3. Hybrid Render
  4. Jobs
  5. 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中显示我们添加的组件信息

 


遇到的问题

  1. 在学习别人代码的时候发现好多API都不一样了,后来查了好多资料才发现API改了,而且改的还挺勤,所以有可能以后还会改,所以遇到跟我写的一样但是报错可能就是API改了,这里发个ECS的官方文档:https://docs.unity3d.com/Packages/com.unity.entities@0.1/changelog/CHANGELOG.html
  2. 大量的Debug.Log会让程序变卡QAQ
  3. 勾选Jobs->Burst->Enable Compilation会让性能好一点(没有感觉出来)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值