テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ECS

【Unity】GameObjectもECSも使いたい Hybrid ECSについて

ECSは現状正直な所、物量が必要な部分をECSで試して大まかな部分は既存のMonoBehaviourやUnityEngine系のコンポーネントを使うのがベターな回答です。今回はECSとGameObjectを連携させる手法についてを紹介します。 検証バージョン:Unity 2019.3、Entities …

【Unity】ECSでもNavMeshを使って移動範囲を限定したい

ECSでNavMeshを使いたい 先日行われた1WeekGameJamの実況にてユニティちゃんが走り回るゲームがあり、それを見て何となくECS(SubScene)でもNavMeshによる移動制限を使用したいと思ったので、やり方を考えてみました。 考え的には大昔に書いたマップから落…

【Unity】ISystemStateComponentDataという機能

今回は微妙に詳細な説明のないISystemStateComponentDataという機能を紹介します。 EntityがDestroyされても破棄されないコンポーネント Entity生成・破棄のタイミングで処理を一回実行する 初期化時の処理(Awake的な) 初期化後の毎フレーム実行する処理(…

【Unity】ECSのSubSceneでISharedComponentDataを使う

この記事はUnity 2019.2.8f1とEntities 0.1.1 を利用しています。また設計がイケてないので修正されてしまいそうな感じはありますが、現状SubSceneを試す上で知らないで苦労したのでメモします。 SubSceneでISharedComponentDataが使えない とりあえずIShare…

【Unity】ECSで子Entityの”座標”と”向き”を使いたい

子オブジェクトの座標を使いたい LocalToParentを使用する 回転しながら弾を撃つ砲台 キューブを回す 弾を生成 弾を上方向に飛ばす 注意点 関連 このサンプルは Entities.0.1.1およびUnity 2019.2f8を使用しています 子オブジェクトの座標を使いたい Unityで…

【Unity】UnityPhysicsで、オブジェクト同士が接触した判定を取得する

物理演算でオブジェクト同士が接触した時のイベントを発行する方法についてです。 なお、現段階では明らかに低レベルAPIのみしか提供されておらず、未完成です。 この記事は「今すぐ触ってみたい」という人向けで、正直あまり有益ではありません。 接触イベ…

【Unity】GameObjectでもUnity Physicsを使う

試しにRoll a BallをUnity Physicsで作ってみた所、このテクニック無しだと少し面倒な所があったので紹介。 GameObjectでUnity Physicsを使う キャラクターが消えるのを解決する キャラクターが動かない問題を解決する GameObjectでUnity Physicsを使う Unit…

【Unity】新しい物理演算、Unity Physicsについて

Unity Physicsについて紹介します。 Unity Physicsとは? 事前準備 とりあえずシーンを用意 Unity Physicsに移行 ステージのような大量の当たり判定のある物を一気にロード 新しく増えた設定を使いたい パフォーマンス コード制御関係 関連 Unity Physicsと…

【Unity】ECSで複数のComponentGroupを使う場合

複数のComponentGroupを使う 全く異なるComponentGroupを複数定義する場合はRequireForUpdateを使う 設定違いという点で複数のComponentGroupを使用したい場合は、ChunkIterationを考える 感想 複数のComponentGroupを使う ComponentGroupは、Systemが処理す…

【Unity】GameObjectとコンポーネントをEntityとComponentDataに変換してECSで使えるようにする

SubSceneで独自のコンポーネントや、まだ変換先の無いコンポーネントをComponentDataに差し替えるアプローチについてです。 GameObjectベースのデータをECSベースへ変換する GameObjectをEntityへ変換するAPI MonoBehaviourをComponentDataに変換してもらう…

【Unity】Scene上に構築したステージを、Entity群に変換してECSで利用可能にする「SubScene」

ECS 0.0.12 preview 26から、GameObjectとComponentをEntity&ComponentDataに変換する機能が追加されました。まずは、この中で最も便利であろうSubSceneについて紹介します。 GameObjectをECS向けに変換する SubScene 実際に使ってみる 1. 選択したオブジェ…

【Unity】ECSでComponentGroup内のComponentDataを取得する新API、ToComponentDataArrayとCopyFromComponentDataArray

ComponentDataArray(型)が非推奨になり、代わりにToComponentDataArray(...)とCopyFromComponentDataArray()が追加されました。 これは今までのComponentDataArrayと異なり、NativeArrayを取得します。 ToComponentDataArrayとCopyFromComponentDataArray…

【Unity】ECSの「GetSingleton<T>」と「SetSingleton<T>」について

ECSで新しく追加されたAPI GetSingletonと SetSingletonというAPIについてです。 一つだけのComponentDataを取得する機能 実装例 ジョブの終了待ちを行う 感想 一つだけのComponentDataを取得する機能 GetSingleton<T>()とSetSingleton<T>(...)ですが、ComponentDa</t></t>…

【Unity】ECSの新しいAPI「Entities.ForEach」について

ECSで[Inject]属性が非推奨になり、新しいAPIが追加されました。 https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/Documentation%7E/ecs_best_practices.md 個人的に、多少パフォーマンスを犠牲にして簡単になるなら、プロ…

【Unity】小さく、軽く、早い、Tiny Mode(Project Tiny)についてのアレコレ

コンパクトなUnityゲームを出力するTiny Modeのプレビュー版が公開されました。 ということで、早速触ってみます。 この記事はTiny Mode 0.13.2 previewで作成されています。 モバイルブラウザ向けUnity 現状使える機能群 スクリプトはECSベース レンダリン…

【Unity,ECS】他のEntityが持つComponentDataを追跡する - ComponentDataFromEntity

今回もECSの話です。 ゲームでは特定のオブジェクトを追跡するというのはよくある話です。例えばカーソルやユニット、アイテムやパスなど。 ECSでも同様にそういった機構が必要になる事は多々あります。今回はEntityから特定のキャラクターを追跡させる方法…

【Unity】最近ECSで色々と遊ぶ際によくやってる、4つのTips

今回は自分がECSで色々やるときに、よくやっているTipsを3つ紹介します。 パッケージをPackagesに移す inputDepsのチェーン Debug.Logを出す NativeArrayを自動的に開放するジョブ 関連 パッケージをPackagesに移す PackageManagerで導入したパッケージはC#…

【Unity】ECSで配列を格納する Dynamic Buffers

今回はECSで配列を使用する方法についてです。 ECSで配列を使用する ECSに格納するComponentDataには配列を格納出来ません。とはいえ、マネージドなメモリも格納出来るSharedComponentDataは大量の種類を生成するとECSの効率が著しく下がるので余り良くあり…

【Unity】ECSでシーンをロードする様にEntity群をロードする

今回はECSにおけるEntityのセーブ及びロードについてです。 つまりGameObjectをSceneやPrefabに固めるように、Entity(Entity & ComponentData)をファイルとして書き出します。 なおUnity 2019辺りのタイミングでちゃんとしたエディターサポートが始まるの…

【Unity】C# Job Systemからノイズを使う

前回に引き続き、今回はノイズを使用してみます。 ノイズを使用する コード ノイズを使用する 下のような感じの動きを作ってみます。 Mathfは多分メインスレッドでしか動作しませんが、Mathematicsだと別スレッドでも問題なく動作します。 またRandomと異な…

【Unity】ECSの並列処理"IJobForEach"におけるスケジューリングの挙動

デカイ記事を書こうとして中々更新まで辿り着かないので、今回はサクっとECSの並列処理におけるスケジューリングの挙動について書いておきます。 IJobForEach? ECSは参照するComponentDataでスケジュールが決まる 異なるComponentDataへアクセスするジョブは…

【Unity】ECSでチャンク単位のバッチ処理を実現するChunk Iteration、それとEntityQuery

最近のECS界隈で特に理由もなくChunk Iterationを採用されている事をよく見るので、今回そのChunk Iterationついて書いてみます。 ComponentDataの組み合わせの爆発 Chunk Iterationという回避方法 コードを書いてみる 全文 感想 関連 ComponentDataの組み合…

【Unity】ECSの並列処理(IJobParallelForやIJobForEach系)でEntityCommandBufferを使う

今回はECSで並列処理した結果をEntityCommandBufferから削除する方法についてです。以前は出来なかったのですが、最近出来るようになりました。 EntityCommandBufferと非同期処理 EntityCommandBufferと並列処理 コード EntityCommandBufferと非同期処理 使…

【Unity】ECSでSystemの有効化・無効化についてのまとめ

ECSの基本はSystemです。システムというWorld毎にユニークなオブジェクトが多くのEntityを操作することでゲーム表現を実現しています。 ここで気になるのはSystemを動かす方法、及び止める方法についてです。今回はその辺りについて書いてみます。 Default W…

【Unity】ECSで複数のWorldを運用する方法

「デモとしてのECS」が欲しいなら使いませんが「ゲームとしてのECS」が必要なら知っておくと良い、複数のWorld運用についてです。 ECSを”ゲーム”にするためには 複数のWorldを管理する Worldを作成する 動かすWorldを切り替える Tips World.Active Default W…

【Unity】ECSのComponentSystem実行順をコントロールする

今回はECSのComponentSystemも実行順番をコントロールする方法についてです。 ComponentSystemの実行順番は非常に重要 実行順の確認方法 特定のComponentSystemの前に実行する、後に実行する UpdateInGroupで処理のタイミングを大まかに纏める 関連 Componen…

【Unity】ECSのEntityの作成やComponentDataの追加等の操作を別スレッドから実行する

今回はECSのEntityを非同期に作成する方法についてです。主に打規模なシーンのロード等に使用できそうです。 Entityの生成や破棄、削除はメインスレッド上で行う ExclusiveEntityTransaction ExclusiveEntityTransactionを使用しつつEntityManagerも使いたい…

「CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング」

ECSを使い切る上で素晴らしい資料が公開されました。 特にジョブシステム上で色々とやりたい場合には凄い参考になると思います。 【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング from UnityTechnologiesJ…

【Unity】GTMF 2018の資料

GTMF2018の資料です。 SRPの導入方法とメリット、SRPを利用したトリックについて紹介されています。 【GTMF2018TOKYO】ScriptableRenderPipelineでアプリに最適な描画をしよう from UnityTechnologiesJapan www.slideshare.net ECSとC# Job System、Burstに…

【Unity】C# Job SystemからECSのEntityやComponentDataを追加・削除・変更する指示を出す

今回はECSのComponentDataの追加や削除・変更といった動作をJobSystem上から指示する方法についてです。 C# Job SystemからComponentDataの追加・削除等を指示する BarrierSystem サンプルコード IjobParallelFotやIJobProcessComponentDataで使用するには?…