自己实现Unity框架---01整体思路(ECS篇)

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篇) 

 

发布了3 篇原创文章 · 获赞 5 · 访问量 3736
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览