Unity_Dots_ECS_001

教程

0.0准备工作

0.1 导入Package

  • Entitis(v0.11.2)
  • Burst(v1.3.0)
  • Jobs(v0.2.10)
  • Mathematics(v1.1.0)
  • Collections(v0.9.0)
  • HybridRenderer(v0.5.2)

1.0 创建基本ECS结构

1.1生成Entity

Testing.cs

using UnityEngine;
using Unity.Entities;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;
        Entity entity = eM.CreateEntity(typeof(LevelComponent));

        eM.SetComponentData(entity, new LevelComponent { level = 10 });
    }
}

1.2 创建Component

LevelComponent.cs

using Unity.Entities;
public struct LevelComponent : IComponentData
{
    public float level;
}

运行效果

Entity1
Level = 10



1.3 创建System

LevelUpSystem.cs

using UnityEngine;
using Unity.Entities;

public class LevelUpSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        Entities.ForEach((ref LevelComponent levelComponent) =>
        {
            levelComponent.level += 1f * Time.DeltaTime;
            Debug.Log(levelComponent.level);
        });
    }
}

运行效果

在这里插入图片描述


2.0 Component

2.1 添加多个Component

Testing.cs

  • 生成一个具有两个Component的Entity
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;

        EntityArchetype entityArchetype = eM.CreateArchetype(
            typeof(LevelComponent),
            typeof(Translation)
            );
        Entity entity = eM.CreateEntity(entityArchetype);

        eM.SetComponentData(entity, new LevelComponent { level = 10 });
    }
}

运行结果

在这里插入图片描述


2.2 生成2个Entity

Testing.cs

  • 生成两个分别具有两个Component的Entity
  • 两个Entity分别具有随机Level值
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;

        EntityArchetype entityArchetype = eM.CreateArchetype(
            typeof(LevelComponent),
            typeof(Translation)
            );

        NativeArray<Entity> entityArray = new NativeArray<Entity>(2, Allocator.Temp);

        eM.CreateEntity(entityArchetype, entityArray);
        for (int i = 0; i < entityArray.Length; i++)
        {
            Entity entity = entityArray[i];
            eM.SetComponentData(entity, new LevelComponent { level = Random.Range(10, 20)});
        }
        entityArray.Dispose();
    }
}

运行结果

在这里插入图片描述


2.3 生成2000个Entity

Testing.cs

  • 将数组数量扩充到2000,注释掉LevelComponent中的Debug输出
        NativeArray<Entity> entityArray = new NativeArray<Entity>(2000, Allocator.Temp);

运行结果

在这里插入图片描述


3.0 Render

3.1 渲染一个cube

  • 添加RenderMeshRenderBounds
  • 将Array数量改成1

Testing.cs

using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;

public class Testing : MonoBehaviour
{
    [SerializeField] Mesh m_Mesh;
    [SerializeField] Material m_Material;

    private void Start()
    {
        EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;

        EntityArchetype entityArchetype = eM.CreateArchetype(
            typeof(LevelComponent),
            typeof(Translation),
            typeof(RenderMesh),
            typeof(RenderBounds),
            typeof(LocalToWorld)
            );

        NativeArray<Entity> entityArray = new NativeArray<Entity>(1, Allocator.Temp);

        eM.CreateEntity(entityArchetype, entityArray);
        for (int i = 0; i < entityArray.Length; i++)
        {
            Entity entity = entityArray[i];
            eM.SetComponentData(entity, new LevelComponent { level = Random.Range(10, 20) });

            eM.SetSharedComponentData(entity, new RenderMesh()
            {
                mesh = m_Mesh,
                material = m_Material,
            });
        }
        entityArray.Dispose();
    }
}

运行结果

在这里插入图片描述


4.0 Translation

4.1 使物体向上平移

  • 添加新的System用于移动物体
  • 做法与LevelSystem类似

MoveSystem.cs

using Unity.Entities;
using Unity.Transforms;

public class MoveSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        Entities.ForEach((ref Translation translation) =>
        {
            translation.Value.y += 1f * Time.DeltaTime;
        });
    }
}

运行结果

在这里插入图片描述


4.2 设置移动速度

  • 创建控制移动的Component
  • 做法与LevelComponent类似

MoveSpeedComponent.cs

using Unity.Entities;
public class MoveSpeedComponent : IComponentData
{
    public float speed;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值