とぐちブログ

VRの研究,作品制作をしています.

【Unite 2017】DIYエフェクト実装: エンジニアレスでエフェクトを組み込める環境づくり


【Unite 2017 Tokyo】DIYエフェクト実装: エンジニアレスでエフェクトを組み込める環境づくり


こちらの講演を見たのでメモします。

エフェクト実装の問題点

・エフェクト再生はゲームロジックと深く結びついている
・ゲームの処理に合わせ、タイミング・位置・再生時間・移動法則など細かい指定が必要
・エフェクトをゲームに組み込むのにはほぼエンジニアが必須

例: 乖離性ミリオンアーサーVR

魔法陣の発生、衝撃波を飛ばす、衝突すると爆発する、など
パーティクルシステムをスクリプト内で宣言、実行
InspectorでPrefab内のGameObjectをアタッチ

Animationに合わせたタイミング調整の要望

AnimationEventを追加して対応
スクリプト側でイベントを受け取る処理を追加

タイミング調整②

剣のオーラを2段階に分けたい
AnimationEventを追加
またスクリプト側でイベントを受け取る処理を追加

エフェクト制作ツールの変更要望

ShurikenからBishamonへ変更
スクリプトの修正が必須
Prefabの更新も必要

ShurikenとBisamonを組み合わせる要望

エフェクト定義を2つに分ける必要がある
Prefabも複雑になる

つまり

このままだとアーティストの要望をエンジニアが実装するまでアーティストが待ち状態になる→繰り返し
細かい調整でもこのサイクルが何度も発生する
双方の時間のムダ

目標

アーティスト観点

好きな制作ツールで好きなエフェクトを自由に制作
特殊なコンポーネントの付加などエンジニア都合のめんどくさいことを極力させない
再生位置・再生タイミングなど、一般的な調整項目をアーティストだけで完結できるようにする
つまり、アーティストだけでだけで以下ができるようにする
・エフェクトの制作
・エフェクトをゲームに組み込み
・エフェクトをゲーム中で動いているのを確認し、調整

エンジニア観点

進行中のエフェクト組み込みスケジュールをなるべく遅れさせない
短期間開発、すぐに導入・試用できる規模
プロジェクトに依存させず、今後のプロジェクトにかんたんに導入させる

実際のシステム

EffectComponent

課題

複数のエフェクト制作ツールのカバー(スクリプト内の再生処理を共通に)

EffectComponentとは

制作ツール固有のコンポーネントに代わり、ロジックから参照されるAbstractクラス
エフェクト共通の機能やAPIをまとめる
固有の処理は拡張クラスを用意
ゲームロジックからはEffectComponentのみを参照

コード

【Unite 2017 Tokyo】DIYエフェクト実装: エンジニアレスでエフェクトを組み込める環境づくり - YouTube

ゲームロジックでは

制作ツール固有のコンポーネントではなく、EffectComponentを参照→スクリプトの処理はすべて同じになる

EffectComponentの自動付加

FffectComponentが機能するには全てのEffectのGameObjectに制作ツール用の拡張クラスが付加される必要がある
エフェクトの量が増えるとミスが増えるため手動はNG
エンジニア都合なのもある

実行時に自動的に付加する

エフェクトは必ずPrefabにしてもらう
読み込み時にEffectComponentを自動的にAddComponent 制作ツールの差異が気にならず、面倒な手間も省ける

エフェクト再生オプション

なるべくエンジニアに頼らず望みどおりの演出が作れるよう、いろいろな調整項目を実装
エフェクト共通機能であるため、FffectComponentに実装

再生位置

Transformを指定し、その一にエフェクトを再生
追加オプションも用意

Follow

エフェクト再生中、Transformに追従

PlayAtGround

指定した位置のy座標に関係なく、再生位置を地面に固定

自動Destroy, Deactivate

Preserveオプション

再生終了後にエフェクトをDestroyするか、使いまわせるようにInactiveにして保持しておくかのオプション
DestroyであろうとDeactivateであろうと、再生終了後の処理は自動になるため、手間が省ける

中間のまとめ

基本的な構成

EffectComponentベースクラスに共通の機能や再生オプションを実装
エフェクト制作ツールの種類に応じて拡張クラスを実装、エフェクトPrefab読み込み時に自動的に付加
ゲームロジックからはEffectComponentタイプのみを参照

エディターツール

EffectContainer

課題

アーティストがUnity上で組み込みを行えるよう、カスタムエディターツールを用意

EffectContainerとは?

ゲームロジック上のオブジェクト単位で持つエフェクト再生定義群のコンポーネント
そのオブジェクト位関連するエフェクトをリストで定義し、エフェクトPrefab及びEffectContainer用の各種再生オプションをInspectorで定義
定義したエフェクトはゲーム実行時に読み込まれ、EffectComponentの自動付加が行われる

実際の使用例

【Unite 2017 Tokyo】DIYエフェクト実装: エンジニアレスでエフェクトを組み込める環境づくり - YouTube

ゲームロジックからは

ゲームロジックはEffectContainerの参照のみ持つ
各エフェクトへのアクセスはEffectContainerで設定したNameフィールドで参照
再生するエフェクトの設定、オプションはInspectorで済ませてあるためスクリプトはPlayEffectを呼ぶだけでOK

ゲーム実行時

定義したエフェクトが自動的にInstantiateされ、EffectComponentの自動付加も行われる
エフェクトの参照がEffectContainerにまとまっているので、Prefabもスッキリする

再生タイミングの調整

課題

エフェクトはスクリプトから再生している
実際はモーションを見ながら細かく再生タイミングを調整したい場合がほとんど

AnimationEventを使う

エフェクト再生専用のAnimationEventを定義し、アーティストがセット

設定

EffectAnimationEventという関数名で固定→エフェクト用のEventであるのがわかるようにする

String Parameter

Play[EffectName]
Stop[EffectName]
EffectNameはEffectContainerで定義したName

アーティストが任意のタイミングでEffectContainerに定義したエフェクトを再生・ストップできる
AnimationEventはAnimatorと同じオブジェクトにのみ通知されるため、EffectContainerへAnimationEventを流すコンポーネントは必要

アーティストだけで完結

EffectContainerでオブジェクトに使いたいエフェクトを定義
エフェクトPrefabや各種再生オプションをEffectContainerで設定
AnimationEventで再生タイミングを調整
以上だけでも、かなり詳細なエフェクト演出の調整をアーティストだけで完結できる
コミュニケーションコストが大幅に減る
短期間で作って導入できる

カスタムエディターについて

作りたくない・めんどくさいが、Inspectorのデフォルトでは限界があるため、ある程度複雑になるとカスタムエディターがほぼ必須

Tips

いつか必ず必要になり、今後も作り、メンテしていく
よく使う機能は抽象化して使いまわせるようにする
(例 Copy&Pasteできるリストなど)
AssetStoreのものを使ってもよい

最後に

フィードバックをもらう

ツールを作るのは双方の作業効率を上げるため
使いにくかったら意味が無いので、アーティストからフィードバックをもらう

アーティストは

使いにくい部分などがあったらエンジニアに言う

エンジニアは

ツールは自分で使い、改善案を考える
しかし、アーティストにとっての改善とは限らないので、実装する前に確認する
また、通知なしの大きなインターフェース改変はしない




Markdown記法を覚え始めました…
改行が面倒です…あとは結構いいです