基础概念
本文档将介绍ETOfflineToolkit
中同时也可以适用于ET
的核心代码用法。
ETOfflineToolkit中的组件挂载的使用
组件(Component)的写法
重要说明
ET将ECS
简化成了ES
,即 Entity = Component
、 Component = 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上关注项目获取最新更新