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
相關文章
- frida 建立一個ArrayList例項
- 阿里雲伺服器ECS例項建立記錄阿里伺服器
- React 入門-寫個 TodoList 例項React
- 24 個例項入門並掌握「Webpack4」(一)Web
- Websocet 入門例項Web
- Flutter 入門例項Flutter
- TypeScript入門例項TypeScript
- SoapUI入門例項UI
- Vue入門指南-01建立vue例項 (快速上手vue)Vue
- [Python入門]:Python簡單例項100個(入門完整版)Python入門看這個一套搞定!!Python單例
- Django+MySQL 例項入門DjangoMySql
- Web Components 入門例項教程Web
- Vue專案入門例項Vue
- opengl簡單入門例項
- vue入門筆記體系(一)vue例項Vue筆記
- 24 個例項入門並掌握「Webpack4」(二)Web
- 24 個例項入門並掌握「Webpack4」(三)Web
- Entity Framework Core 2.0 入門Framework
- 【Oracle】ASM例項安裝入門OracleASM
- MyBatis基於Maven入門例項MyBatisMaven
- Python——astroplan庫入門例項(二)PythonAST
- React入門例項參考阮一峰部落格React
- 怎樣使用阿里雲國際版ecs例項建立單個雲盤快照-Unirech阿里雲代充阿里
- 2、Entity Framework Core 3.1入門教程-建立資料庫和遷移Framework資料庫
- Python入門基礎知識例項,Python
- OpenGL入門(1)——建立一個OpenGL專案
- ActiveMQ入門系列二:入門程式碼例項(點對點模式)MQ模式
- 雲容器例項服務入門必讀
- iOS架構入門 - MVC模式例項演示iOS架構MVC模式
- 超級簡單入門vuex 小例項Vue
- SpringMVC 框架系列之初識與入門例項SpringMVC框架
- vue3官網介紹,安裝,建立一個vue例項Vue
- 在ECS上輕鬆搭建RDS的從例項
- 確保您擁有一個獨一無二的例項:單例模式的建立方式單例模式
- Laravel 2.2 建立 Application 例項LaravelAPP
- java反射方式建立例項Java反射
- Python函式每日一講 - frozenset集合函式入門及例項Python函式
- react-dva學習 --- 用例項來入門React