简单演示用Unity的ECS(实体、组件、系统)

目录

什么是ECS呢?

实体(Entity)

组件(Component)

系统(System)

如何用在Unity中使用呢?

演示:


什么是ECS呢?

其模式遵循“组合优于继承”的原则,每个基本单元都是实体,每个实体又由组件构成,每个组件仅包含数据(即在组件中没有任何方法),而系统用来处理仅用来处理数据(即系统没有任何数据,只拥有行为)。

和 Unity的 GameObject /Component 的相似之处:

  • 实体相似 GameObject
  • 组件相似 Component 的字段
  • 系统相似 Component 的方法

在Unity中被用做取代 GameObject / Component 的模式,旨在比GameObject / MonoBehaviour更容易处理大量物体。

实体(Entity)

实体ID和组件的列表,更像是容器。

组件(Component)

存储在实体中的数据,不包括处理。

实体与组件是一对多的关系,实体拥有什么能力,取决于其拥有什么组件,通过动态添/删组件来改变实体的行为。

系统(System)

用做处理数据和观察实体,就像方法一样。

如何用在Unity中使用呢?

Unity版本:

Unity2018或以上。

演示:

首先,打开 Edit > PlayerSettings > PlayerSettings 之后,将 Scripting Runtime Version(脚本运行时版本)选为 Stable (.net 4.x) 并保存。

接着在项目的 Packages 文件夹中找 manifest.json 的文件,替换为如下内容:

{
  "dependencies": {
    "com.unity.ads": "2.0.8",
    "com.unity.analytics": "3.3.2",
    "com.unity.burst": "1.1.2",
    "com.unity.collab-proxy": "1.2.16",
    "com.unity.entities": "0.1.1-preview",
    "com.unity.multiplayer-hlapi": "1.0.2",
    "com.unity.package-manager-ui": "2.1.2",
    "com.unity.purchasing": "2.0.6",
    "com.unity.rendering.hybrid": "0.1.1-preview",
    "com.unity.textmeshpro": "2.0.0",
    "com.unity.timeline": "1.0.0",
    "com.unity.xr.legacyinputhelpers": "2.0.2",
    "com.unity.modules.ai": "1.0.0",
    "com.unity.modules.animation": "1.0.0",
    "com.unity.modules.assetbundle": "1.0.0",
    "com.unity.modules.audio": "1.0.0",
    "com.unity.modules.cloth": "1.0.0",
    "com.unity.modules.director": "1.0.0",
    "com.unity.modules.imageconversion": "1.0.0",
    "com.unity.modules.imgui": "1.0.0",
    "com.unity.modules.jsonserialize": "1.0.0",
    "com.unity.modules.particlesystem": "1.0.0",
    "com.unity.modules.physics": "1.0.0",
    "com.unity.modules.physics2d": "1.0.0",
    "com.unity.modules.screencapture": "1.0.0",
    "com.unity.modules.terrain": "1.0.0",
    "com.unity.modules.terrainphysics": "1.0.0",
    "com.unity.modules.tilemap": "1.0.0",
    "com.unity.modules.ui": "1.0.0",
    "com.unity.modules.uielements": "1.0.0",
    "com.unity.modules.umbra": "1.0.0",
    "com.unity.modules.unityanalytics": "1.0.0",
    "com.unity.modules.unitywebrequest": "1.0.0",
    "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
    "com.unity.modules.unitywebrequestaudio": "1.0.0",
    "com.unity.modules.unitywebrequesttexture": "1.0.0",
    "com.unity.modules.unitywebrequestwww": "1.0.0",
    "com.unity.modules.vehicles": "1.0.0",
    "com.unity.modules.video": "1.0.0",
    "com.unity.modules.vr": "1.0.0",
    "com.unity.modules.wind": "1.0.0",
    "com.unity.modules.xr": "1.0.0"
  }
}

之后,创建 MonoBehaviour 脚本,并引入 Unity.Entities 命名空间:

using UnityEngine;
using Unity.Entities;

public struct 组件 : IComponentData //创建 Component 并实现 IComponentData 接口
{
}

public class 系统 : ComponentSystem //创建 System
{
    struct Group //创建 Group 用做组件列表
    {
        public int Length; //
    }

    [Inject] Group group;

    protected override void OnUpdate() //每帧调用
    {
        for(int i = 0; i < group.Length; i++)
        {
            //轮询 IComponentData
        }
    }
}

public class 管它叫什么呢 : MonoBehaviour
{
    //上面演示了创建组件和系统,下面演示创建实体

    //实体可以用 EntityManager 生成,或从头开始生成实体

    void Start () //这里用 EntityManager 生成
    {
       //可以用 World.Active.GetOrCreateManager 获取 EntityManager
       var entityManager = World.Active.GetOrCreateManager<EntityManager>();

       //定义实体的原型
       var sampleArchetype = entityManager.CreateArchetype(IComponentData); //

       //通过原型生成实体
       entityManager.CreateEntity(sampleArchetype);
    }
}

最后,把脚本附加到游戏对象上,并点击播放(Play)按钮。

然后打开 Window > EntityDebugger 从 Systems 列表中查找自己定义的 ComponentSystem 是否存在 

猜你喜欢

转载自blog.csdn.net/m0_46419510/article/details/112390332
今日推荐