YUTT UP!

Unity大好きエンジニアなブログ

【Unity】Unite2018 Day3 レポート

2018/05/09(水) Unite 3日目行ってきました。

1日目と2日目のレポートはこちら yutt1.hatenablog.com yutt1.hatenablog.com

3日目はあまり下調べしてなかったので、勉強になりそうだと思ったセッション中心に聞いて回りました。

後でTL見たら、どうやらTimeline系のセッションがとてもよかったらしく時間のあるときに確認しようかと思います。

聞いた講演を中心に勉強になったものを書いていきます。

「さては非同期だなオメー!async/await完全に理解しよう」

www.slideshare.net

Unity2017から.NET4.Xが使えるようになり、C#6.0に対応しました。

そこで非同期構文が簡単に書けるasync/await構文についてのセッションです。

私もasync/awaitはTypeScriptで勉強しようとして全く理解できなかったのですが、このセッションを聞いて完全(?)に理解しました。

async/awaitキーワード

キーワード 説明 コルーチンでいうと
async awaitを使うメソッドにつける必要があるキーワード -
await 非同期(async)メソッドを呼び出し、 その完了まで実行を中断するキーワード yield return
Task<T> awaitするためのクラス。GetAwaiterを実装している IEnumrator

私は非同期にしたい関数にasyncつける〜とか思っていたのですが全く違いました(笑)

async/awaitは非同期の処理を待つための仕組みなんですね。

コルーチンとの対応の説明を聞いてすんなり納得しました!

コルーチンより嬉しいこと

コルーチンを使っている方はわかると思いますが、

・コルーチンでは非同期で処理した結果(返り値)を受取るのが難しい。(IEnumrator.Currentでアクセスするしかない)

・コルーチンはネストしていくと扱いが難しくなるため、実装が複雑になる。

・非同期処理内ではUnity APIを使用できない。

とあまり柔軟な書き方ができないです。

Task+awaitではそれが可能になるため嬉しいということですね!

f:id:yutt1:20180513150131j:plain f:id:yutt1:20180513150134j:plain

セッションではこの他にスレッドを管理するSynchronizationContextについての説明もされてました。

あまり深くは言及されませんでしたが、UniRxなどを使って実装する時などは、実行スレッドを意識する必要があるので確認しておくとよさそうです!

「60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計」

www.slideshare.net

スマートフォンゲーム「アカとブルー」は大量の弾幕が飛び交うSTGなのですが、それを60fpsで実現するために行った最適化実装について解説されました。

ただ、正直Unityのパフォーマンスを引き出す実装というよりかは、Unityの機能をなるべく使わないという実装のため、初心者の方はAdvancedな内容として見たほうがよいです。

最適化の基本

最適化 理由
起動元の一つ以外でStart()Update()を実装しない。 UnityはStart()Update()が空実装であっても呼んでしまうのでコストがかかるため。
Monobehavourいらないなら付けない TransformGameObjectの参照コストが発生するため。
calss < struct
List<Array
多次元配列[,] < ジャグ配列[][]
参照速度が早いため。但しList<struct>foreachなど値渡しのオーバーヘッドには注意。
オブジェクトプーリング 生成コストやメモリアローケートを抑えるため。
コンポーネントキャッシュ Unity2017時点では参照コストは低くなったが、まだキャッシュした方が良い。
定数キャッシュ Vector3.zeroなどは生成コストが発生するため

この他に、Vector3の計算系は重いため独自実装を行ったとのことでした。

ちなみにオブジェクトプーリングの実装は非常に勉強になるので、一度確認すると良いです。 github.com

さらにそれを解説した本も出ていて、私も発売日に買って読みましたが、Githubと合わせて読むと理解が深まります。 bootlegstore.stores.jp

アーケードスタイルSTGを重視したCollision実装

Unityのコリジョン判定では、メインスレッドと同期しないため人の目に写ったものと現象と厳密には異なります。

アカとブルーではゲームデザインを重視したため、接触判定を実装したが、その要求がないなら自前実装する必要ないとのこと。

f:id:yutt1:20180513231258j:plain

1パスでSprite描画できるP-MAPブレンド

通常、爆発系のエフェクトなどは、半透明+加算合成によって複数のテクスチャを合成して作られます。

半透明と加算はスプライトのバッチングは行われないため、複数描画した場合、その数分SetPassCallが増加します。

この問題に対して、事前乗算という手法を用いると大量に描画しても1Passで描画できるというものです。

詳しくは↓

[Unity]加算と半透明を1パスにするP-MAPブレンド実用例 - Qiita

私はこれは知らなかった手法であり、嬉しい発見でした!

他にも幾つかゴリゴリな最適化実装について解説されてます。

「そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説」

www.slideshare.net

新機能であるAddresstable AssetsResource Managerについての解説セッションです。

今まで複雑だったAssetBundleの取扱いがとても楽になるのはもちろん、単純にリソース管理においても効率化できそうでとても楽しみです!

現在はPreview版で、2018.2から利用可能になるとのことです。

リソース管理の進化点

この新たなリソース管理フローはResources管理のような簡単さを目指したとのことでした。 f:id:yutt1:20180513233655j:plain

Addresstable Assetsと一言で表してもツールとしてはラベルやグループなど新たな概念を扱うため、スライドも合わせて確認すると良いと思います。 f:id:yutt1:20180513235226j:plain

機能 説明
AssetReference アセットのアドレスをInspectorから簡単に指定できるためのクラス
参照カウント 参照カウントによってリソースやインスタンスのロードや破棄ができる
グループ アセットの配置場所やパッキング方法、ロード方法を決めるカテゴリ
コンテンツカタログ アドレス、ラベル、グループの対応を保持するJsonデータ
ラベル アドレスに付与するタグ的な機能
プロファイル ロード場所やビルド場所を、develop, test, releaseなど用途毎に設定できる
プレイモード エディター実行時のリソースのデータロード仕方を指定できる
RM Profiler アセットバンドル、アドレス付きアセットのロードとアンロード、参照カウント数、ロード方式を可視化

Resource Managerの仕組み

Addressable Assetsがアセットにアドレスを付与することで、アドレスによるロードや管理が出来るようにするシステムでした。

それに対し、Resource Managerはアセットを様々な場所から、非同期でロード・インスタンス化・管理・アンロードを出来るようにするシステムになります。

Resouce ManagerにはResource LocationProviderという仕組みが用意されており、これがリソースの扱いをかなり柔軟にしてくれます。

f:id:yutt1:20180513235736j:plain

機能 説明
Resource Location リソースの所在地や依存関係情報を提供
Resource Provider リソースのロード・アンロード機能を提供
SceneProvider シーンのロード・アンロード機能を提供
Instance Provider インスタンスの生成・管理機能を提供

このProviderの嬉しいところは独自管理方法にしたい際などに、各種Providerにその処理を実装することで実現できることです。

f:id:yutt1:20180514000241j:plain

とても楽しみな機能ですが、その分フローをしっかり理解する必要があるので、要チェックですね!

他の要確認セッション

運営中コンテンツにおける大型アップデート成功のための考え方とUnity最適化手法

【Unite 2018 Tokyo】スクリプトによるTimelineがっつり拡張入門

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyotimeline-96459645

【Unite 2018 Tokyo】スクリプタブルレンダーパイプライン入門

【Unite 2018 Tokyo】C# Job SystemとECS(Entity Component System)解説

Day3感想

Day2と同様に既存の実装において新しい発見はあまりなかったです。

ただ、TimelineやAddresstable Assetsなど機能面での発見が多く、改めてチェックする必要がありました!

以上Uniteレポートでしたノシ

配信アーカイブ

https://www.twitch.tv/videos/259277629

・新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!

スクリプトによるTimelineがっつり拡張入門

・60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計

Windows Mixed Reality 最新アプリ開発情報 ~HoloLens からVRまで~

・Unityの開発サイクルとバグへの取り組みについて

・カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!

・そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説

・Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~