unity2019 ECS入門例項:建立一個Entity
Unity2019 ECS 入門例項:建立一個Entity
一. 前言
本篇要實現建立一個實體,並將這個Entity在場景中顯示出來,用ECS框架
來解釋就是建立一個Entity
,併為這個Entity
新增ComponentData
從而完成上述功能.
- 按我的理解
Entity≠GameObject,而 GameObject = (Entity + Component(data) +System)
- 想要在場景中顯示物體肯定要有
Mesh(形狀)
和Material(材質)
,所以我們要做的是為Entity
新增這些Component(資料)
- 這個案例沒有編寫
System(行為)
二. 搭建環境
- 我的Unity版本:Unity2019.4.7LTS
- 使用Window->PackageManage 搜尋Entities,點選Install,記得勾選
show preview packages
- 同理安裝Jobs,Mathematics,Hybrid Render
- 安裝完成後即可開始編碼了,以上步驟有問題可以自行搜尋對應的問題或者留言
三. 編碼實現建立一個Entity,並在場景中顯示
在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
確實已經存在了,那就說明場景中應該是有的,只能說我們沒找到。
四. 問題解決
在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’s Blog
相關文章
- ECS開放批量建立例項OpenAPIRunInstancesAPI
- 雲伺服器ECS使用OpenAPI管理ECS:使用OpenAPI彈性建立ECS例項伺服器API
- Jquery入門及例項一jQuery
- React 入門-寫個 TodoList 例項React
- 24 個例項入門並掌握「Webpack4」(一)Web
- javascript如何建立一個物件例項JavaScript物件
- 阿里雲伺服器ECS例項建立記錄阿里伺服器
- TypeScript入門例項TypeScript
- Websocet 入門例項Web
- SoapUI入門例項UI
- Flutter 入門例項Flutter
- Kafka入門例項Kafka
- Struts入門例項
- Vue入門指南-01建立vue例項 (快速上手vue)Vue
- oracle手動建立另外一個例項Oracle
- vue 快速入門的三個小例項Vue
- vue快速入門的三個小例項Vue
- Struts2中一個簡單的入門例項
- 如何建立一個新的SQL Server例項SQLServer
- React 入門例項教程React
- ActiveMQ 入門及例項MQ
- PHP框架Yii系列教程(一):入門例項PHP框架
- ECS例項RAM角色實踐
- EasyUI - 一個簡單的後臺管理系統入門例項UI
- c#如何只能建立類的一個例項(一)C#
- AS3 快速入門篇------使用ActionScript 建立物件例項小結S3物件
- opengl簡單入門例項
- Django+MySQL 例項入門DjangoMySql
- Vue專案入門例項Vue
- React入門學習例項React
- vue入門筆記體系(一)vue例項Vue筆記
- 24 個例項入門並掌握「Webpack4」(二)Web
- 24 個例項入門並掌握「Webpack4」(三)Web
- python獲取aliyun ECS例項Python
- [Python入門]:Python簡單例項100個(入門完整版)Python入門看這個一套搞定!!Python單例
- 為同一個資料庫建立新的例項資料庫
- SQL Server 2000 如何建立一個新例項 ?SQLServer
- Entity Framework Core 2.0 入門Framework