Skip to content

基础概念

本文档将介绍ETOfflineToolkit中同时也可以适用于ET的核心代码用法。

ETOfflineToolkit中的组件挂载的使用

组件(Component)的写法

重要说明

ET将ECS简化成了ES,即 Entity = ComponentComponent = Entity

csharp
// 定义一个移动组件
public class MoveComponent : Entity, IAwake, Iupdate, IDestroy
{
    // 可以添加一些基础属性
    public float Speed;
    public bool IsMove;
}

系统(System)的写法

MoveComponentSystem的实现
csharp
//这里是一个组件的生命周期,通过继承对应的接口来实现
[EntitySystem]
public class MoveComponentAwakeSystem : AwakeSystem<MoveComponent>
{
    protected override void Awake(MoveComponent self)
    {
        self.Speed = 10f;
        self.IsMove = true;
    }
}

[EntitySystem]
public class MoveComponentUpdateSystem : UpdateSystem<MoveComponent>
{
    protected override void Update(MoveComponent self)
    {
        if(!self.IsMove)
            return;
        self.Move();
    }
}

[EntitySystem]
public class MoveComponentDestroySystem : DestroySystem<MoveComponent>
{
    protected override void Destroy(MoveComponent self)
    {
        self.Speed = 0f;
        self.IsMove = false;
    }
}

// 定义一个处理玩家移动的系统
public static class MoveComponentSystem
{
    // 处理玩家移动逻辑
    public static void Move(this MoveComponentSystem self, Vector3 direction)
    {
        // 移动相关逻辑
        Debug.Log("Moving...")
    }
    // 处理玩家移动逻辑
    public static void StopMove(this MoveComponentSystem self, Vector3 direction)
    {
        // 移动相关逻辑
        Debug.Log("Stop Move")
        self.IsMove = false;
    }
}

实际使用示例

csharp
using System;
using UnityEngine;

namespace MH
{
    [Event(SceneType.Main)]
    public class AfterUnitCreate_EventView : AEvent<Scene, AfterUnitCreate>
    {
        protected override async ETTask Run(Scene scene, AfterUnitCreate a)
        {
            var unit = a.Unit;
            //...

            //需要这个移动组件的实体都可以添加上
            unit.AddComponent<MoveComponent>();

            scene.AddComponent<MoveComponent>(); 
            //也可以这样scene.Root.AddComponent<MoveComponent>(); 因为这个事件的SceneType是Main所以scene是Root
            
            //这里要确保Scene是不为空的,因为有可能当前Root还没有CurrentScene
            scene.Scene.AddComponent<MoveComponent>();
            //...
        }
    }
}
csharp
namespace MH
{
    [Event(SceneType.Main)]
    public class MainInit_EventView : AEvent<Scene, Main_Init>
    {
        protected override async ETTask Run(Scene scene, Main_Init a)
        {
            //...
            //在任何想添加的地方都可以
            scene.Scene.AddComponent<MoveComponent>();
            scene.Root.AddComponent<MoveComponent>();


            //同时在任何地方都获取 tips: 必须是已经挂载了之后
            var moveComponent1 = scene.Root.GetComponent<MoveComponent>();
            var moveComponent2 = scene.Scene.GetComponent<MoveComponent>();
            moveComponent1.StopMove();
            moveComponent2.StopMove();
        }
    }
}

接下来是Entity作为组件的子实体的使用,这里还是用上面定义的MoveComponent做示例

实体(Entity)的写法

csharp
// 定义一个移动组件
public class MoveInfo : Entity, IAwake<float, float, float>, IDestroy
{
    // 可以添加一些基础属性
    public float X;
    public bool Y;
    public bool Z;
}

回到刚刚的MoveComponent.cs添加:

csharp
// 定义一个移动组件
public class MoveComponent : Entity, IAwake, Iupdate, IDestroy
{
    // 可以添加一些基础属性
    public float Speed;
    public bool IsMove;
    public List<MoveInfo> MoveInfos = new List<MoveInfo>();
}

然后这里回到MoveComponentSystem.cs添加:

csharp
//...
public static class MoveComponentSystem
{
    //...
    public static void Add(this MoveComponentSystem self)
    {
        var moveInfo = self.AddChild<MoveInfo>();
        self.MoveInfos.Add(moveInfo);
    }
}

同样Entity不管是作为组件还是子实体都有自身对应的一个System

MoveInfoSystem的实现
csharp
[EntitySystem]
public class MoveInfoAwakeSystem : AwakeSystem<MoveInfo>
{
    protected override void Awake(MoveInfo self)
    {

    }
}
//...

// 定义一个处理玩家移动的系统
public static class MoveInfoSystem
{

}

重要说明

但是注意,实体只能有一个组件,但是可以有多个子实体

生命周期

目前支持的生命周期

IAwake
csharp
public interface IAwake
{
}
public interface IAwake<A>
{
}

public interface IAwake<A, B>
{
}
public interface IAwake<A, B, C>
{
}
IDeserialize
csharp
public interface IDeserialize
{
}
IDestroy
csharp
public interface IDestroy
{
}
ILateUpdate
csharp
public interface ILateUpdate
{
}
IUpdate
csharp
public interface IUpdate
{
}

技术支持

获取帮助

  • 💬 加入QQ群讨论交流(ET框架群) : 474643097
  • ⭐ 在GitHub上关注项目获取最新更新

Released under the MIT License.