首页 > 其他分享 >(转)我所理解的Entitas——IInitializeSystem(六)

(转)我所理解的Entitas——IInitializeSystem(六)

时间:2023-07-15 19:44:06浏览次数:36  
标签:小熊 Entitas System IInitializeSystem Game 理解 组件 using public

从这章这开始我们以一个小案例分章介绍Entitas为我们提供的五种类型的System。
案例的主要功能比较简单,大致的流程如下:

在游戏启动时在屏幕上创建一个站立的小熊,
点击键盘上的左右按键时将小熊切换成一个对应方向的Sprite,朝对应方向移动并实时打印位置信息。松开左右按键时切换回站立的小熊Sprite,结束打印位置信息。
结束游戏输出一个"Game Over!"信息。
这一章我们将在游戏中通过代码创建一个小熊的GameObject,并可以看到小熊Entity的一些组件信息

案例准备
创建ViewComponent.cs
首先我们需要创建如下几个组件:

ViewComponent 记录小熊的GameObject
SpriteComponent 记录小熊的Sprite名称数据
PositionComponent 记录小熊的Position数据
DirectionComponent 记录小熊的方向数据
MoveSpeedComponent 记录小熊的移动速度数据 (但是这里需要注意,这个组件一旦添加到小熊身上就会移动,不需要移动时需将这个组件移除,这就是我们将Component时提到过的通过修改组件来改变Entity的行为)
多个组件可以放在一个文件中可以分成多个文件,我们这里就放在一个文件中 ViewComponent.cs。

using Entitas;
using UnityEngine;

/// <summary>
/// View组件
/// </summary>
[Game]
public class ViewComponent : IComponent
{
    public GameObject gameObject;
}

/// <summary>
/// Sprite组件
/// </summary>
[Game]
public class SpriteComponent : IComponent
{
    public string value;
}

/// <summary>
/// Position组件
/// </summary>
[Game]
public class PositionComponent : IComponent
{
    public Vector2 value;
}

/// <summary>
/// MoveSpeed组件
/// </summary>
[Game]
public class MoveSpeedComponent : IComponent
{
    public float value;
}

/// <summary>
/// Direction组件
/// </summary>
[Game]
public class DirectionComponent : IComponent
{
    /// <summary>
    /// 用来表示小熊的站立,向左,向右三种朝向状态
    /// </summary>
    public enum EDirection
    {
        stand,
        left,
        right,
    }
    public EDirection value;
}
注意:每次添加新的组件代码之后需要重新生成一下代码才会被Entitas引用。

创建AddSystem.cs IInitializeSystem
我们全局只需要一个小熊实体,并在游戏开始时就创建出来,所以需要继承IInitializeSystem这个接口,并实现Initialize()方法用来执行创建小熊的逻辑。
这个接口和MonoBehaviour生命周期中的Start()方法类似。但是和MonoBehaviour不同的是如果我们有多个继承自IInitializeSystem接口的System,执行顺序是先添加到Systems中的先执行。

using Entitas;
using Entitas.Unity;
using UnityEngine;
/// <summary>
/// AddView系统 extends IInitializeSystem
/// </summary>

public class AddViewSystem : IInitializeSystem
{
    //创建一个小熊的容器
    readonly Transform gameContainer = new GameObject("Game Container").transform;

    // 需要处理的Component都是属于GameContext,所以我们需要从Contexts中拿到Game Context。 
    readonly GameContext _context;

    public AddViewSystem(Contexts contexts)
    {
        _context = contexts.game;
    }

    public void Initialize()
    {
        var entity = _context.CreateEntity();
        GameObject go = new GameObject("Game Entity");
        go.transform.SetParent(gameContainer, false);
        //添加ViewComponent并为ViewComponent的gameObject字段赋值
        entity.AddView(go);

        //添加PositionComponent并为PositionComponent的value字段赋值
        entity.AddPosition(Vector2.zero);

        //添加SpriteComponent并为SpriteComponent的value字段赋值
        entity.AddSprite("monkey_stand");

        //添加DirectionComponent并为DirectionComponent的value字段赋值
        entity.AddDirection( DirectionComponent.EDirection.stand );
        // 将Entity链接到GameObject上
        go.Link(entity);
    }

}

GameSystems.cs
我们还需要一个用来管理System的Systems。并将刚才创建的AddSystem.cs添加到Systems中。我们为了能在Unity编辑器中看到System的信息,所以GameSystems继承自Feature。如果这里有什么不清楚的可以回顾一下System那一章。

using Entitas;

/// <summary>
/// GameSystems extends Feature
/// </summary>

public class GameSystems : Feature
{
    public GameSystems(Contexts contexts) : base("Game Systems")
    {
        /* -- Init System -- */
        Add(new AddViewSystem(contexts));
    }

}

GameController.cs

我们写了这么多代码但是Unity开始运行的时候并不会执行啊,所以我们还需要有一个继承自MonoBehaviour的脚本来负责创建,初始化和执行各个System。我们就叫GameController.cs吧。

using UnityEngine;
using System.Collections;
using Entitas;

public class GameController : MonoBehaviour
{
    Systems _systems;
    Contexts _contexts;
    void Start()
    {
        _contexts = Contexts.sharedInstance;
        _systems = new GameSystems(_contexts);

        _systems.Initialize();
    }

    void Update()
    {

    }

}

然后把GameController.cs挂载到Hierarchy面板中的任意一个GameObject上。
好了,现在我们可以试着运行一下游戏了,游戏运行起来之后Game试图中还是什么都没有。这是肯定的,因为我们还没有给小熊添加SpriteRenderer。但是我们已经可以在Hierarchy面板中看到这些东西了。

 

选中Hierarchy面板中Game然后可以在Inspector面板中看到这些信息

 

  • 这里列出来了当前活动的Entity和被回收的Entity数量,创建Entity和回收所有Entity的按钮。

  • 再选Game下的Entity_0然后可以在Inspector面板中看到这些信息

 

 

  • 其中包含了刚才我们在AddViewSystem中为小熊实体添加的组件信息和数据信息。

  • 最后选中Hierarchy面板中Game Systems然后可以在Inspector面板中看到这些信息了

 

 

可以看到每种类型的System列表,System的性能开销。这里会每帧动态刷新。




总结: IInitializeSystem 会在游戏开始之前执行一次。在这里设置初始游戏状态,类似于Unity的Start()方法。创建游戏中的全局实体(例如,用于访问配置数据)

 

原文地址:https://blog.csdn.net/u010020342/article/details/109898679?spm=1001.2014.3001.5502

 

标签:小熊,Entitas,System,IInitializeSystem,Game,理解,组件,using,public
From: https://www.cnblogs.com/wodehao0808/p/17556783.html

相关文章

  • typescript 中严格字面量类型检查的理解
    个人关于TS中Strictobjectliteralassignmentchecking的理解StrictobjectliteralassignmentcheckingStrictobjectliteralassignmentcheckingbyahejlsberg·PullRequest#3823·microsoft/TypeScript案例interfaceIStudent{name:stringid:strin......
  • 【全流程管理解决方案】奥威BI金蝶云星空SaaS版:重新定义企业管控
    金蝶云星空是一套全面覆盖供应链、采购、生产、销售、财务等业务流程,实现了全链条的闭环管理的综合性管理软件。但在云时代,仅仅覆盖业务流程还不够,还需要有一套全流程管理解决方案,实现对全业务流程数据的深度挖掘,为运营决策提供支持。奥威BI金蝶云星空SaaS版,一套覆盖全流程业务管理......
  • 大模型入门(七)—— RLHF中的PPO算法理解
    本文主要是结合PPO在大模型中RLHF微调中的应用来理解PPO算法。一、强化学习介绍1.1、基本要素环境的状态S:t时刻环境的状态$S_{t}$是环境状态集中某一个状态,以RLHF中为例,序列$w1,w2,w3$是当前的状态。个体的动作A:t时刻个体采取的动作$A_{t}$,给定序列$w1,w2,w3$,此时......
  • 关于Java类加载器的一些理解
    Java中,每个类都可以获得对应自己类的Class对象,这是因为Object类中有publicfinalnativegetClass()方法,Class对象是由类加载器根据类字节码生成的,是反射机制必不可少的部分。类加载器中,主要的方法有protectedClassloadClass(Stringname,booleanresolve)和protectedClassf......
  • Netty 原理解析与开发实战(一)
    Netty原理解析与开发实战一、Netty概述1.1Java网络编程进化史1.1.1JavaOIO早期java提供了java.net包用于开发网络应用,这类API被称为阻塞JavaOIO(阻塞IO)。服务端主要实例代码:ServerSocketserverSocket=newServerSocket(port);SocketclientSocket=serverSocket.......
  • 从需求去理解 Linux dbus与基于dbus协议的无agent软件管理
    从需求去理解Linuxdbus与基于dbus协议的无agent软件管理 转载 WhatisIPCIPC[Inter-ProcessCommunication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法。在Linux/Unix中,提供了许多IPC。Unix七大IPC:Pipe:无名管道,最基本的IPC,单向通信,仅在......
  • 复习结构体的创建,重定义,打印,以及对函数压栈的理解
    函数在操作,在栈上进行,形参的拷贝和函数的运行,基本上都在栈上完成,所以结构体的传参,对栈区的资源消耗较大。而传地址的操作则会节省栈区资源,不需要形参的拷贝过程,而是直接寻址。#define_CRT_SECURE_NO_WARNINGS1#include"stdio.h"structT{ chart; chars;};typedefstruc......
  • 1分钟理解map reduce,其实它就在我们身边
    linux平台下有个ls指令,大家都很熟悉:①ls|grep2008  查询文件名包含2008的文件(这其实就是一个map,找到需要的数据)②ls|grep2008|wc-l计算上述指令查询文件个数(这其实就是一个reduce,对找到数据进行汇总聚合) 再来一个例子,关于SQL:select*fromdevice ①select*fro......
  • ble开发 蓝牙服务中对服务、特性、属性以及UUID的理解
    1.蓝牙服务包括多个服务(service),如下为蓝牙串口通信例程的三个服务 2.其中每个服务包括多个特性(Characteristic),如下为GenericAccess服务的四个特性 3.属性即为每个特性是否可读写 4.每个特性都有其对应的UUID简单理解UUID就是编号,服务和特性都有各自的UUID他们都是唯一......
  • 理解软件自带的easy工程(二)
    继续分析Light的代码/*@@msg:CAN1.easy::LightState(0x321):*/onmessageLightState{if(this.dir==TX){gDebugCounterTX++;if(gDebugCounterTX==10){writeDbgLevel(1,"LightStateTXreceivedbynode%NODE_NAME%");gDe......