Unity之浅析 Entity Component System (ECS)

简介: 首先放出ECS官方文档随着目前游戏对CPU性能要求的不断提升,单核高频的CPU对我们的帮助越来越有限。所以ECS(一种面向数据编程)多核心工作的方式也是大势所趋。

首先放出ECS官方文档

随着目前游戏对CPU性能要求的不断提升,单核高频的CPU对我们的帮助越来越有限。所以ECS(一种面向数据编程)多核心工作的方式也是大势所趋。

笔者对ECS的浅显理解就是

  • Entity 传统组件的集合,代替了GameObject的位置
  • Component 纯数据,不含有其他逻辑行为。;例如:旋转速度,缩放大小之类的
  • System 业务逻辑,根据组件的集合(Enitites)和纯数据(Components)编写对应的逻辑

下面是环境配置,笔者使用的版本为Unity 2018.2.0b8 (64-bit)

目前的ECS分为两种 Pure ECS 与 HyBridECS 区别主要就是Pure版的不能使用GameObjectsMonoBehaviours 下面的示例用的是Hybrid版本

工程文件下载

下载安装后把.Net版本换成4.6

img_1ce3fe67efff5d821f15d34df3ab3197.png
然后安装对应的Packages包,这是一个unity的新功能,以后安装插件会更容易管理
img_3c56aecdfa570bc6518635ee2f3ae060.png

拖拽出对应的Entity Debugge面板

img_2487c620e4bb1daddf9dd5e01ebaaeb0.png

在两个对应的模型上添加两个脚本 GameObjectEntity(Unity自带脚本,没有这个ECS系统是不会执行的,相当于向ECS中注册)与RotationPlanet(稍后讲解)

这是会在Debugge面板上看到两个物体对应的Entity

img_c60ee0a268385cb10e6188c87fc30252.png

接下来是业务执行脚本 RotationPlanetSystem

img_8fc4cf44e5906548483b3fbedb7c7c32.png

运行

img_8f86a389e4fda125a1e2dfaa4a6dfda5.png
img_c9937234a404e550a51faa3ae2009bba.gif

多数据操作(ComponentArray)

效果如下:

img_c6b42bd266fac9f52c04f7986caf0a37.gif

纯数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 纯数据
/// </summary>
public class InputComponent : MonoBehaviour
{
    public float horizontal;
    public float vertical;
}

控制所有星球的移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;

//根据指定的数值对星球进行移动控制
public class PlanetMovementSystem : ComponentSystem
{
    /// <summary>
    /// Entity 组件集合
    /// </summary>
    private struct component
    {
        public Rigidbody rigidbody;
        public InputComponent inputComponent;
    }
    /// <summary>
    /// 具体逻辑操作
    /// </summary>
    protected override void OnUpdate()
    {
        var deltaTime = Time.deltaTime;

        foreach (var entity in GetEntities<component>())//获取所有指定的Entity
        {
            var moveVector = new Vector3(entity.inputComponent.horizontal, 0, entity.inputComponent.vertical);
            var movePosition = entity.rigidbody.position + moveVector.normalized * 6 * deltaTime;

            entity.rigidbody.MovePosition(movePosition);
        }
    }
}

控制所有纯数据的数值更改

其中Inject特性在ECS features in detail中有讲解

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
public class InputSystem : ComponentSystem
{
    private struct Data
    {
        public int Length;
        public ComponentArray<InputComponent> inputComponents; //数据集合
    }
    /// <summary>
    /// Inject特性在unity启动时自动赋值合适的Value
    /// </summary>
    [Inject] private Data data;
    protected override void OnUpdate()
    {
        var horizontal =  Input.GetAxis("Horizontal");
        var vertical = Input.GetAxis("Vertical");
        
        for (int i = 0; i < data.inputComponents.Length; i++)
        {
            data.inputComponents[i].horizontal = horizontal;
            data.inputComponents[i].vertical = vertical;
        }
    }
}
相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
数据可视化 C# 图形学
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
202 0
|
6月前
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
189 0
|
前端开发 Go 图形学
Unity中查找子组件GameObject或Component的操作汇总
Unity中查找子组件GameObject或Component的操作汇总
193 0
|
图形学
Unity Particle System 制作刀光特效
Unity Particle System 制作刀光特效
536 1
Unity Particle System 制作刀光特效
|
图形学 C# vr&ar
Unity超綺麗海洋效果!「Crest Ocean System LWRP」
入门你好,我是一个悠闲的工程师。 我能做什么? 超綺麗海洋效果!它很漂亮,所以我介绍它。 太阳反射 被淹没时 水的表面 Crest is a technically advanced, feature rich ocean system targeted at PC and console platforms and Unity 2019 / LWRP 5.
|
弹性计算 Go 图形学
Unity 之 Pure版Entity Component System【ECS】 案例【GalacticConquest】解析【上】
以往没有了解过Unity ECS的小伙伴建议先看看我写过的两篇ECS文章 Unity之浅析 Entity Component System (ECS) Unity 之 Pure版Entity Component System (ECS) 官方R...
2060 0
|
弹性计算 图形学
Unity 之 Pure版Entity Component System (ECS)  官方Rotation示例解析
又有一段时间没有写博客了,真是不爽~~~ 趁着最近两天没事,赶紧补上一篇,这次开始写一篇Pure ECS版本示例解析,对上次Hybrid版本Unity之浅析 Entity Component System (ECS)的补充,使用的是官方案例的Rotation场景。
2035 0
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
231 6
|
4月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
326 5
|
3月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
180 4