Unity ECS 框架

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

20180312

ECS编程思想

这种编程思想很早前就已经提出,ECS分别是Entity,Component,System的缩写.

ECS和传统的OOP相比更看重的是组件,附加组件即具备功能.

C#是面向对象语言,从语言层面上就支持面向对象的编程思想:集成封装和多态.

按照ECS的思路,功能拆分成组件,然后把这些细小的组件组合便组成了具备所需功能的对象.实际上Unity也是这种实现思路,但是它的组件式属性和逻辑的合集.

最近看了ECS编程思想,看了Entitas逻辑,写了小Demo,感觉:

编程思路/框架没有最好只有更合适,可能A框架适合RPG游戏,B框架更适合FPS游戏.

ECS框架:Entitas

基于ECS的框架有很多,Entitas便是其中一个.

官方的ECS也会在2018.1beta版本中推出.

根据wiki很容易就能够搭建起项目,运行起工程,但是有些也需要开发者注意,比如Component作为标识还是作为数据存储;Component生成代码后改变类型或者删除字段后的生成报错,Group/Feature/Unit使用等等.

关于代码生成,它提供两个版本:

免费版根据反射生成代码,需要无编译错误下运行;收费版不需要,即使有代码报错也可以生成代码.

自己扩展的代码可以分为两部分:

这样做的好处是重新生成代码时,方便的把这两个目录移除项目(或者StreamingAssets),生成基础代码,然后移回Component代码,然后生成组件代码,然后移回其他代码.

Entitas实践

最简单的输出hello world

源码: https://github.com/hiramtan/test/tree/Entitas_Example_HelloWorld

创建一个Component:

public class HelloWorldComponent : IComponent
{
    public string s;
}

生成代码后创建两个system,一个用来创建entity并附加组件,另一个用来输出日志:

public class CreatSystem : IInitializeSystem
{
    private Contexts _contexts;
    public CreatSystem(Contexts contexts)
    {
        _contexts = contexts;
    }
    public void Initialize()
    {
        var e = _contexts.game.CreateEntity();
        e.AddHelloWorld("hello world");
    }
}
public class HelloWorldSystem : ReactiveSystem<GameEntity>
{
    private Contexts _contexts;

    public HelloWorldSystem(Contexts contexts) : base(contexts.game){
    }

    protected override ICollector<GameEntity> GetTrigger(IContext<GameEntity> context)
    {
        return context.CreateCollector(GameMatcher.HelloWorld);
    }
    protected override bool Filter(GameEntity entity)
    {
        return entity.hasHelloWorld;
    }
    protected override void Execute(List<GameEntity> entities)
    {
        foreach (var e in entities)
        {
            Debug.Log(e.helloWorld.s);
        }
    }
}

上面的代码已经实现了输出功能,但是为了方便管理上面的这两个System,我们添加一个RootSystems专门管理游戏中的各种System:

public class RootSystems : Feature
{
    public RootSystems(Contexts contexts)
    {
        Add(new CreatSystem(contexts));
        Add(new HelloWorldSystem(contexts));
    }
}

所有的功能都实现了,在unity工程中添加一个入口方法挂载到场景中,Main.cs:

public class Main : MonoBehaviour
{
    private RootSystems s;
    // Use this for initialization
    void Start()
    {
        s = new RootSystems(Contexts.sharedInstance);
        s.Initialize();
    }
    // Update is called once per frame
    void Update()
    {
        s.Execute();
    }
}

运行,正常输出,因为输出实现的是reactivesystem,当值发生变化时便会输出.

Unity ECS

今天untiy在beta版本中公布了自己的ECS系统,Entity,ComponentData,ComponentSystem,随着unity官方的引入,势必会被推广起来.

点击链接加入QQ群【83596104】:https://jq.qq.com/?_wv=1027&k=5l6rZEr


参考资料

  1. https://github.com/sschmid/Entitas-CSharp
  2. https://blog.codingnow.com/2017/06/overwatch_ecs.html
  3. http://www.ecsframework.com/
  4. https://youtu.be/OJmVBo5HGOY
  5. http://t-machine.org/index.php/category/entity-systems/
  6. http://www.benmutou.com/archives/2421
  7. https://www.cnblogs.com/yangrouchuan/p/7436533.html
  8. http://blog.csdn.net/u012632851/article/details/75370836
  9. http://blog.csdn.net/langresser_king/article/details/46324977
  10. http://blog.csdn.net/wuxiaoming1733/article/details/79037812
  11. http://blog.lmorchard.com/2013/11/27/entity-component-system/
  12. http://piemaster.net/2011/07/entity-component-primer/
  13. http://www.richardlord.net/blog/ecs/what-is-an-entity-framework.html
  14. http://blog.csdn.net/qq992817263/article/details/78155443
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看