Behaviourをカスタムする - Katsuya100/SceneLayer-Trial GitHub Wiki
概要
シーンレイヤーは3種類のデータを組み合わせることによって構成されています。
- Layer
一画面の単位を表すデータ - Transition
Layer間の遷移を表すデータ - Loader
Layer内の構成要素を表すデータ
これらのデータはMonoBehaviourと同じように、
カスタマイズ可能なBehaviourとなっており、継承して自由に実装できます。
プリセットでいくつかのカスタムBehaviourも用意されており、
それを使えばコードレスに実装することも可能ですが、
より柔軟なゲーム開発においては、プロジェクトに応じたカスタムが必要になると思われます。
このページでは、カスタムBehaviourの作成方法を解説します。
Layerのカスタム
Layerをカスタムするには LayerBehaviour
を継承します。
Layerは一画面の単位を表すデータですので、
従来、シーンのルートに配置されがちだった不格好なコンポーネントが不要になります。
また、画面遷移の際に、データを転送する場合、
従来は「Unload前にDontDestroyOnloadにデータを逃がす」といった一手間が必要でしたが、
すべてのLayerは常時オンメモリなので「Layerに保持したデータをそのまま次のLayerに引き継ぐ」
といったことが可能になります。
Scriptの作成
- Projectビュー上で[右クリック > Create > SceneLayer > Layer Behaviour]を選択。
- LayerBehaviourの名前を入力(
Title
等) - SceneLayerEditor上を右クリック
- Layerを作成し、Inspectorから
BehaviourType
を選択 - 先程作ったScriptを設定する。
イベント関数
OnInitialize
初期化処理。
一回だけ呼び出される。
OnEntry
Layer入場時処理
シーンを開くたびに行いたい初期化処理はここに書く。
OnExit
Layer退出時処理
シーンから出るたびに行いたい破棄処理はここに書く。
OnUpdate
Layerの更新処理。
OnEntry~OnExitの間、毎フレーム呼ばれる。
OnTransit系
遷移処理を記載するコールバック郡。
コルーチンになっており、このコールバックが完了するまで遷移は完了しない。
そのため、手動でロードしたいものがある場合や、
遷移中演出を用意したい場合はここに記載できる。
各イベント関数ごとの呼び出しタイミング、Layerの規則は下記の通り
イベント関数 | タイミング | 呼び出しLayer |
---|---|---|
OnPreTransitFrom | 遷移開始前 | 遷移先 |
OnPreTransitTo | 遷移開始前 | 遷移元 |
OnTransitFrom | 遷移中 | 遷移先 |
OnTransitTo | 遷移中 | 遷移元 |
OnPostTransitFrom | 遷移終了後 | 遷移先 |
OnPostTransitTo | 遷移終了後 | 遷移元 |
OnPreParentTransitFrom | 親Layerの遷移開始前 | 遷移先の子Layer |
OnPreParentTransitTo | 親Layerの遷移開始前 | 遷移元の子Layer |
OnParentTransitFrom | 親Layerの遷移中 | 遷移先の子Layer |
OnParentTransitTo | 親Layerの遷移中 | 遷移元の子Layer |
OnPostParentTransitFrom | 親Layerの遷移終了後 | 遷移先の子Layer |
OnPostParentTransitTo | 親Layerの遷移終了後 | 遷移元の子Layer |
OnPreChildTransit | 子Layerの遷移開始前 | 遷移先と遷移元の親Layer |
OnChildTransit | 子Layerの遷移中 | 遷移先と遷移元の親Layer |
OnPostChildTransit | 子Layerの遷移終了後 | 遷移先と遷移元の親Layer |
遷移中 … OnExitからOnEntryの間
遷移開始前 … OnExit以前
遷移終了後 … OnEntry以降
より詳しくはシーケンスイベントを参照してください。
OnCheckError
エラーチェック処理。
入力されたパラメーターにエラーがある場合、
渡された引数にエラー情報を追加すると、
エディタ上で確認できる他、起動時に実行時エラーとして検出できる。
// 第一引数:エラーメッセージ(必須)
// 可変長引数:原因となったSerializeFieldがある場合、そのField名
result.Add(new ErrorObject("Error Message.", nameof(_reasonMember)));
OnDuplicatedAsset(エディタ用)
アセット複製時処理。
複製元が引数で渡されるため
複製時に引き継ぎたい値があればコピーできる。
OnChangeBehaviourTo(エディタ用)
Behaviour変更時処理。
変更後のLayerBehavoiurに引き継ぎたい値があればここでコピーできる。
Transitionのカスタム
Transitionをカスタムするには TransitionBehaviour
を継承します。
Transitionをカスタムすると、遷移条件をプログラマブルに記載することが可能になります。
また、遷移時のイベントを記載できるので「遷移中にキャッシュクリアを行う」などの、共通処理をまとめて書くことも可能です。
Scriptの作成
- Projectビュー上で[右クリック > Create > SceneLayer > Transition Behaviour]を選択。
- Transitionの名前を入力
- SceneLayerEditor上で、Layerを右クリック
- Transitionを作成し、Inspectorから
BehaviourType
を選択 - 先程作ったScriptを設定する。
イベント関数
IsTransitable(必須)
Transitionが有効な場合、この関数は毎フレームチェックされる。
遷移可能になったときにtrueをreturnすると、遷移が実行される。
OnInitialize
初期化処理。
一回だけ呼び出される。
OnTransit系
遷移処理を記載するコールバック郡。
コルーチンになっており、このコールバックが完了するまで遷移は完了しない。
そのため、遷移が完了するまでに行っておきたい処理があればここに記載する。
イベント関数 | タイミング |
---|---|
OnPreTransit | 遷移開始前 |
OnTransit | 遷移中 |
OnPostTransit | 遷移終了後 |
遷移中 … OnExitからOnEntryの間
遷移開始前 … OnExit以前
遷移終了後 … OnEntry以降
より詳しくはシーケンスイベントを参照してください。
OnCheckError
エラーチェック処理。
入力されたパラメーターにエラーがある場合、
渡された引数にエラー情報を追加すると、
エディタ上で確認できる他、起動時に実行時エラーとして検出できる。
// 第一引数:エラーメッセージ(必須)
// 可変長引数:原因となったSerializeFieldがある場合、そのField名
result.Add(new ErrorObject("Error Message.", nameof(_reasonMember)));
OnDuplicatedAsset(エディタ用)
アセット複製時処理。
複製元が引数で渡されるため
複製時に引き継ぎたい値があればコピーできる。
OnChangeBehaviourTo(エディタ用)
Behaviour変更時処理。
変更後のTransitionBehaviourに引き継ぎたい値があればコピーできる。
Loaderのカスタム
Loaderをカスタムするには LoaderBehaviour
を継承します。
Loaderは登録されたLayerにおける画面要素をロード、生成、破棄、解放する役割を持っています。
しかし、実際のアセット管理はプロジェクトによって様々なため、
カスタムすることによって、プロジェクト固有のアセットマネージャーを経由する事になると考えられます。
Scriptの作成
- Projectビュー上で[右クリック > Create > SceneLayer > Loader Behaviour]を選択。
- Loaderの名前を入力(
AssetLoader
等) - Scriptを開き、好きな処理を記載する。
- LayerのInspectorを開く
- [+]ボタンからLoaderを作成し、
BehaviourType
を選択 - 先程作ったScriptを設定する。
イベント関数
GetInstance(必須)
生成したインスタンスを返却する。
GetInstanceType(必須)
生成するインスタンスの型を返却する。
不明な場合はobjectで良いが、なるべく絞り込まれていることが望ましい。
絞り込まれている場合、「LoaderのインスタンスイベントをLayerで受け取る」で活用しやすくなる。
Load(必須)
ロード処理。
自前のロード処理やアセットマネージャーを使いたい場合はここに書く。
(LayerBehaviour.OnTransit系にロード処理を書いてもいいが、
ここに書けばプリロードに対応できるためオススメ)
また、対象の定まっていないアセットを複数まとめてロードするといったことも可能。
Unload(必須)
解放処理。
InstantiateObject(必須)
ロードしたオブジェクトを使用可能な状態にする。
GameObjectであれば、Instantiate。
Sceneであれば、LoadSceneAsync。
BGMであれば、ここで再生開始しても良い。
DestroyObject(必須)
InstantiateObjectで生成したインスタンスの破棄を行う。
OnInitialize
初期化処理。
一回だけ呼び出される。
OnCheckError
エラーチェック処理。
入力されたパラメーターにエラーがある場合、
渡された引数にエラー情報を追加すると、
エディタ上で確認できる他、起動時に実行時エラーとして検出できる。
// 第一引数:エラーメッセージ(必須)
// 可変長引数:原因となったSerializeFieldがある場合、そのField名
result.Add(new ErrorObject("Error Message.", nameof(_reasonMember)));
OnDuplicatedAsset(エディタ用)
アセット複製時処理。
複製元が引数で渡されるため
複製時に引き継ぎたい値があればコピーできる。
OnChangeBehaviourTo(エディタ用)
Behaviour変更時処理。
変更後のLoaderBehaviourに引き継ぎたい値があればコピーできる。