ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

【Unity】インスペクターの変数に初めから値を入れておく方法【Reset()】と地味注意

f:id:covory10101101276:20200507000307j:plain
日本 山梨県-忠霊塔-

みなさんこんにちは🌞

久々に帰ってきたブルーノです。世間でコロナが流行って初のゴールデンウィークですがみなさんいかがお過ごしでしたでしょうか。私は友人とArkのPS4版をやって楽しんでいました。いろいろやりづらさが目立つゲームですが近年のサバイバルゲーの中では破格のグラフィックとクオリティだと思います。



さて、Unityの使い方に少し慣れてくると、[Seriarize Field]などでprivate修飾子をつけた変数をUnityエディタ上から指定する機会等が増えてくると思いますが、その値がわかりきっているのにいちいち手動で設定するのは面倒ですよね。そこで、UnityにはReset()という関数が用意されています。

docs.unity3d.com

公式リファレンスを見ればもうこちらから説明することはないほどわかりやすい機能と説明なんですが、インスペクターの変数に対して自動でReset()内の処理を行ってくれます。

f:id:covory10101101276:20200507002750p:plainf:id:covory10101101276:20200507002802p:plain
こんな感じ

値の初期化などに使えますね。しかし、少しだけこの関数を使うときに注意することがあったのでメモします。

1. インスペクターに表示されていない場合は処理が通らない

Reset()の中に記述した内容はあくまで変数がインスペクターに表示されている場合のみに行われるようです。
具体的にどういうことかというと、
f:id:covory10101101276:20200507003120p:plain
↑のように変数(Sphere)がprivateだと...

f:id:covory10101101276:20200507003035p:plain
初期化されてないのです。

Resetの中身は通っているはずなのに処理がされてないというのは不思議な感じですね。

2. いろいろ変数の修飾子をいじるとResetされてないかもしれない

では今度は、先ほどの1. で書いたコードのSphere変数にそのまま[Seriarize Field]を追加してみました。するとどうなるのでしょうか。
f:id:covory10101101276:20200507003930p:plain
f:id:covory10101101276:20200507003957p:plain
Sphere変数に値が入っていませんね。UnityのReset()という処理が入るのは単純にコードを保存したタイミングではないようです。
こういったときは変数右上の歯車のマークからResetを選択すると、再びリセットされます。
f:id:covory10101101276:20200507004502p:plainf:id:covory10101101276:20200507004512p:plain


以上のように、Reset()は初期化した際にインスペクタの値に自動で値を入れてくれる便利?な関数ですが何かと注意点があるようです。
私の場合は勘違いしてどんな記述でも通るのかと思ってAwake()のような使い方をしていたためReset()内に記述していた変数すべてがNullになっていました。まあリファレンスに書いてあることがすべてで私が早とちりしていただけなのですが笑 そんな大ごとでもすごい発見でもないですが備忘録ということで。

今回はここまでにしておきます。