首页 > 其他分享 >Unity3D:ECS架构详解

Unity3D:ECS架构详解

时间:2023-11-17 10:03:40浏览次数:45  
标签:Unity3D 架构 Unity3DECS Component Entity 详解 ECS 组件 public

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/123298661

标签:Unity3D,架构,Unity3DECS,Component,Entity,详解,ECS,组件,public
From: https://www.cnblogs.com/liuwenyi/p/17837984.html

相关文章

  • Debian关闭防火墙命令详解
    防火墙是保护计算机系统安全的关键组件。在一些情况下,需要关闭防火墙,以允许特定的应用程序或服务访问网络。在Debian系统中关闭防火墙的方法多种多样,本文将从多个方面对Debian关闭防火墙命令进行详细阐述。一、Debian关闭防火墙命令行在Debian系统中,可以通过命令行关闭防火墙。......
  • Java常见的输入输出流详解
    Java默认使用Unicode字符集来表示字符;Java语言中,中文字符所占的字节数取决于字符的编码方式,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;采用GB2312或GBK或Unicode编码方式时,一个中文字符占2个字节;而采用UTF-8编码方式时,一个中文字......
  • AWS上部署容器化应用:EC2和Fargate挂载EFS文件系统的步骤详解
    在云计算领域,AWS(AmazonWebServices)一直是业界领先的云服务提供商之一。在AWS上,我们可以轻松地部署和管理各种应用程序,包括容器化的应用。本篇博文将介绍如何在AWS上创建EFS文件系统,并演示如何在EC2和AWSFargate上挂载这个文件系统。步骤一:创建EFS文件系统首先,登录AWS管理控制台,......
  • app在线实时更新(详解)
    由于Uni-app的代码是针对不同平台(iOS、Android、H5等)进行开发的,因此具体的代码实现会因平台而异。以下是一种可能的实现方式,仅供参考:后端服务器(示例代码使用PythonFlask框架):  fromflaskimportFlask,jsonify importos   app=Flask(__name_......
  • vue2和vue3ref的区别(详解)
    Vue2和Vue3中ref的区别如下:在Vue2中,ref主要用于在模板中获取DOM元素或组件实例。而在Vue3中,虽然ref也可以获取DOM元素或组件实例,但更重要的是,它还可以将一个基本类型的变量转换成响应式的数据,无需再通过复杂的步骤来访问响应式数据。另外,Vue3的ref还支持对象属性和数组索引......
  • 博弈论——古诺博弈模型详解
    古诺模型(Cournotmodel)是博弈论中最具有代表性的模型之一,也是是纳什均衡最早的版本。它是法国经济学家古诺(AugustinCournot)在1938年出版的《财富理论的数学原理研究》一书中最先提出的。而古诺的定义比纳什的定义早了一百多年,足以体现博弈论这样一个学科是深深扎根于经济学的土......
  • 详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE
    本文分享自华为云社区《GaussDB数据库SQL系列-DROP&TRUNCATE&DELETE》,作者:Gauss松鼠会小助手2。一、前言在数据库中,SQL作为一种常用的数据库编程语言,扮演着至关重要的角色。SQL不仅可以用于创建、修改和查询数据库,还可以通过DROP、DELETE和TRUNCATE等语句来删除数据。这些......
  • 思科认证 | CCNA(思科认证网络工程师)超全详解
    思科CCNA认证到底是什么,拥有思科CCNA认证能说明什么?01思科CCNACCNA思科认证是由网络领域著名的厂商--Cisco公司推出的。该公司针对其产品的网络规划和网络支持推出了工程师资格认证计划(CiscoCareerCertificationProgram,简称CCCP),并要求其在各国的代理拥有这样的工程师,以提高对......
  • 微信团队分享:详解iOS版微信视频号直播中因帧率异常导致的功耗问题
    本文由微信客户端团队rhythm分享,原题“视频号直播:如何进一步降低功耗占用?”,本文有修订和改动。1、引言功耗优化一直是app性能优化中让人头疼的问题,尤其是在直播这种用户观看时长特别久的场景。怎样能在不影响主体验的前提下,进一步优化微信iOS端视频号直播的功耗占用,本文给出......
  • dig 命令详解
    1、dig DNS解析工具,比nslookup更加综合,可以做正向反向解析2、正反向解析用法1.正向解析 域名-------->ip2.反向解析 ip--------->域名3.CNAME 别名4.dig格式:dig常用命令格式dig[@server][-pport][-ttype][-4][-6][+trace]name@指定DNS查询使用的服务器名......