UnityECS学习日记二:HybridECS(混合ECS开发)与PureECS(纯ECS开发)

UnityECS框架又分为:

HybridECS(混合ECS开发):这个会和原来的MonoBehaviour组合开发,中间需要一层代理来实现,性能肯定不如PureECS。

PureECS(纯ECS开发):这就要你重新接受一种新的开发思维,性能最好。

注意:我使用为Unity2019.1.6f1版本 ,直接在包管理器中使用Entities33版本目前我这最高的,有的人左下角loading加载时间太长,可以通过科学上网或者将直接使用项目来做。

刚开始学习UnityECS使用的是,HybridECS(混合ECS)开发方式。

 


 

Entity:只有id和version的小结构体。

EntityManager: Entity的创建、数据设置、销毁和管理。

World:一切组件的容器(系统默认我们创建一个),保存着一个EntityManager和一堆ComponentSystem(组件系统),默认情况下游戏启动时会为我们创建一个World并通过反射把所有的ComponentSystem(组件系统)类加进去。

NativeArray(本地内存):将native内存buffer暴露到managed code,从而使得managed跟native之间共享数据(可以理解Unity内置封装的非托管内存,注意平时c#开辟的空间都大多数都是使用的托管内存,受到自己的内存回收机制管理。具体详情使用的时候会提到


案例一:混合ECS(HybridECS)控制一个Cube向上移动(Scene1)

 

组件数据:MoveComponentData

 

using Unity.Entities;
using Unity.Mathematics;

// 可序列化一定要加
[System.Serializable]
public struct MoveComponentData : IComponentData
{
    // 注意: ECS框架数据都是用结构体进行封装。
    // 类似 unity中的vector3这个类型 unity这里单独把他封装到了 Unity.Mathematics, 可以进入到命        
    // 名空间中看它的定义封装了很多数据类型。
    public float3 vector3;
}

 

 

组件系统:MoveComponentSystem

using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;

public class MoveComponentSystem : ComponentSystem
{
    // 类似 Monobehaviour中的Update 只要继承 ComponentSystem, Entity框架就会自动执行OnUpdate
    protected override void OnUpdate()
    {
        // 类似Monobehaviour中的 GameObject 的查找方式(  遍历整个 World.Active 一个Scene一个        
        // World 通过匹配数据组件方式返回符合条件的 实体(Entity,我的个人猜想),
        Entities.ForEach((ref Translation translation, ref MoveComponentData moveComponentData) =>
        {
            //这里可以想像,符合条件的实体已经被筛选出来了,我们要对起位置进行操作
            //我们要更改对应实体的 MoveComponentData 的数据
            moveComponentData.vector3 += new float3(0, 1, 0) * Time.deltaTime;
            //然后把更改的值赋值给
            translation.Value = moveComponentData.vector3;
        });

    }

}

代理:MoveProxy

using Unity.Entities;

// 代理类主要负责与传统Monobehaviour开发方式进行组合
public class MoveProxy : ComponentDataProxy<MoveComponentData>
{
    
}

然后创建一个Cube将MoveProxy代理类添加到Cube上,在Inspector将会系统会自动添加一个GameObjectEntity类,其下可以看到ECS框架中各种功能,另外Cube还要手动添加 ConvertToEntity组件,将物体转化为实体(Entity)类型的对象这样才能运行。如下图:

UnityECS场景物体观察需要在untiy菜单栏 Window / Analysis/Entity Debugger 中,如下图:

Unity还提供了第二种代理方式:

代理方式二:NewMoveProxy

using UnityEngine;
using Unity.Entities;
using Unity.Mathematics;

[RequiresEntityConversion]  // 添加特性
public class NewMoveProxy : MonoBehaviour, IConvertGameObjectToEntity
{
    // 这里将参数暴露给外部 方便初始化值
    public float3 Vector3;
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var data = new MoveComponentData();
        data.vector3 = Vector3;
        dstManager.AddComponentData<MoveComponentData>(entity, data);
        
        // 通过此方式可方便给该实体添加 数据组件并初始化

    }

}

 

如下图,将新的代理类添加给cube,系统不再会自动添加 GameObjectEntity 这个组件,说明cube通过代理方式已经被标记成为实体(Entity 个人猜想),然后便可以运行程序,组件系统(Component System)依旧是用的 MoveComponetSystem。 

Unity不仅提供了不同代理,也提供了不同的 筛选器(Query)

 组件系统:EntityQuery_MoveComponentSystem

 

using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;

public class EntityQuery_MoveComponentSystem : ComponentSystem
{
    EntityQuery EntityQuery;
    protected override void OnCreate()
    {
        // 将筛选条件进行创建
        EntityQuery = GetEntityQuery(typeof(Translation), ComponentType.ReadOnly<MoveComponentData>());
    }
    // 类似 Monobehaviour中的Update 只要继承 ComponentSystem, Entity框架就会自动执行OnUpdate
    protected override void OnUpdate()
    {
        // 类似Monobehaviour中的 GameObject 的查找方式(  遍历整个 World.Active 一个Scene一个 
        //World 通过匹配数据组件方式返回符合条件的 实体(Entity,我的个人猜想),
        Entities.With(EntityQuery).ForEach((ref Translation translation, ref MoveComponentData moveComponentData) =>
        {
            //这里可以想像,符合条件的实体已经被筛选出来了,我们要对起位置进行操作
            //我们要更改对应实体的 MoveComponentData 的数据
            moveComponentData.vector3 += new float3(0, 1, 0) * Time.deltaTime;
            //然后把更改的值赋值给
            translation.Value = moveComponentData.vector3;
        });

    }
}

 

 

这种筛选器只是unity提供的一种,unity提供了很多不同种类的筛选器,可以类比transform的查找功能方便你去具体控制哪个或者那些实体。

 

远程仓库(github):https://github.com/h1031464180/UnityECS    本案例参考 scene1

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值