i-school - Reset メソッドの活用例

MonoBehaviour.Reset() メソッド


 MonoBehaviour クラスに用意されているメソッドです。
コンポーネントをデフォルト(初期)値にリセットします。

 インスペクターのコンテキストメニューの[Reset]ボタンを押したとき、またはコンポーネントを初めて追加(アタッチ含む)したときに呼び出されます。


[Reset]ボタン(右側にある…のメニュー内)



参考サイト
Unity 公式スクリプトリファレンス
MonoBehaviour.Reset




 インスペクターで Reset ボタンを活用するケースとしては、Transform の値を初期値に戻す際に利用されていると思いますが、
自作クラス内に Reset メソッドを用意することで、Transform 以外の値にも初期値を設定し、Reset ボタンを押すことで、常に初期値に戻す機能を実装できます。

 また、インスペクターに限らず、クラス内で Reset メソッドを任意のタイミングで実行することもできます
例えば、Start メソッド内で Reset メソッドを実行することで、ゲーム実行のタイミングに合わせて初期値に戻すような挙動が実装出来ます。


参考サイト
Qiita @neusstudio(Unityゲーム開発者ギルド) 様
【Unity】MonoBehaviour.Reset()の使い方



自作クラスでの活用例


 実際に利用して実装する方法の一例を提示します。

PlayerTest スクリプトを作成する


 Reset メソッドを実装したスクリプトを作成します。

 この方法ですと各変数は private 修飾子であるためインスペクターには表示されないため、内部で処理が動いていることを確認します。

 インスペクターを Debug モードに切り替えておきます。


PlayerTest.cs

<= クリックすると開きます。


 スクリプトが完成したらセーブを行い、任意のゲームオブジェクトにアタッチしてください。

 RequireComponent 属性の機能により、Rigidbody コンポーネントが自動的にアタッチされます。

 Reset メソッドが実行されてることにより、hp 変数の初期値と、rb 変数に対しての TryGetComponent メソッドが実行されて rb 変数に値が代入されます。


スクリプトをアタッチして Reset メソッドが実行されることを確認する
動画ファイルへのリンク


インスペクター画像(Debug モード)



 無事に Reset メソッドの挙動が確認できたら、スクリプトを改良します。


PlayerTest スクリプトを改良する


 続いて、同じスクリプトを改良します。

 各変数に SerializeField 属性を付与しておきます。
こうすることでインスペクターが Normal モードであっても値の動きもわかりますので、
インスペクターを Debug モードから Normal モードに戻してください。

 インスペクターから制御することもできますので、デバッグしやすい環境になります。

 この改良例は、Reset メソッドを外部クラスから実行できるメソッドを準備しておくことで、
最初にスクリプトをアタッチしたとき以外のタイミングでのリセット機能を有効にする方法の実装例です。

 また、メンバ変数で値を代入していない場合には、各型ごとの初期値が代入されてしまいますので、
その場合には、Reset メソッド内で初期値を代入するように用意しておきます。


PlayerTest.cs

<= クリックすると開きます。


 スクリプトを改良したらセーブします。

 ゲームオブジェクトにアタッチされている PlayerTest スクリプトと Rigidbody コンポーネントを Remove してください。

 その後、再度、PlayerTest スクリプトをアタッチして、先ほどと同じように Reset メソッドが実行されることを確認します。

インスペクター画像



スクリプトをアタッチして Reset メソッドが実行されることを確認する
動画ファイルへのリンク


 各変数をインスペクターから操作できるようになりましたので、最後に Reset ボタンの確認を行います。


インスペクターのコンテキストメニューの[Reset]ボタンを実行する


 インスペクターのコンテキストメニューから[Reset]ボタンを実行した場合の挙動を確認します。

 hp 変数の値を 100 以外の数値に設定し(0 など)、rb 変数を None の状態にします。

 その後、PlayerTest スクリプトの右上にある … メニューを開いて、最上段にある Reset コマンドを実行します。
PlayerTest スクリプト内にある Reset メソッドが実行されて、変数の情報が Reset メソッドで設定している状態に戻ります。


Reset ボタンを実行する
動画ファイルへのリンク



 この機能を活用することで、例えば、インスペクターで数値を調整したい場合には
事前に初期値を登録しておけば Reset メソッドを利用することで、いつでも初期値に戻せますので、安心して調整を行うことが出来ます


TryGetComponent メソッドとの組み合わせ方


 先ほどの PlayerTest クラスでの利用方法の他に、アタッチされているクラスを判断して、値の設定を行うという処理も実装可能です。

 新しく enum と OwnerChecker クラスを作成し、PlayerTest クラスのアタッチの可否を判定して、オーナーの種類を特定する処理を実装してみます。


OwnerType.cs

<= クリックすると開きます。




OwnerChecker.cs

<= クリックすると開きます。


 TryGetComponent メソッドで取得したコンポーネントの情報を利用しない場合(取得できるかどうかだけ知りたい場合)には、
TryGetComponent メソッドの out 内の変数の宣言部分には、変数の代わりに _(アンダーバー)を宣言します。

 上記のように、TryGetComponent メソッドと Reset メソッドを組み合わせることにより、
アタッチされているクラスの情報を判断して、変数への代入処理を行うことも出来ます。



 以上になります。