个人技术分享


一.ECS简介

ECS全称 (Entity Component System).即(E:实体 C:组件 S:系统).
实际上即是数据方法分离.数据放在组件里,具体实现放在系统里.组件挂载在实体上.
为了让大家快速了解,本次介绍是以下内容:
在这里插入图片描述

下面举个简单的的例子:

二.基本操作实例

1.创建数据组件,继承IConponentData接口
在这里插入图片描述

2.系统组件创建一个系统继承ComponentSystem
在这里插入图片描述

3.创建一个中转组件,这样我们就可以将此脚本挂在物体上(比如一个Cube),
这个脚本生成PrintComponentData1并挂在物体上.
此时该物体刚成为一个实体
在这里插入图片描述

4.运行后实体在编辑器场景列表中的Hierarchy中是看不到的
不过我们可以看到打印.我们需要使用场景查看组件来查看

三.实体查看组件

通过菜单栏Windows > Analysis > Entity Debugger
在这里插入图片描述

在这个列表中可以看到正在运行的物体及系统
在这里插入图片描述

四.位置实体修改

在这里插入图片描述

此设置后,挂载ConterToEnitiy组件的位置将被设置为 1,1,1,相当于Position

五.旋转实体

1.创建该脚本挂载物体上
在这里插入图片描述

2.创建该脚本,即可通过Foreach的方式,找到所有RotationEulerXYZ的脚本进行旋转
在这里插入图片描述
在这里插入图片描述

六.了解原有属性

通过可以查看视图 > 对象浏览器,发现我们的Transform是包含了很多冗余的内容,其实并不一定会用到.
在这里插入图片描述
在这里插入图片描述

七.禁止自动创建

系统在程序中即使不挂载也会自动运行,下面介绍一个系统特性.
使用DisableAutoCreation即可禁止自动运行.
在这里插入图片描述

八.动态实例化

1.创建ECS预制体,挂载以上两个插件
在这里插入图片描述

2.编写代码
在这里插入图片描述

using Unity.Entities;
using UnityEngine;
public class ECSPrefabCreator : MonoBehaviour
{
    public GameObject cube;
    // Start is called before the first frame update
    void Start()
    {
        //对于Cube的设置
        GameObjectConversionSettings tempSettings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
        Entity tempEntityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(cube, tempSettings);
        //获取全局物体管理器
        EntityManager tempEntityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
        //物体实例化
        Entity tempCube = tempEntityManager.Instantiate(tempEntityPrefab);
    }
}

3.挂载脚本
在这里插入图片描述

4.修改位置
在这里插入图片描述

Translation tempTranslation = new Translation();
for (int i = 0; i < sum; i++)
{
	for (int j = 0; j < sum; j++){
		//物体实例化
		Entity tempCube = tempEntityManager.Instantiate(tempEntityPrefab);
		//设置位移
		tempTranslation.Value.x += interval;
		tempEntityManager.SetComponentData(tempCube, tempTranslation);
	}
	//设置位移
	tempTranslation.Value.x = 0;
	//设置位移
	tempTranslation.Value.y += interval;
}