ここまで、Unityの基本的な使い方を解説してきました。いよいよゲーム開発に取り掛かりたいところですが、その前にUnityを使用する際に注意するべき事を見ていきましょう。
↑の動画でも解説していますので、是非ご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<シーン再生中の記録について>
再生中の変更で保存されないもの
さて、まずUnityを使用していて注意しなければいけないのはシーンの再生中に変更したインスペクターの値は保存されない点です。
以前シーン再生中にインスペクターの値をいじる事で値を調整できるよという話をしていました。
しかし、再生中調整した後シーンを停止すると値が再生前に戻ってしまいます。
こういった場合は、調整した値をコピーしておいて、再生が停止した時に貼り付ける必要があります。
ちょっとレベルが高くなりますが、プログラムがわかるようになってくるとシーン再生中でも値を保存する事もできます。これに関してはエディタ拡張というものをしないといけません。現時点では随分レベルが高いですが一応↓の記事で解説してます。
とりあえず、何か特別な事をしない限り、再生中のパラメータをいじったら元に戻ると覚えておいてください。
再生中に保存されるものもある
そして、Unityのややこしいところは全てのパラメータが元に戻る訳ではないという点には注意してください。
一例として↓ではTransformとマテリアルのパラメータをいじっています。
再生を解除するとTransformのパラメータはリセットされていますが、マテリアルのパラメータは保存されている事がわかると思います。
再生が解除すると位置は元の位置に戻っていますが、色は赤色のままになっています
実は全部が全部リセットされる訳ではないのです。
一見インスペクターでいじれるパラメータがリセットされるように見えますが、プロジェクトウィンドウに保存される系の奴は再生中にパラメータをいじっても保存されます。
↓のように実体がプロジェクトに保存されているものが対象になります。(プレハブは元へ変更を適用しないと保存されないので、プレハブはちょっと例外になります)
スクリプトもそうなんじゃないのって感じですが、インスペクターの値はシリアライズ化されてUnity側に保存されているものなので実は扱いが違います。
と、いうか基本的にシリアライズ化されているものは再生中にいじっても停止すると元に戻るといった感じです。
シリアライズが何かわからない方は↓の記事で解説していますので、参考にしてみてください。
簡単にまとめると、Unity再生中にいじくると停止後に元に戻るものとそうでない物があるから注意しようと言う事です。
再生中の対策
さて、再生中は注意とは言ったものの、よく間違えて再生中に値をうっかりいじってしまったりしまうことはよくあります。
そういった事が無いようにする対策をちょっと紹介しようと思います。
Unityには再生中にエディタの色を変える機能が付いています。
↓のように再生中、Gameビュー以外の所の色を自分の好きな色に変える事ができます。
↑再生中、Gameビュー以外を暗い灰色にしてみました。
これで再生中なのを忘れてウッカリパラメータを触ってしまうといった事はなさそうです。
ちょっと見辛くはなってしまうのでこれをやるのかはお好みですかね。
やり方はUnity>Preferencesから(WindowsではEdit>Preferences)
その後、開いたウィンドウの左側からColorsを選択し、
Playmode tintの色をお好みの色に変更する事で再生中の色を変える事ができます。
これで、「再生中にパラメータを触っている(停止すると元に戻ってしまうパラメータがある)」と言うことを意識しながら動かせそうです。
<シリアライズ化した変数について>
シリアライズ化すると値が上書きされる
変数をシリアライズ化するとインスペクターで値をいじる事ができますが、実はスクリプトで書いた値は上書きされます。
例えば↓のようなスクリプトを作ったとします。
↑のスクリプトではaは「1」になっています。
これはpublicにしているのでインスペクターで編集する事ができます。
↑インスペクターでは「99」にしています。
スクリプト内の記述とインスペクター内での値が喰い違ってますね。
この状態で再生すると
このように99と表示されます。
スクリプト上でも値を指定する事ができますが、シリアライズ化するとその値で上書きされるので注意してください。
スクリプトで値を指定する意味
じゃぁ、ややこしくなるので、スクリプトに値を指定しなければいいのでは?と思うかもしれません。
ですが、メリットもあるので値を指定するのもアリなんです。
そのメリットとは何かというといちいち値を入力しなくてもいいという点です。
↑ではスクリプトをアタッチした瞬間に「1」の値が入っている事がわかります。本来なら0が入るはずです。
これはスクリプトであらかじめ1を入れているからですね。
パラメータをたくさん増やしていくと、ゲームオブジェクトにアタッチした際にいちいち入力するのがめんどくさくなる時があります。
また、「ちょうどいい値に調節」した後にスクリプトに書いておくと、他でも使う際に調整の基準を知る事ができるので便利です。
このように変数にスクリプトで値を入れておく事で、便利に使う事ができるのですが、インスペクターからの入力で上書きされるので注意してください。
<セーブについて>
セーブは大事だって事はみなさんよくわかっているかと思います。
Unityを使っているとなんとなくいろんな物が勝手にセーブされててオートセーブなのかと錯覚してしまいそうになる時があるのですが、そんな事はなく、突然Unityが落ちてしまった場合、それまでの作業分が消えてしまいます。
↑で解説したようにシリアライズ化されたパラメータはUnity側が保持しています。が、保持しているだけでセーブされているわけではありません。
実は、セーブを押した際にこれらのファイル全てがセーブされるので、気づかないうちにセーブされてたりします。
そのため、意識してないと何かパラメータをいじったら、いじった瞬間セーブされるものと勘違いしがちなんですが、そんな事はないので
Saveを押しましょう。
Unityが落ちたりするとパーになってしまう事もよくあるので、やっぱりセーブは大事です。
Save Projectというのは、プロジェクトの設定ファイル等をセーブします。シーン上のものはセーブされないので気をつけてください。
Saveでもプロジェクトの設定ファイル等はセーブされます。
ちょっと混乱するかもしれませんが、Saveを押さなくても保存されるファイルもあります。元のファイルそのものを直接触っている場合です。これらはSaveを押さなくても保存されますが、まぁ、小まめにセーブするのに越したことは無いので変に意識せずにセーブしてしまえばいいと思います。
<まとめ>
さて、長々と説明してきましたが、説明ばっかりしていても頭に入ってきづらいと思うので、次回からいよいよゲームを作成していこうかなと思います。手始めに簡単な2Dゲームの作り方を解説していこうと思うので次回もよろしくお願いします。