ET的“一切皆实体”,即组件模式。推荐大家把各个功能拆成组件。
例如Player,给他加一个MoveComponent,他就可以移动了。
ET的ECS
我这里写一个例子,大家看看对不对。
下面的moveComponent,并不一定是要移动组件,只是方便阅读。
MyEntity{
moveComponent
MoveTo(vector3){
moveComponent.MoveTo(vector3)
}
}
moveComponent{
MoveTo(vector3)
}
moveComponentA:moveComponent{
overrider MoveTo(vector3)
}
moveComponentB:moveComponent{
overrider MoveTo(vector3)
}
Factory.Create(){
if(a){
MyEntity.moveComponent = new moveComponentA()
}else if(b){
MyEntity.moveComponent = new moveComponentB()
}
}
调用方法:
MyEntity.MoveTo(vector3)
ET版本
class MyEntity : Entity{
MoveTo(vector3){
EventSystem.Instance.Publish(self.Root(), new playerMoveToEvent(){pos = vector3, unit = self});
}
}
[ComponentOf(MyEntity)]
class moveComponentA:entity
[ComponentOf(MyEntity)]
class moveComponentB:entity
struct playerMoveToEvent{
MyEntity unit
vector3 pos
}
[Event(SceneType.Demo)]
class moveComponentA_MoveToHandler : AEvent<Scene, playerMoveToEvent>{
protected override async ETTask Run(Scene scene, playerMoveToEvent a)
{
var com = a.unit.GetComponent<moveComponentA>();
if (com is null)
{
return;
}
com.MoveTo(a.targetPos);
}
}
[Event(SceneType.Demo)]
class moveComponentB_MoveToHandler : AEvent<Scene, playerMoveToEvent>{
protected override async ETTask Run(Scene scene, playerMoveToEvent a)
{
var com = a.unit.GetComponent<moveComponentB>();
if (com is null)
{
return;
}
com.MoveTo(a.targetPos);
}
}
调用方法:
entity.MoveTo(vector3)
[Switch case]
class moveComponent:entity{
moveComponentType
}
static partial class moveComponentSystem{
public static void MoveTo(this moveComponent self, Vector3 pos)
{
switch self.moveComponentType
case a :
MoveTo_A(self,pos)
break;
case b :
MoveTo_B(self,pos)
break;
}
static void MoveTo_A(this moveComponent self, Vector3 pos)
{
}
static void MoveTo_B(this moveComponent self, Vector3 pos)
{
}
}
[分发]
struct playerMoveToEventA{
moveComponent com
vector3 pos
}
struct playerMoveToEventB{
moveComponent com
vector3 pos
}
[Event(SceneType.Demo)]
class moveComponentA_MoveToHandler : AEvent<Scene, playerMoveToEventA>{
protected override async ETTask Run(Scene scene, playerMoveToEventA a)
{
}
}
[Event(SceneType.Demo)]
class moveComponentB_MoveToHandler : AEvent<Scene, playerMoveToEventB>{
protected override async ETTask Run(Scene scene, playerMoveToEventB a)
{
}
}
class moveComponent:entity{
moveComponentType
}
static partial class moveComponentSystem{
public static void MoveTo(this moveComponent self, Vector3 pos)
{
switch self.moveComponentType
case a :
EventSystem.Instance.Publish(self.Root(), new playerMoveToEventA(){pos = vector3, com = self});
break;
case b :
EventSystem.Instance.Publish(self.Root(), new playerMoveToEventB(){pos = vector3, com = self});
break;
}
}