Unity2019 ECS入門例:エンティティの作成
I.はじめに
エンティティの作成を実現するためのBenpianであり、このエンティティがシーンに表示されECS框架
ます。説明は、を作成することです。Entity
これは、上記の機能を完了するためにEntity
追加さComponentData
れます。
- 私の理解によると
Entity≠GameObject,而 GameObject = (Entity + Component(data) +System)
- 確かにシーン内のオブジェクトを表示したいしている
Mesh(形状)
とMaterial(材质)
、私たちがしなければならないようですEntity
これらを追加Component(数据)
- このケースは書かれていません
System(行为)
2.環境のセットアップ
- Unityの私のバージョン:Unity2019.4.7LTS
- [ウィンドウ]-> [パッケージ管理]を使用してエンティティを検索し、[インストール]をクリックします。忘れずに確認してください
show preview packages
- 同様に、Jobs、Mathematics、HybridRenderをインストールします
- インストールが完了したら、コーディングを開始できます。上記の手順で問題が発生した場合は、対応する問題を検索するか、メッセージを残すことができます。
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
シーンに表示されない場合は、彼のデータセットに問題があることを意味します。
- シーンに新しいものを作成し
Cube
、ConvertToEntity
スクリプトを追加します - 実行して開き
Entity Debugger
、変換されたEntity
データを確認し、さらにいくつかのデータがあり、データタイプがすべてrender bounds
関連していることを確認します - 以下のための
Entity
追加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へようこそ