Slide 1

Slide 1 text

1

Slide 2

Slide 2 text

自己紹介 土鍋 @donadonadonabe XR・Unityエンジニア 大学: 会津大学→筑波大学大学院 活動: XR技術で様々な作品開発・ハッカソン出場&受賞 ポートフォリオ: https://donabe.myportfolio.com 2

Slide 3

Slide 3 text

都市開発シミュレーションゲームを作りながら ECSを理解していく 今回のコンセプト

Slide 4

Slide 4 text

1. ECSとは 2. 都市開発シミュレーションゲームとは 3. 住民を作る 4. 店を作る 5. 住民が訪問する 6. 使ってみた所感 目次

Slide 5

Slide 5 text

ECSとは? ECS→Entity Component Systemの略 UnityではDOTS(Data-Oriented Technology Stack)と言ったりする 昨年正式リリース データ指向アーキテクチャを取り入れて 大量のオブジェクトを扱うような場面でのパフォーマンスの高さが売り 使用したバージョン: Unity6 & Entities 1.3.6 5

Slide 6

Slide 6 text

従来のUnityとの違い GameObject Component - Data - Method Component - Data - Method Entity Component - Data System - Method Component - Data System - Method 6

Slide 7

Slide 7 text

SubSceneとBake MeshFilter Rigidbody UserScripts SubScene(従来のように扱える) Chunk Chunk Chunk Chunk Chunk ECS Archetype Chunk Chunk Chunk Chunk Chunk Archetype 7

Slide 8

Slide 8 text

従来のUnityとの違い ランダムなメモリアクセスは大量のデータを扱うには非効率 8 はじめての Unity ECS - Entity Component System を使ってみよう!(Unity公式Youtubeより)

Slide 9

Slide 9 text

IComponentData IComponentDataを実装 従来はMonoBehaviour継承クラス内で コードを書く Unityエディタで変更した数値を ComponentDataに変換するためだけの クラス 9

Slide 10

Slide 10 text

System ISystemを実装して実際の機能記述 従来のUnityでは実行するために シーン上のGameObjectにアタッチする必要が あったが、 ここでは必要ない 10

Slide 11

Slide 11 text

Burst Compiler C#→IL→(Burst Compiler)→CPU演算向け最適化を行ったアセンブリ [BurstCompile]Attributeをつけるだけ 本来は様々な制約があるが、UnityECSではそれを守れるような工夫がされている 11

Slide 12

Slide 12 text

C# JobSystem Unityで並列処理するための機能。 従来1スレッドで行っていた通常処理を 自動的に複数スレッドに分割してくれる。 Burstコンパイラに最適化されています。 12

Slide 13

Slide 13 text

Profilerの結果 これらを適用することで・・・ 13

Slide 14

Slide 14 text

どんなゲームに最適か? ビジュアルノベル ✘ 脱出ゲーム ✘ シミュレーションゲーム ◯ シューティングゲーム ◯ サンドボックスゲーム ◯ 14

Slide 15

Slide 15 text

どんなゲームに最適か? ビジュアルノベル ✘ 脱出ゲーム ✘ シミュレーションゲーム ◯ シューティングゲーム ◯ サンドボックスゲーム ◯ 15

Slide 16

Slide 16 text

都市開発シミュレーションゲーム 作ってみたい!! 16

Slide 17

Slide 17 text

都市開発シミュレーションゲームとは その名の通り、都市開発をシミュレーションするゲームで、 資金を用いて建物や道路を建設し、経済を回し、街を発展させていくのが目標 最近のものは住民一人一人をシミュレーションし、 本当に自分の作った仮想の街に住民が暮らしているような感覚になる 17

Slide 18

Slide 18 text

都市開発シミュレーションゲームとは 18

Slide 19

Slide 19 text

都市開発シミュレーションの要素 ● 建物 ○ 店 ○ オフィス ○ 工場 ○ 公共施設 ○ インフラ ● 住民 ○ 所持金 ○ 需要 ○ 住所 ● 道路 ○ 道路沿いに建物建築 ○ バス 19 ● 鉄道 ○ 駅 ○ 車両運用 ○ ダイヤグラム ● 資源 ○ 建設に必要 ○ 採掘 ● 経済 ○ 市の予算 ○ 税金

Slide 20

Slide 20 text

ECS向きなのでは? ECS ● 大量のエンティティの処理に向いている。 ● データ指向 都市開発シミュレーション ● 大量の住民や経済をシミュレーションする ● 住民や建物などデータ構造がはっきりしている。 ECSに超最適なのでは!? 20

Slide 21

Slide 21 text

SubSceneの作成 21

Slide 22

Slide 22 text

住民を作っていく IComponentDataを実装していく ● 所持金 ● 需要 ● 移動スピード ● 目的地 ● 住所 22

Slide 23

Slide 23 text

住民を作っていく MonoBehaviour継承なので インスペクターから参照可能 自動的にEntityにBakeされる 23

Slide 24

Slide 24 text

店を作る 今回は特に大きな役割はない (住民が移動先を見つけるタグ的役割) 今後は 住民が従業員として働き お金を稼げるような仕組みを 組み込みたい 24

Slide 25

Slide 25 text

住民の移動 25

Slide 26

Slide 26 text

EntityQuery 指定されたコンポーネント・タイプのセットを持つアーキタイプを持つ。 アーキタイプのチャンクを配列に集める。 ISystemのOnCreateメソッド→UnityのStart相当 SystemStateからEntityQueryを取ってこれる。 26 [BurstCompile] public void OnCreate(ref SystemState state) { _buildingQuery = state.GetEntityQuery (typeof(LocalTransform ), typeof(BuildingBase)); }

Slide 27

Slide 27 text

住民の移動 C#ジョブシステムによる Update処理 → Executeメソッド 住民が目的地を設定し 移動する。 27

Slide 28

Slide 28 text

28

Slide 29

Slide 29 text

ひとまずできたもの 1. 住民の需要が自然増加する (今回はいったん食欲のみ) 2. 一定に達すると住民は店を訪れる (今は食料品の店しかない) 3. 住民の現在地から一番近い店に向かう 4. 店でその需要を満たすと家に帰る 29

Slide 30

Slide 30 text

Tips インスペクターにリアルタイムの値が反映されない リアルタイムの値を見るには 右上の丸いボタンから Runtimeに変える必要がある 30

Slide 31

Slide 31 text

Physics Unity ECSによる物理シミュレーション 得意不得意があるが 状況によってはかなり高速化される 住民の訪問する建物の探索をRaycastや OverlapSphereでやろうとしたんですが間 に合いませんでした。 ECS で物理挙動! Unity Physics を使ってみよう! (Unity公式Youtubeより) 31

Slide 32

Slide 32 text

これから開発したいこと ● 建物の種類 ● 需要と供給の創造 ● 建物・道路建設機能 ● 自動発展機能 ○ 産業、観光、交通といった発展条件 32

Slide 33

Slide 33 text

使ってみた所感 ● 情報が少なすぎる ● 記事があっても今のバージョンでは使えないものが多い ● ただ大量のオブジェクトの処理の高速化のメリットは大きい ● 従来のUnityとの組み合わせもできるらしい ○ 大量のオブジェクトが必要な部分は ECS、そうでない部分は従来通り 33

Slide 34

Slide 34 text

参考文献 Introduction to the Data-Oriented Technology Stack | Unity はじめての Unity ECS - Entity Component System を使ってみよう! Unity ECS で高速化!とりあえずキャラを 5,000 体出してみよう! 【Unity】 ECS まとめ(前編) - エフアンダーバー 【Unity】EntityとGameObjectを連携したい - Qiita Iterate over component data with IJobEntity | Entities | 1.0.16 Using IJobEntity jobs | Entities | 0.50.1-preview.2 【Unity】C# Job Systemを自分なりに解説してみる - テラシュールブログ 34