【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記法を覚え始めました…
改行が面倒です…あとは結構いいです