はじめに
Unityの勉強を初めてみて、最新の技術はどれくらい進んでいるのだろうと気になったのでUnite Tokyoのセッションをいくつか見た感想を残しておきます。
Unite TokyoはYoutubeの ↓Unity Japanチャンネル に動画があり、いくつかセッションは終わった後も見ることができます。
https://www.youtube.com/channel/UCCdskievdAtH6AtPeEfTqEg
Unite Tokyo 2019を中心に見ていきました。
HP↓ にはセッションのスライドも公開されています。
https://learning.unity3d.jp/event/unite-tokyo-2019/
Unite Tokyo 2019
バンダイナムコスタジオ流Unityの使い方 - Unite Tokyo 2019
バンダイナムコスタジオさんで開発しているいくつかのアプリに関してのUnityの活用法が紹介されている。
配信前のアセットを本番環境に入れしまうというミスが発生している。
そのため、各アプリでそれぞれ対応をおこなっている。
対応は、フォルダーを分けたり、マネージャーを作成したり、入れるAssetBundleを制御する仕組みなど。
(今はAddressable Assets Systemがあるためもう少し楽に実現できるかも?とのこと)
対策は、**「人とのやり取りでミスをなくすのは限界があるので、機械的な仕組みを導入する必要がある」**という話をされており、どんなソフトウェアでの運用でも共通の概要のように感じる。
UnityのバージョンアップはAssetBundleの再生成と確認が大変だったとか。
「アイドルマスター ミリオンライブ! シアターデイズ」というアプリでは、アセット数が2年運用で6600から33000になり、デプロイに何台ものPCを使うほど大きな規模のアプリだが、AssetBundleの再生成をするとユーザーがAssetBundleを再DLしなければならなくなった。
再DLの際は、別の機能(13人ライブ機能)を追加することでユーザーに納得してもらう形で再DLを促したとのこと。
感想
いくつかのセッションを聞くと、
- UnityのAssetBundleは闇
- 運営後のUintyのバージョンアップは大変なので慎重に行うこと(基本的に運用後のバージョンアップはしない)
は共通の理解のようだ。
AssetBundleについては、今更誰も教えてくれない、Unityにおけるアセット読み込みについての基礎知識
が分かりやすいが、「実行時に外部からアセットがロードできるようになる。Webサーバーにアセットを置いておけば外部からの差し替えが可能になる」という仕組みでスマホゲームでは必須の技術なんだそう。
〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介 - Unite Tokyo 2019
「七つの大罪 光と闇の交戦」というアプリでアニメーションの表現に近づけるためにキャラのモデリングや効果などをどう工夫したかが紹介されている。
LightingやShadingは、アニメーションは感情がより伝わるよう非現実的な陰影設定がされているため、実装でも照明方向に関係なく同一の明くらいにする(Cell Shadingを使うと照明の方向が固定され、キャラの方向によっては不自然な陰影ができてしまうそう)。
眉毛は、アニメーションはキャラの特性を表すため髪に隠れていても見えるようになっているため、実装でも髪の毛・顔・見える眉毛(髪の毛にない)・髪の毛の上にある眉毛の順で描写し見えるようにする。
など、アニメーションに近づけるような工夫が紹介されていた。
また、表情は全てのキャラで同一のBlend値を使用しているため同じアニメーション情報でそれぞれのキャラクターが同じ表情ができるようにしているのだそう。
Blend値?という状態だったので、以下を参考に視聴していた。
簡単にモーションをブレンドして使えるBlend Tree【Unity】
Behabior Tree Systemを用いて、既存コードを修正することなく機能追加・改善ができるような作りをしているとのこと。
Behabior Tree Systemとは計画実行の数学モデルで、行動を木構造で表すためキャラクターAIなどで使われるそうだ。(恥ずかしながら初めて聞いたので、)以下を参考にしてみてください。
Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
[Behavior Tree] ワタシハ ビヘイビアツリー チョットデキル
さらにゲームのバランスの有効範囲の生成に回帰分析を使っており、統計学を用いているのだそう。
感想
最先端のゲームがどこにこだわっていて、どういった技術をつかっているかが垣間見えるセッションだった。
数学モデルや統計学を使っているのをみると、ゲームもAIや機械学習をどんどん取り入れていようとしているのが分かる。
因みにUnite Japan 2019の中で一番再生回数が多いセッション。
『SINoALICE -シノアリス- 』〜 それは最速のゲーム起動 〜 - Unite Tokyo 2019
ボトルネックに対して対策の紹介がされている。
ボトルネック
- マスタデータの種類が多く、一部のマスタデータのサイズが大きい
- ファイルチェック回数が多い
- 動画が重い
の対策として
- マスタデータ取得API実行後、サーバープログラム上で除去して返却することで、マスタデータをフィルタリングする。AssetBundleなどは随時ダウンロードに変更する。
- リソースファイルのファイルチェック&ダウンロードは更新があった時のみ行う。
- 動画も随時ダウンロードをし、プログレスバーを付ける。
を行った所、起動が早くなったとのこと。
プログレスバーの表現についても検討されていて、
プログレスバーは単数で表示するのが一番早く感じるとのこと。
プログレスバーがない場合や複数あると長く感じる。
感想
性能改善は小さいところから少しずつ行った結果なのだと分かる。
プログレスバーの表現を検討しているところを見るとUIでの体感が変わる点も面白いと感じた。
中の人がいない!? 音声対話型AIサービスを使ったバーチャルキャラクターの作り方 - Unite Tokyo 2019
音声対話型AIサービスはドコモAIエージェントAPIのことで、自作の音声対話エンジンでAIMLを拡張したものだそう。
このドコモAIエージェントAPIを使って、音声対話の体験ができるようVR握手会を実装したとのこと。
VR握手会では、
会話の目的がないので、AIが人の発話を誘導することで対話を成立させるようにした。
声の特徴から非言語情報を取得する非言語情報認識エンジンRexSenseを使って、性別・感情・意図をつかむようにする。
キャラクター性としてツンデレを選択し、ツンデレフレーズの学習・音声合成でつっかえ表現を工夫(難しい)・一部音声収録したものを流すなどを行い、ツンデレキャラを確立させた。
感想
ドコモAIエージェントAPIの使い方を説明されていたので、実際に使ってみました。
[Unity+Live2D]ドコモAIエージェントを使ってLive2Dモデルと会話してみた
ノンプログラミングでも簡単に対応可能で、対話を作るうえで分かりやすいUIだったこともあり、使いやすく感じました。
Unite Japan 2018
2018も少し見たので、ちょっとだけ紹介。
【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
ざっくりいうとAndroidでの最適化の話。
いくつか覚えておきたいフレーズがあったので、記載する。
頭で判断せず、手を沢山動かす
勿論、最適化アイデアの優先順位付け・実装・ビルド&計測・アイデアだしのPDCAを回しているうえで、改善のアイデアは数μSecの改善でも試す、勝算がなさそうでもとりあえず試してみるという精神で取り組んでいたそう。
そうすることで、最適化の積み重ねで全体の負荷を下げることで実現できたとのこと。
その結果・・・
塵も積もれば(3Dモデルが)13人踊る!
ということで特別な実装無しで実現できたのだそう。
最適化は小さなことから少しずつでもたくさんやれば大きな効果になるというのが良くわかる話だった。
また、最適化では
- 最適化の工数は事前に見積もる
- 効果の見える化(数値化)しよう
- コードネームを付けると楽しく最適化できる!かも
と話していた。
また、キャラのDraw Callを減らすための**試行錯誤の過程「Unityの描画プロセスを仮説し、ネイティブ実装ならどう実現するか考えてからUnityで試してみる」**が素晴らしかった。
具体的には、
Unityはブラックボックスだが、描画のプロセスは一般的な描画のプロセスと近しいものを使っている。
↓
メッシュを作るメソッドの中でサブメッシュの指定なメソッドを見てサブメッシュはインデックスバッファーであり、メッシュは頂点バッファを1つ持っていて複数のサブメッシュで小分けに描写しているという仮説にたどり着く。
↓
自分でどう実装するか考えると仮説は正しそう。
↓
ネイティブ実装ならインデックスバッファー(サブメッシュ)を1つにまとめると思い、Unityで同じようなことができないか試行錯誤する。
↓
全てのサブメッシュをコレクションにコピーしていれたものを1つのサブメッシュとして新たに追加、でできた。
結果、Draw Callが8減少した。
といった過程を経て、最適化を実施したそう。
締めとして
Unityの仕様を眺めているだけではだめ
ネイティブ実装の知識を生かした高速化が必要
と話していた。
感想
試行錯誤の過程は、技術者がどのように考えているか見れて面白かった。
単語を調べながら視聴していた。
ブレンドシェイプ
てとら、モデルをつくる。 ブレンドシェイプで表情を与える #2
被写界深度、Bloom
ゲームの質を劇的に上げる描画の5つの手法解説【AA, DoF, Bloom, AO, Motion Blur】
MSAA
【Unity】アンチエイリアシングの概説(SSAA / MSAA / FXAA / TemporalAA)
メッシュ
Unity : マテリアル、メッシュ、シェーダの関係まとめ
フラスタムカリング
なぜなにリアルタイムレンダリング
(CRI ADX2を使っているとあったが、タイトル月間売り上7000万以上で月80万とのことなので、サウンドミドルウェアでそれだけかかるとわかってもっと有難く聞こうと思いました)
【Unite Tokyo 2018】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
デザイナーとプラグラマーのワークフローを分けて、同時作業した方が効率が良い。
ただ完全に分離するのではなく、プログラマーはデザイナーをサポートし、サポートするためのツールを作ったりすべき。
同時作業をするとワークフローレベルで競合を阻止できないため一個下の層、データを分割する必要がある。
そのため、独立したUIシーンを作ったり、必要な情報だけ抽象化しバスに飛ばしバスの接続先で処理するなどしてデザイナーがデバックなど行いやすい環境を作るなどしてコード・データの疎結合を目指す必要があるという話。
疎結合は抽象化が必要で、**C#の抽象化というのは、
- IF化:処理側が処理のタイミングを決める
- イベント化:情報元が処理のタイミングを決める
を使い分けるとのこと。**
感想
C#の抽象化のまとめが分かりやすくて良かった。
普段C#開発を行っているのでUintyプロジェクトでのMVVMの実現は気になる。
スライドで紹介のあったData Binding Architectures for Rapid UI Creation in Unityを時間があれば見ておきたい。