Unity的Ecs出入练习

120 阅读2分钟

最近也是离职了,总结下上次工作使用的技术,并写个文章帮大家快速入门这个技术(背景:多单位下Mono模式开发发的开销较大,所以使用Ecs是个不错的选择,),多单位下不建议使用物理相关的组件,当然碰撞盒子可以使用,用来检测碰撞,废话不多说,现在开始入门,哈哈 1.打开你的unity,新建一个空项目 2.导入所需要的包,找不到的建议看下官网docs.unity3d.com/Packages/co…

按照包名添加 com.unity.entities ,和com.unity.entities.graphics 如下图

在项目中点击 窗口-->包管理器, 然后安装

image.png

3.安装成功后会在顶部出现job的选项

image.png

4.在你的测试场景中 右键---> New Sub Scene -->Empty Scene , 自定义名字,然后你的场景会变成这样

image.png

  1. 在你的主场景中新建一个cube
  2. 开始写脚本 创建一个名为 TestAuthoring.cs 的脚本,继承自MonoBehaviour,代码如下,其中baker是烘培的意思,也就是将一些东西烘培到Ecs中来,先照着代码写
using Unity.Entities;
using UnityEngine;

namespace Script
{
   public class TestAuthoring : MonoBehaviour
   {
       private class TestBaker : Baker<TestAuthoring>
       {
           public override void Bake(TestAuthoring authoring)
           {
           }
       }
    
   }
}
  1. 然后写一个data类, 继承自 IComponentData, ,代码如下
public struct TestData : IComponentData
{
    public float Speed;
}
  1. 将第六步的代码改成如下
public class TestAuthoring : MonoBehaviour
{
    public float Speed;
    private class TestBaker : Baker<TestAuthoring>
    {
        public override void Bake(TestAuthoring authoring)
        {
            Entity entity = GetEntity(TransformUsageFlags.Dynamic);
            
            //添加组件
            AddComponent(entity, new TestData
            {
                Speed = authoring.Speed
            });
            
        }
    }
 
}
  1. 将第五步用的cube挂载TestAuthoring.cs脚本

image.png

10.准备工作完成,现在我们去创建一个单例的mono,

using Unity.Entities;
using UnityEngine;
using UTools;

namespace Script
{
    public class Root : MonoBehaviour
    {
        public GameObject cube;

        private class RootBaker : Baker<Root>
        {
            public override void Bake(Root authoring)
            {
                Entity entity = GetEntity(TransformUsageFlags.Dynamic);

                AddComponent<RootData>(entity, new RootData()
                {
                    TestCube = GetEntity(authoring.cube,TransformUsageFlags.Dynamic)
                });
            }
        }


    }

    public struct RootData : IComponentData
    {
        public Entity TestCube;
    }
}

11.挂载root, 将之前做的cube放进去

image.png

12.编写system

using Unity.Entities;
using UnityEngine;

namespace Script
{
    public partial class CubeSystem : SystemBase
    {
        protected override void OnUpdate()
        {
            RootData data = SystemAPI.GetSingleton<RootData>();


          
            Entity entity = EntityManager.Instantiate(data.TestCube);
        }
    }
}

13.之后这样就可以每帧在ecs的场景下创建一个物体了,对了,项目一定要是urp项目哦