プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

MonoBehaviour.Reset()とは

Unityちゃん2Dのスクリプトにあった見慣れない関数だったので調べてみました。
公式リファレンスを見ると、この関数はコンポーネントコンテキストメニューまたは端っこの歯車マーククリックで出てくるメニューのResetを押したときと、Reset関数を記述したスクリプトを追加したときに呼ばれます。
主にInspectorで各コンポーネントの初期値を設定するときに使うようです。
アタッチしたコンポーネントの初期値をスクリプトでまとめて一気に設定するのが主な用途なんでしょうかね。

 

以下公式で配布している「ユニティちゃん 2Dデータ」のサンプルコードを使って動作を説明します。

UnityChan2DController.csを見ると、以下のようになっています。

public class UnityChan2DController : MonoBehaviour
{
    public float maxSpeed = 10f;
    public float jumpPower = 1000f;
~中略~
    void Reset()
    {
        Awake();

        // UnityChan2DController
        maxSpeed = 10f;
        jumpPower = 1000;
~以下略~

 

このときのインスペクターは以下のようになってます。

f:id:shirakamisauto:20150420180143p:plain


このままだと変数宣言時の初期値と区別がつかないので、
Resetメソッド内を以下のように変更します。(青字が変更部分)

    void Reset()
    {
        Awake();

        // UnityChan2DController
        maxSpeed = 8f;
        jumpPower = 93;

~以下略~

 

コンパイル後にResetを押すと以下のようにResetメソッド内に記述した値になりました。

f:id:shirakamisauto:20150420181812p:plain

また、Add Componentしてみると、やはりResetメソッド内に記述した値になりました。

f:id:shirakamisauto:20150420181029p:plain

 

ところで、さきほどのコードの続きを見ますと以下のようになっています。
    void Reset()
    {
        Awake();

        // UnityChan2DController
        maxSpeed = 8f;
        jumpPower = 93;
        backwardForce = new Vector2(-4.5f, 5.4f);
        whatIsGround = 1 << LayerMask.NameToLayer("Ground");

        // Transform
        transform.localScale = new Vector3(1, 1, 1);

        // Rigidbody2D
        m_rigidbody2D.gravityScale = 3.5f;
        m_rigidbody2D.fixedAngle = true;
~以下略~


赤字のm_rigidbody2DはAwakeメソッドで取得したRigidbody2Dコンポーネントです。
重力係数を3.5、fixed angleをtrueに設定していますね。

Unityに戻ってRigidbody2DコンポーネントをResetします。
すると以下のように重力が1になり、fixed angleがfalseになります。
まあ普通の挙動ですね。

f:id:shirakamisauto:20150420181343p:plain

次に、スクリプトをResetします。
するとRigidbody2Dコンポーネントの重力が3.5になり、fixed angleがtrueになりました。

f:id:shirakamisauto:20150420181506p:plain


このように、Resetメソッドを使用することで、Resetメソッドを記述したスクリプトのResetをかけるたびに、ほかのコンポーネントの値を同時に初期化することができます。