Basic Concepts
This document introduces the core code usage in ETOfflineToolkit
which is also applicable to ET
.
Component Mounting Usage in ETOfflineToolkit
Writing Components
Important Note
ET simplifies ECS
into ES
, meaning Entity = Component
, Component = Entity
csharp
// Define a movement component
public class MoveComponent : Entity, IAwake, Iupdate, IDestroy
{
// Can add some basic properties
public float Speed;
public bool IsMove;
}
Writing Systems
MoveComponentSystem Implementation
csharp
// Here is a component's lifecycle, implemented by inheriting the corresponding interfaces
[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;
}
}
// Define a system to handle player movement
public static class MoveComponentSystem
{
// Handle player movement logic
public static void Move(this MoveComponentSystem self, Vector3 direction)
{
// Movement related logic
Debug.Log("Moving...")
}
// Handle player stop movement logic
public static void StopMove(this MoveComponentSystem self, Vector3 direction)
{
// Movement related logic
Debug.Log("Stop Move")
self.IsMove = false;
}
}
Practical Usage Examples
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;
//...
//Any entity that needs this movement component can add it
unit.AddComponent<MoveComponent>();
scene.AddComponent<MoveComponent>();
//You can also do scene.Root.AddComponent<MoveComponent>(); Because this event's SceneType is Main, so scene is Root
//Here you need to ensure Scene is not null, because the current Root might not have CurrentScene yet
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)
{
//...
//Can be added anywhere you want
scene.Scene.AddComponent<MoveComponent>();
scene.Root.AddComponent<MoveComponent>();
//Can also be accessed from anywhere (tips: must be mounted first)
var moveComponent1 = scene.Root.GetComponent<MoveComponent>();
var moveComponent2 = scene.Scene.GetComponent<MoveComponent>();
moveComponent1.StopMove();
moveComponent2.StopMove();
}
}
}
Next is the usage of Entity as a child entity of components, still using the MoveComponent defined above as an example
Writing Entities
csharp
// Define a movement info entity
public class MoveInfo : Entity, IAwake<float, float, float>, IDestroy
{
// Can add some basic properties
public float X;
public bool Y;
public bool Z;
}
Back to MoveComponent.cs
add:
csharp
// Define a movement component
public class MoveComponent : Entity, IAwake, Iupdate, IDestroy
{
// Can add some basic properties
public float Speed;
public bool IsMove;
public List<MoveInfo> MoveInfos = new List<MoveInfo>();
}
Then back to MoveComponentSystem.cs
add:
csharp
//...
public static class MoveComponentSystem
{
//...
public static void Add(this MoveComponentSystem self)
{
var moveInfo = self.AddChild<MoveInfo>();
self.MoveInfos.Add(moveInfo);
}
}
Similarly, Entity
, whether as a component or a child entity, has its own corresponding System
MoveInfoSystem Implementation
csharp
[EntitySystem]
public class MoveInfoAwakeSystem : AwakeSystem<MoveInfo>
{
protected override void Awake(MoveInfo self)
{
}
}
//...
// Define a system to handle player movement
public static class MoveInfoSystem
{
}
Important Note
However, note that an entity can only have one component, but can have multiple child entities
Lifecycle
Currently Supported Lifecycles
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
{
}
Technical Support
Get Help
- 💬 Join QQ group for discussion
(ET Framework Group)
: 474643097 - ⭐ Follow the project on GitHub for the latest updates