Unity3D:ECS架构详解

前言

Unity3D是目前游戏开发领域最为流行的引擎之一,而Unity3DECS架构则是在Unity3D引擎的基础上,针对游戏开发中的实体组件系统进行优化和改进而设计的一种架构。本文将详细介绍Unity3DECS架构的技术细节和代码实现。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

一、Unity3DECS架构概述

Unity3DECS架构是基于实体组件系统(Entity-Component-System,ECS)设计的一种游戏开发架构。ECS是一种游戏开发中常用的设计模式,它将游戏对象(Entity)拆分成多个组件(Component),并通过系统(System)对组件进行管理和处理。与传统的面向对象设计模式相比,ECS更加灵活、高效和易于扩展。

Unity3DECS架构中,游戏对象(Entity)被称为实体(Entity),组件(Component)被称为组件(Component),系统(System)被称为系统(System)。实体(Entity)只是一个标识符,不包含任何数据或行为,而组件(Component)则包含实体的数据和行为,系统(System)则负责对组件进行管理和处理。

二、Unity3DECS架构技术详解

1.实体(Entity)

实体(Entity)是Unity3DECS架构中最基本的概念,它只是一个标识符,用于标识游戏对象。在Unity3DECS架构中,实体不包含任何数据或行为,它只是一个唯一的标识符,用于让系统(System)知道哪些组件(Component)属于哪个实体。

在Unity3DECS架构中,实体(Entity)通常使用整数或长整数作为标识符,例如:

public struct Entity
{
public int id;
}

2.组件(Component)

组件(Component)是Unity3DECS架构中实现游戏对象功能的基本单元,它包含了游戏对象的数据和行为。在Unity3DECS架构中,组件(Component)是可复用的,可以在多个实体(Entity)之间共享。

在Unity3DECS架构中,组件(Component)通常使用结构体或类实现,例如:

public struct Position : IComponentData
{
public float x;
public float y;
public float z;
}
public class Movement : MonoBehaviour, IConvertGameObjectToEntity
{
public float speed;
public void Convert(Entity entity, EntityManager manager, GameObjectConversionSystem conversionSystem)
{
    manager.AddComponentData(entity, new MovementData { speed = speed });
}
}

3.系统(System)

系统(System)是Unity3DECS架构中管理和处理组件(Component)的核心部分,它负责对组件进行管理和处理。系统(System)可以对所有拥有特定组件(Component)的实体(Entity)进行操作,例如更新组件(Component)的状态、处理组件之间的关系等。

在Unity3DECS架构中,系统(System)通常使用结构体或类实现,例如:

public class MovementSystem : SystemBase
{
protected override void OnUpdate()
{
float deltaTime = Time.DeltaTime;
Entities.ForEach((ref Translation translation, in MovementData movement) =>
    {
        translation.Value += deltaTime * movement.speed * Vector3.forward;
    }).Schedule();
}
}

4.实体管理器(EntityManager)

实体管理器(EntityManager)是Unity3DECS架构中管理实体(Entity)的核心部分,它负责创建、销毁、查询和管理实体(Entity)及其组件(Component)。

在Unity3DECS架构中,实体管理器(EntityManager)通常使用EntityManager类实现,例如:

public class GameManager : MonoBehaviour
{
private EntityManager entityManager;
private void Awake()
{
    entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
}

private void Start()
{
    Entity entity = entityManager.CreateEntity(typeof(Position), typeof(Movement));
    entityManager.SetComponentData(entity, new Position { x = 0, y = 0, z = 0 });
    entityManager.SetComponentData(entity, new Movement { speed = 5 });
}
}

三、Unity3DECS架构代码实现

下面是一个简单的示例代码,演示了如何使用Unity3DECS架构实现一个移动的方块:

1.创建一个空对象,并将其命名为“GameManager”。

2.在“GameManager”对象上添加一个“GameManager”脚本,并将其代码设置为下面的内容:

using Unity.Entities;
using Unity.Transforms;
using Unity.Physics;
using Unity.Physics.Systems;
using Unity.Mathematics;
using UnityEngine;
public class GameManager : MonoBehaviour
{
private EntityManager entityManager;
private PhysicsWorld physicsWorld;
private BuildPhysicsWorld buildPhysicsWorld;
private void Awake()
{
    entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
    physicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<PhysicsWorld>();
    buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
}

private void Start()
{
    Entity entity = entityManager.CreateEntity(typeof(Translation), typeof(Rotation), typeof(PhysicsVelocity), typeof(PhysicsMass));
    entityManager.SetComponentData(entity, new Translation { Value = new float3(0, 0, 0) });
    entityManager.SetComponentData(entity, new Rotation { Value = quaternion.identity });
    entityManager.SetComponentData(entity, new PhysicsVelocity { Linear = new float3(0, 0, 5) });
    entityManager.SetComponentData(entity, new PhysicsMass { InverseMass = 1 });

    buildPhysicsWorld.Enabled = true;
}

private void OnDestroy()
{
    buildPhysicsWorld.Enabled = false;
}
}

3.在“Hierarchy”视图中创建一个立方体对象,并将其命名为“Cube”。

4.在“Cube”对象上添加一个“Physics Shape”组件,并将其设置为“Box”。

5.在“Cube”对象上添加一个“Physics Body”组件,并将其设置为“Dynamic”。

6.在“Cube”对象上添加一个“Physics Gravity Factor”组件,并将其设置为“0”。

7.在“Cube”对象上添加一个“Physics Material”组件,并将其设置为“Default”.

8.在“Cube”对象上添加一个“Convert To Entity”组件,并将其设置为“GameManager”。

9.在场景视图中运行游戏,可以看到一个移动的方块。

通过上面的示例代码,可以看出Unity3DECS架构的使用方法和优点。Unity3DECS架构可以让开发者更加灵活和高效地管理和处理游戏对象,从而提高游戏开发的效率和质量。

附:视频教学

两小时搞懂ECS架构​www.bycwedu.com/promotion_channels/1232986610​编辑

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 一: 什么是ECS?       ECS是一种新的架构模式(当然是针对Unity本身来说),这是一个取代GameObject / Component 的模式。 其模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据(即在组件中没有任何方法)。系统便是来处理拥有一个或多个相同组件的实体集合的工具,其只拥有行为(即在系统中没有任何数据)。       ECS旨在比GameObject / MonoBehaviour更容易处理大量物体。ECS由于是面向数据的设计,所以很容易并行高速处理,以及与Unity开发的C#JobSystem/Burst Compiler一起工作,从而获取更高的项目运行性能。二:ECS总体发展历史       目前Unity公司由Mike Acton 大佬主持DOD(Data Oriented Design 面向数据设计)的全面改革与推进工作,目的是旨在进一步推进Unity系统本身与Unity项目的执行效率。    ECS总体发展:    A: 在Unity2018引入Entities之前,其实ECS框架早已经出现,但是ECS还是因为守望先锋采用了这个框架才被我们所熟知,后来Git上面出现了一个Entitas的插件可以直接用在Unity上面。Entitas-Unity(有多个语言的port版本,Entitas-Unity下统一称为Entitas) 是 Unity的一个ECS(Entity/Component/System)框架,是在github上面的一个开源项目。    B: 经过Unity公司的认可与改造,目前Unity2018.x 版本已经通过 Package Manager 提供了Unity版本的ECS插件,名称为:“Entities”。    C: Unity2019.x 版本,对“Entities”插件的API进行了进一步改造与完善,以更规范的API实现更加高效的与规范的编程模式。 三:ECS(一)轻松入门篇       本“ECS入门篇”旨在全面讲解ecs 的相关理论与简单Hello World 的编程模式,且通过Unity2018.x与Unity2019.x 两个不同API的编程模式,初步讲解ECS的编程规范与模式规范。        需要进一步学习ECS的小伙伴们,可以关注后续“ECS(二)小试牛刀”篇的进一步讲解。   《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096 
UnityECS架构是一种基于数据的设计模式,它将游戏对象(GameObject)拆分为各个组件(Component),并且通过系统(System)来处理这些组件,以此来实现游戏逻辑的编写和管理。 在ECS架构中,数据和逻辑是分离的,每个组件只包含数据,而不包含任何逻辑。而系统则负责处理这些组件,并且根据组件的数据状态来执行相应的逻辑。 下面详细介绍UnityECS架构: 1. 实体(Entity) 在ECS架构中,实体(Entity)是游戏对象(GameObject)的抽象。它只是一个ID,用于标识一个游戏对象。实体没有任何的组件或者逻辑。 2. 组件(Component) 组件(Component)是游戏对象的基本元素。每个组件只包含数据,不包含任何逻辑。例如,Transform组件只包含位置、旋转和缩放等数据,而不包含任何移动或旋转的逻辑。 3. 系统(System) 系统(System)是处理组件的核心。系统会根据组件的数据状态来执行相应的逻辑。例如,移动系统会根据Transform组件的位置和速度等数据来更新游戏对象的位置。 系统可以根据需要访问一组或多组组件,并且可以通过查询语言(Query)来获取需要的组件。例如,一个移动系统可能需要访问Transform组件和Velocity组件,它可以使用查询语言来获取这些组件。 4. 状态组件(State Component) 状态组件(State Component)是一种特殊的组件,它包含游戏对象的状态信息,例如是否存活、是否受伤等。系统可以根据状态组件的数据状态来执行相应的逻辑。例如,死亡系统会根据是否存活状态组件来判断游戏对象是否死亡。 5. 事件(Event) 事件(Event)是一种可以触发系统执行逻辑的机制。例如,当游戏对象被攻击时,可以触发一个受伤事件,从而让受伤系统进行处理。 6. 工作流(Workflow) 工作流(Workflow)是一种将多个系统组合起来处理游戏逻辑的机制。例如,一个游戏对象可能需要先执行移动系统,然后再执行攻击系统,最后再执行死亡系统。工作流可以让这些系统按照一定的顺序来执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值