スクリプトスクリプトを作成した時、publicなフィールドはInspectorウィンドウに表示され、そこから動的に値を変えることができます。なんてこともあります。そこで登場するのが[HideInInspector]のAttribute(属性)。これがついているフィールドはInspectorに表示されなくなるんです。なんて疑問も浮かぶかもしれません。その点についてもこの記事の中で扱っていきます。SierraUnity2018.1.0f2HideInInspectorの効果HideInInspectorは直訳すると「隠す」「Inspectorの中で」となります。言葉通り、Inspectorウィンドウに表示しないようにするAttributeです。Attributeとは、クラスやメンバ変数(フィールド)に与える特別な動作指示のこと。[]で囲って使います。通常、MonoBehaviourを継承して作成されたスクリプトに含まれるpublicなフィールドは、Inspectorウィンドウに表示され動的に値を変更することが可能です。publicだと勝手に表示されてしまいますが、テストプレイ中に意図しない値に変えるとゲームの進行に悪影響を及ぼすフィールドもあるかもしれません。Inspectorで表示されるフィールドは、ダイレクトに値が変わるためかgetter/setterが動かず、そこで値の検証をしていると致命的。外部のスクリプトからも値を参照しているのでprivateにもできない、なんて状況もあるかもしれません。そこでこの[HideInInspector]を使うことで、外部のスクリプトからアクセスできるpublicのまま、Inspectorには表示しないようにできます。Gist.上記のスクリプトをアタッチしたゲームオブジェクトを選択してInspectorウィンドウを見ると、[HideInInspector]をつけたlevelフィールドが表示されなくなっています。levelフィールドは表示されないlevelフィールドそのものは外部のスクリプトからアクセス可能です。以下の画像はVSCodeでスクリプトを編集している画面ですが、エラーは表示されません。[SerializeField]publicなフィールドでもInspectorで非表示にする[HideInInspector]と、privateなフィールドでもInspectorに表示させる[SerializeField]、どっちが強いんでしょうね。Attributeを知り始めた人なら疑問に思うポイント。詳しく知っている人なら、「強いも何も、そもそも役割が......」と、すぐにどうなるか予想がつく場所でもあります。実際にやってみた何は無くとも、実際に動かしてみるのが一番の近道。上で使ったスクリプトを編集して、以下の4パターンを追加します。Gist.[SerializeField]の動作も確認しつつ、[HideInInspector]と同時に指定した場合の動作を確認します。このスクリプトのコンパイルが終わると、Inspectorウィンドウでは以下のように表示されました。追加したうち、元からprivateなmpフィールドが表示されないのはいいとして、[HideInInspector]がついているものは順番に関係なく表示されません。結果として、[HideInInspector]が指定されていればpublicだろうと[SerializeField]だろうとInspectorウィンドウで表示されないんです。シリアライズの目的でもちょっと待った。そもそもシリアライズの目的って、Inspectorウィンドウに表示することがメインじゃないんです。シリアライズの詳細についてはUnityマニュアルの『スクリプトのシリアライゼーション』をご覧いただくとして、ざっくり説明するとデータ構造やオブジェクトの状態をUnityが保存し、後で使えるように変換する処理のこと。オブジェクトの状態を保存するから、変数の値が保持されているんです。Unity側で値を保持できるから、じゃあついでにUnity側の機能であるInspectorで変数を表示して編集できるようにしよう、となっているんです(想像)こうすればスクリプトを変更することなく値の調整ができますもんね。この時、Inspectorにフィールドを表示するというのはサブの機能で、[HideInInspector]はこのサブの機能に対して働いているんです。......ってことは、シリアライズ自体はされたままのはず。シリアライズされていることの確認[HideInInspector]はInspectorに表示しないだけ。シリアライズ(オブジェクトの状態保存)を防いでいる訳ではありません。すると、privateのフィールドに[SerializeField]をつけたら、たとえInspectorに表示されなくともUnity内部で値を保持しているはず。Inspectorからは変更できないのですが、Unityに内部的に値を保持させる方法はあります。それは宣言時に初期値を設定しておくこと。言っても実は上に掲載したスクリプトでは初期値を明示的にセットしていないので0になっています。ここで、スクリプトを以下のように編集して、値がどうなっているか確認します。追加したのはStart()の中身。Gist.まずは初期値をセットしないパターン。ゲームを実行すると、mpとatkの両方の値が0になっています。初期値の0が出力された続いて、スクリプトの中で初期値をセットします。シリアライズの対象フィールドの場合、スクリプトのコンパイル後にフィールド名が変わっていなければ、Unityが保持しているコンパイル前の値がセットされます。Gist.上記のスクリプトなら、値が保持されていれば0が、保持されていなければ711が出力されます。いい気分privateフィールドのmpはスクリプトの中で初期値がセットされ、その値を出力しました。対して[SerializeField]をつけたatkは、初期値をセットするようにスクリプトを修正しても既存のコンポーネントには反映されず、以前の値を保持しています。見事にシリアライズ(オブジェクト状態の保持)がなされていますね。Inspectorウィンドウでは値を変えられず、スクリプトの中で初期値を設定しても以前の値が残っている状態。......バグの元だこれ!!実験目的以外で[SerializeField]と[HideInInspector]を共存させることはそうそう無いと思いますが、念のためご注意を。まとめ[HideInInspector]はInspectorへの表示関係に対して働きます。publicや[SerializeField]がついていても、Inspectorには表示されなくなります。[SerializeField]をInspectorに表示させるためのAttributeだと思ってしまうとハマる可能性があるので注意。シリアライズする対象だからこそ、結果的にInspectorに表示している、という因果関係を間違えないようにしないといけません。[ShowInInspector]といったHideの逆バージョンのAttributeは存在しないようです。privateなフィールドをInspectorに表示したところで、シリアライズの対象でなければ値を保存できないので無意味、ってことなんだと思います(想像)ゲーム開発の攻略チャートを作りました!「ゲームを作ってみたいけど、何から手を付けていいか分からない!」そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。投稿一覧Unityを使ってアプリを作ったり、Assetを作ったりしてる個人開発者。Unity全般ネタとAsset開発の情報を扱っています。Asset開発は日本語の情報が少ないのよね。ことで些細なネタでも情報を蓄積するのが目的です。2018.07.16複数行テキストを扱うなら、[Multiline]もいいけど[TextArea]を使うと便利です。何よりスクロールバーを使えるのがありがたい。2018.06.12スクリプトを書く時に悩む、Inspectorに表示したいフィールドの公開方法。2018.06.13Unityでスクリプトを作成する際はクラスやフィールド、メソッドなどにAttirbuteを指定することができます。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。todoUnityのアセットを作ったり、スマホ向けのアプリを作っています。このブログではUnity初心者に向けたチュートリアルやテクニックを放出しています。詳しいプロフィールはこちら。お仕事の相談や現在提供中のサービスについては、こちらの『サービス内容』のページをご覧ください。Explorers_todoオンライントレーニングのサイトをオープン!エクスプラボを運営しているtodoが、より集中的にゲーム作りについて学べるオンライントレーニングのサイトをオープンしました。エクスプラボのトレーニングルーム』です。勉強したことの進捗も表示できるようになっているので、どれだけ頑張ったのかが分かるようになっています。ゲーム開発の攻略チャート』というe-bookをプレゼントしています。メルマガではゲーム開発のテクニックを中心に役立つ情報をお届けします。詳しくはこちら!お仕事の依頼はこちら!ゲーム開発のサポートも可能!エクスプラボではゲーム開発のサポートのサービスも行なっています。いう場合にオススメのプランです。詳細はこちら!もちろん、普通に開発依頼をいただいてもお手伝いします。その場合はお問い合わせへ。【Unity】ポストプロセシングを使って簡単にプロっぽいゲーム画面を作るゲームの作り方を学べるオンライン講座のサイトをオープンしました!RANKING【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よねMathf【Unity】ゲームといえばランダム要素。(12)作ったアプリ空とにゃんこと風船と癒し系縦スクロール避けゲーの『空とにゃんこと風船と』(TODOWORKS名義でリリース)気軽に遊べるスマートフォン向けアプリです。ボクセルアートで彩られるどこかレトロ、でも新しい世界で癒されてみませんか?ぼく、猫ですって!タップ系RPG『ぼく、猫ですって!』(TODOWORKS名義でリリース)気軽に遊べるスマホRPG。