Unity2019.4.0f1版本
打开PackageManager,开启preview
搜索Entities、Hybrid Renderer插件下载
ECS:Entity Component System
实体:作用唯一ID(世界唯一,ECS有世界概念,每个世界是独立的,你无法搜索到另一个世界的实体?之后学习补充)
组件:struct 一个数据结构体(必须是结构体!)
系统:class 一个继承于ComponentSystem(还有其他的)类用于从世界中根据组件筛选实体,有很多种筛选方式。
ConvertToEntity.cs脚本必须挂载到Cube上,由它驱动IConvertGameObjectToEntity接口执行,将物体转化为实体。
using Unity.Entities;/// <summary>
/// 组件,必须是结构体(创建这个脚本时 切记将class改为struct)
/// ECS特别要注意高亮颜色,结构体和类的颜色是不一样的,结构体的绿色较为暗淡,类的颜色是鲜绿色
/// </summary>
public struct PrintTestComponentData : IComponentData
{public float num;
}
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;/// <summary>
/// 将物体转化实体脚本类
/// 并且转化时进行对实体entity添加组件PrintTestComponentData
/// 同时将helloworld参数传递到组件中
///
/// 我们需要将这个物体挂载到随便一个物体上,即利用Monobehaviour周期去创建一个实体,并且这个实体带有组件PrintTestComponentData
/// 它只会创建1个
/// </summary>
public class PrintTestConvert : MonoBehaviour, IConvertGameObjectToEntity
{public float num;public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem){//dstManager.AddComponentData(entity, new PrintTestComponentData() { // num = num//});Debug.Log("创建实体;");dstManager.AddComponentData(entity, new RotationEulerXYZ());}
}
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;/// <summary>
/// 系统是class,ComponentSystem是最基础的组件系统基类
/// 使用系统从全局实体遍历筛选出带有<PrintTestComponentData>组件的实体
/// </summary>
public class PrintTestSystem : ComponentSystem
{protected override void OnUpdate(){Entities.ForEach((ref RotationEulerXYZ com, ref Translation translation) =>{//Debug.Log(com.helloworld);//Debug.Log(com.num);//com.Value = new float3(2, 2, 2);com.Value = new float3(0, 45, 0);translation.Value = new float3(3, 3, 3);});}
}
继承了ComponentSystem的系统通过ForEach从实体列表中筛选出带有RotationEulerXYZ和Translation组件的,并将它们的旋转角度和位置修改。
运行游戏后,发现Cube无法在Hierarchy面板看见了,我们只能从Entity Debugger查看实体数据。