Unity2019 ECSエントリインスタンス:エンティティを作成します

Unity2019 ECS入門例:エンティティの作成

I.はじめに

エンティティの作成を実現するためのBenpianであり、このエンティティがシーンに表示されECS框架ます。説明は、を作成することです。Entityこれは、上記の機能を完了するためにEntity追加さComponentDataれます。

  1. 私の理解によるとEntity≠GameObject,而 GameObject = (Entity + Component(data) +System)
  2. 確かにシーン内のオブジェクトを表示したいしているMesh(形状)Material(材质)、私たちがしなければならないようですEntityこれらを追加Component(数据)
  3. このケースは書かれていませんSystem(行为)

2.環境のセットアップ

  1. Unityの私のバージョン:Unity2019.4.7LTS
  2. [ウィンドウ]-> [パッケージ管理]を使用してエンティティを検索し、[インストール]をクリックします。忘れずに確認してください show preview packages
  3. 同様に、Jobs、Mathematics、HybridRenderをインストールします
  4. インストールが完了したら、コーディングを開始できます。上記の手順で問題が発生した場合は、対応する問題を検索するか、メッセージを残すことができます。

3.エンティティを作成してシーンに表示するためのエンコード

Unityでは、作成またはGameObject変換する方法がたくさんありますEntity。ここでは、主に作成方法を使用します。新しく作成したプロジェクトでは、スクリプトを作成します。CreateEntity.cs

CreateEntity.cs

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

public class CreateEntity : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        manager = World.DefaultGameObjectInjectionWorld.EntityManager;//获取默认世界的实体管理器
        CreateEntityObj();
    }

    // Update is called once per frame
    void Update()
    {
        
    }


    private EntityManager manager;
    private void CreateEntityObj()
    {
        //在EntityManager中提供了public Entity CreateEntity(EntityArchetype archetype);方法
        //在此之前,我们需要一个
        //同样在EntityManager中,有一个 CreateArchetype(params ComponentType[] types);方法
        var archeType = manager.CreateArchetype
        (
            //以下等于规定了Entity中一系列数据类型
            ComponentType.ReadWrite<LocalToWorld>(),
            ComponentType.ReadWrite<Translation>(),
            ComponentType.ReadOnly<RenderMesh>()
        );

        var entity = manager.CreateEntity(archeType);//到此我们就创建了一个entity
        manager.SetName(entity, "cube");//设置一个名字方便观察

        //需要为Entity设置位置,形状,材质等信息,这里的信息可以使用公有变量在检视面板中设置
        //此处直接使用一个标准的数据
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

        //为实体设置数据
        manager.SetComponentData<LocalToWorld>(entity, new LocalToWorld() { Value = Unity.Mathematics.float4x4.zero });
        manager.SetComponentData<Translation>(entity, new Translation() { Value = new Unity.Mathematics.float3(0, 0, 0) });
        manager.SetSharedComponentData<RenderMesh>(entity, new RenderMesh()
        {
            material = cube.GetComponent<MeshRenderer>().material,
            mesh = cube.GetComponent<MeshFilter>().sharedMesh,
            subMesh = 0,
            castShadows = UnityEngine.Rendering.ShadowCastingMode.On,
            receiveShadows = true,
            needMotionVectorPass = true
        });

        Destroy(cube);//临时使用的cube进行销毁
    }
}

だが!取り付けと実行した後、私たちはシーンで望んでいたものを見つけられませんでしたCubeが、Entity Debugger我々はそれを見ることができますEntityが、シーン内の一部でなければなりませんが、我々は唯一の私たちがそれを見つけられませんでしたと言うことができることを意味、それはシーン内に存在しません。

4.問題解決

Entity Debuggerシーンに表示されない場合は、彼のデータセットに問題があることを意味します。

  1. シーンに新しいものを作成しCubeConvertToEntityスクリプトを追加します
  2. 実行して開きEntity Debugger、変換されたEntityデータを確認し、さらにいくつかのデータがあり、データタイプがすべてrender bounds関連していることを確認します
  3. 以下のためのEntity追加RenderBoundsデータを

最初の実行、エンティティ情報
Renderboundsを追加した後

編集後CreateEntity.cs

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

public class CreateEntity : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        manager = World.DefaultGameObjectInjectionWorld.EntityManager;//获取默认世界的实体管理器
        CreateEntityObj();
    }

    // Update is called once per frame
    void Update()
    {
        
    }


    private EntityManager manager;
    private void CreateEntityObj()
    {
        //在EntityManager中提供了public Entity CreateEntity(EntityArchetype archetype);方法
        //在此之前,我们需要一个
        //同样在EntityManager中,有一个 CreateArchetype(params ComponentType[] types);方法
        var archeType = manager.CreateArchetype
        (
            //以下等于规定了Entity中一系列数据类型
            ComponentType.ReadWrite<LocalToWorld>(),
            ComponentType.ReadWrite<Translation>(),
            ComponentType.ReadOnly<RenderMesh>(),
            ComponentType.ReadWrite<RenderBounds>()
        );

        var entity = manager.CreateEntity(archeType);//到此我们就创建了一个entity
        manager.SetName(entity, "cube");//设置一个名字方便观察

        //需要为Entity设置位置,形状,材质等信息,这里的信息可以使用公有变量在检视面板中设置
        //此处直接使用一个标准的数据
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

        //为实体设置数据
        RenderBounds rb = new RenderBounds()
        {
            Value = new Unity.Mathematics.AABB()
            {
                Center = new Unity.Mathematics.float3(0, 0, 0),
                Extents = new Unity.Mathematics.float3(0.5f,0.5f,0.5f)
            }
        };
        manager.SetComponentData<RenderBounds>(entity,rb)//只需添加archerType即可,不需要手动设置数据
        manager.SetComponentData<LocalToWorld>(entity, new LocalToWorld() { Value = Unity.Mathematics.float4x4.zero });
        manager.SetComponentData<Translation>(entity, new Translation() { Value = new Unity.Mathematics.float3(0, 0, 0) });
        manager.SetSharedComponentData<RenderMesh>(entity, new RenderMesh()
        {
            material = cube.GetComponent<MeshRenderer>().material,
            mesh = cube.GetComponent<MeshFilter>().sharedMesh,
            subMesh = 0,
            castShadows = UnityEngine.Rendering.ShadowCastingMode.On,
            receiveShadows = true,
            needMotionVectorPass = true
        });

        Destroy(cube);//临时使用的cube进行销毁
    }
}

私の個人ブログSnail'sBlogへようこそ

おすすめ

転載: blog.csdn.net/weixin_36382492/article/details/109266676