テラシュールブログスマートフォン用の表示で見るテラシュールブログ旧テラシュールウェアブログUnity記事。UnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。最適化・デバッグフラグの管理についてアレコレ考えていたら、ゲームオブジェクトを次のシーンへ受け渡す面白いアイディアが浮かんだ。Unityでゲームを作っている場合、LoadLevelによるシーン遷移をよく利用する。LoadLevelはメモリをスッキリして参照関連や変数を上手い感じにリセットしてくれるが、DontDestroyOnLoad以外のオブジェクトを全て破棄する。これが若干厄介で、例えばゲーム画面→結果画面のようにゲーム画面の内容を表示したい場合、以下の事を行う必要があった。staticなクラスもしくはフィールド(=変数)に値を保存しておくDontDestroyOnLoadでGameObjectを破棄を防ぐただどちらもリセット処理が必要となり、staticな値の場合はリセット処理の定義、DontDestroyOnLoadなら以降利用される前に探し出して破棄する必要があった。Unityで2週目・3周目に1週目と違う挙動がある場合、大抵この初期化が完全ではないケースが多い。この辺りを管理するのは非常に面倒くさい。このDontDestroyOnLoadの方だが、実はある程度自動化が可能だ。以下のようにイベントを記入すると次のシーンのAwake後までは生存してくれる。-------}これは単純に、OnLevelWasLoaded(シーンがロードされたタイミングで呼ばれる)がAwakeの後・Startの前に呼ばれる事を利用している。Awakeが完了後にStartを一度経由していれば破棄されるという事だ。次のシーンのAwakeでスコアを回収可能なら、次のシーンで値を継続して利用することが出来る。ちなみに実際に使用する場合は、LoadLevelの直前でDontDestroyOnLoad属性を付与する事をお勧めする。Startでこの属性を付けても良いのだが、必ず次のシーンで破棄されるようになり、どのシーンからでも初められるの法則が守りにくくなる。とまあコレはコレで便利なのだが、Awakeで値を回収しなければいけないのは正直面倒だ。次のシーンはAwakeで値を回収する処理+それ用の変数が必要になってしまう。DontDestroyOnLoad属性を付与せずシーン移行時にオブジェクトを破棄しないようにした。これで、次の次のシーンではオブジェクトが破棄されるようになり、リセットが簡単になる。DontDestroyParent.csやってる事は単純で、シーンロードの直前にDontDestroyOnLoad属性のあるオブジェクトの子としてオブジェクトを配置してるだけ。DontDestroyOnLoad属性を持つオブジェクトの子オブジェクトは、親同様破棄されないので、これでシーンのクリーンナップを乗り切り親離れする。やり方は簡単、DontDestroyParentをプロジェクトへ配置後、LoadLevelを実行する直前で以下の処理を実行する。this.DontDestroyOnNextLoad(コンポーネント);これでDontDestroyOnLoad属性を付与せず次のシーンまでオブジェクトを保持出来る。SingletonMonobehaviourを使用。まとめUnityの特性として「シーン遷移(LoadLevel)時にオブジェクト...2014-06-11シーン内のオブジェクトをInstantateするメリット弾を生成する場合、以下の手順を行うのが一般的だ。弾のprefab...2014-05-07脱出ゲームを作ってみる(ゲームイベントの制御)これの続き。tsubakit1.hateblo.jp次はなにかイベントがあった...2014-04-28GameControllerタグをどう扱うべきか...Unityは幾つか標準でタグを保持している。(1)月別アーカイブはてなブログをはじめよう!tsubaki_t1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。