PS:感兴趣请收藏,今后会把源码放上来。
PS:写完所有,我应该会把源码放在Github上。这个框架就叫 LC_Framework LC是我老婆名字的缩写,敬请期待。。。
本人只是一个刚接触这个行业没多久的小菜鸡,工作到现在只有一年左右。所以如有不对之处,欢迎批评指正。PS:第一次写博客所以内容一定会乱的一比请见谅。
一,前言
毕业就进了游戏公司,发现公司项目的代码,真的是不堪入目。非常非常的乱。很难想象我改了一个玩家输入的BUG竟然会导致,小地图显示崩溃。。。。。。
所以渐渐发现一个好的框架真的很重要,在大学自学时曾经了解过一些框架,基本都是MVC的思路,但是总感觉这种框架没啥大用。重头戏来了,我发现了ECS感觉异常牛逼。现在市面上讲解也挺多的,我就不说他是啥意思了。想了解的自行百度。
这是云风大神的那篇守望先锋的ECS框架,所以不知道ECS的先去读一下在回来。
https://blog.codingnow.com/2017/06/overwatch_ecs.html
二,实现
其实ECS很好实现,因为想法足够简洁。就是把组件中数据和方法分开。
Entity------------------只有一个Id和组件的列表
Component----------只有该组件关心的数据
System----------------只做俩件事,处理组件,观察实体
但问题来了,Unity很方便的原因之一就是所见即所得,ECS这样设计你根本无法在运行时查看组件数据的变化,你也很难去配置数据。
所以我加上的ECS中心编辑器,它负责配置一个实体。这样一个基础的ECS框架就好了。
三,运行
通过在ECS中心配置一个实体,游戏运行时,将创建实体并且所有的System观察一下这个实体,判断是否是自己敏感的实体,也就是是不是拥有特定的组件。
在MonoBehaviour 中的Update中不断的运行System的Excute方法。
示例:
public class MoveSystem:LCBaseSystem
{
public MoveSystem(byte weight):base(LCSystemId.Move, new LCComponentId[] { LCComponentId.View, LCComponentId.Position, LCComponentId.Velocity, LCComponentId.ActorModel, LCComponentId.Collider2D }, weight)
{
}
//通过基类 Excute 触发
protected override void DisposeComs()
{
base.DisposeComs();
ViewCom view = null;
PositionCom position = null;
VelocityCom velocity = null;
ActorModelCom actor = null;
Collider2DCom collider = null;
for (int i = 0; i < ObserveComponentList.Count; i++)
{
view = (ViewCom)ObserveComponentList[i].Components[0];
position = (PositionCom)ObserveComponentList[i].Components[1];
velocity = (VelocityCom)ObserveComponentList[i].Components[2];
actor = (ActorModelCom)ObserveComponentList[i].Components[3];
collider = (Collider2DCom)ObserveComponentList[i].Components[4];
//速度衰减
SpeedDamping(ref velocity.Speed, actor.SpeedDamping, GameWorldModel.Gravity, ref actor.StartJumpSpeed, actor.Mass, collider);
//移动
Move(view.Object, ref position.Postion, velocity.Speed, collider.Dir, velocity);
}
}
}
四,最后
放一个ECS脑图辅助理解
看完请看下期--------------------------
自己实现Unity框架---02整体思路(BehaviorTree篇)