スクリプト前回、[HideInInspector]のAttribute(属性)を使ってpublicなフィールドでもInspectorに表示しない方法を紹介しました。エクスプラボ【Unity】HideInInspectorとSerializeFieldの興味深い関係https://ekulabo.com/hide-in-inspectorpublicのフィールドやをつけたフィールドはシリアライズの対象となり、Inspectorウィンドウに表示されるようになります。今回扱うを使うと、シリアライズの対象フィールドでもInspectorウィンドウで非表示にすることができます。[HideInInspector]ではInspectorで非表示になるものの、シリアライズ(オブジェクトの状態の保存)はされたままなので意図しない値が残ってしまうことがあります。そんな時、Unityのマニュアルを漁っていたら、シリアライズもしないし、Inspectorにも表示させない強力なAttributeを見つけました。その名も[System.NonSerialized]。実はUnityのスクリプトリファレンスでは『NonSerializable』となっており、名前が間違っているので注意。Systemの名前空間が入っているので、Unity独自のAttributeではなく、C#の機能の中にあるものです。詳細はMSDNの『NonSerializedAttributeクラス』をご覧あれ。今回はこの[System.NonSerialized]と、privateなフィールドでもシリアライズしてInspectorに表示する[SerializeField]の2つのAttributeを戦わせてみます。SierraUnity2018.1.0f2[System.NonSerialized]の動作Unityでは、MonoBehaviourを継承して作成されたスクリプトに含まれるpublicなフィールドは、Inspectorウィンドウに表示され動的に値を変更することが可能です。このフィールドはシリアライズされる状態、つまりオブジェクトの状態が保存される状態になっているため、Inspectorで変更した値が保持されます。publicなフィールドに対して[System.NonSerialized]のAttributeをつけると、シリアライズもしないし、Inspectorにも表示しない、でも外部のスクリプトからはアクセスできる、なんて状態を作れます。Inspectorウィンドウから値を変える時には、getter/setterがあってもそれを無視してダイレクトに値を変えています。値の検証の処理がgetter/setterにあってもスルーされちゃうので、意図しない動作の原因になったりするんですよね。これを避けたいときなどに[HideInInspector]を使うとInspectorに表示されなくなります。シリアライズされた状態なので、オブジェクトが保持している変数の値はそれぞれ保持されることに。スクリプトで初期値をセットするように変更しても、シリアライズされると前の値が保持されてるので反映されないんです。時に登場するのが[System.NonSerialized]なんです(ここまで前置き)実際にやってみよう以下のように、publicなフィールドに[System.NonSerialized]をつけたものとつけていないものを用意しました。どちらもpublicなので、通常であれば両方Inspectorに表示されるはず。Gist.上記のスクリプトをゲームオブジェクトにアタッチすると、以下のように表示されました。levelフィールドはpublicですが、[System.NonSerialized]がついているので表示されません。一方のcharacterNameは通常通り表示されています。NonSerializedの方は表示されないシリアライズされているかどうかの確認のため、Start()に以下の処理を追加しました。Gist.ゲーム開始時にメッセージを出力するだけの処理で、それぞれのフィールドの中身を出力します。名前と数字がちぐはぐシリアライズ(状態が保存)されているフィールドなら、スクリプトで初期値を設定しても値が保持されます。逆にシリアライズされていないフィールドは初期値を変えれば新しい値が格納されます。Gist.上記のスクリプトを保存し、再コンパイルすると、characterNameは保持され、levelが新しい値になるはず。NonSerializedの方だけ変わった通常のpublicのフィールドであるcharacterNameは値が変わらず、[System.NonSerialized]をつけたlevelフィールドはInspectorに表示されないし、値も保存されません。これで[System.NonSerialized]の動作が確認できました。いざ決戦のバトルフィールドへ次はいよいよ[System.NonSerialized]と[SerializeField]の戦いです。[System.NonSerialized]はpublicでもInspectorへの表示なし、シリアライズなし。対する[SerializeField]はprivateでもInspectorへの表示あり、シリアライズあり。逆の効果をもつAttributeを同時に指定したらどうなるのか試してみます。追加したフィールドは以下の4種類。Gist.上2つは[SerializeField]の効果を確かめるためのフィールドです。hpはInspectorに表示されて、mpは表示されません。下2つが本番の戦いで、Inspectorに表示されていれば[SerializeField]が優先されることとなり、表示されなければ[System.NonSerialized]が優先されることに。Attributeの順番による効果の変動を考慮して、2パターン用意しています。この状態でInspectorの表示はどうなるのか!?結果はこうなったhpのみ表示された追加した4つのフィールドのうち、hpだけが表示されました。[SerializeField]と[System.NonSerialized]を両方指定したパターンは順番に関係なく表示されず。結果、[System.NonSerialized]が優先されることが分かりました。勝者に拍手を!システム寄りの属性だものSystemの名前空間が示す通り、元々C#に存在するAttributeですもの、そりゃ強いですよね。privateなフィールドをシリアライズするという元々できないことをできるようにするのと、publicをシリアライズさせないという元々できることを敢えて制限する点を比較すると、できることを制限した方がバグが少なくなりそう。できたら困るから制限をかける訳で、できないことはそのままできなくてもしょうがないよね、という感じでしょうか。[System.NonSerialized]をつけたらシリアライズもInspectorへの表示も行わなくなります。実験目的以外で同時に指定することはないと思いますが、[System.NonSerialized]と[SerializeField]なら[System.NonSerialized]が優先されることに気をつけて。まとめ[System.NonSerialized]はpublicなフィールドでもInspectorへ表示せず、シリアライズもしません。それと対をなす[SerializeField]はprivateなフィールドでもInspectorへ表示し、シリアライズを行います。対極的な効果をもつAttributeですが、両方指定された場合は[System.NonSerialized]の方が優先されます。ゲーム開発の攻略チャートを作りました!「ゲームを作ってみたいけど、何から手を付けていいか分からない!」そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。投稿一覧Unityを使ってアプリを作ったり、Assetを作ったりしてる個人開発者。Unity全般ネタとAsset開発の情報を扱っています。Asset開発は日本語の情報が少ないのよね。ことで些細なネタでも情報を蓄積するのが目的です。2018.07.05HeaderAttributeを使って、Inspectorウィンドウに表示されるフィールドを整理して表示できます。2018.07.16複数行テキストを扱うなら、[Multiline]もいいけど[TextArea]を使うと便利です。何よりスクロールバーを使えるのがありがたい。2018.07.16Inspectorウィンドウで複数行テキストエリアを表示したい場合は[Multiline]のAttributeを使います。2018.07.16Inspectorウィンドウに表示するフィールドはToolTipAttributeを使ってヒントメッセージを表示すると親切です。2018.06.12スクリプトを書く時に悩む、Inspectorに表示したいフィールドの公開方法。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。todoUnityのアセットを作ったり、スマホ向けのアプリを作っています。このブログではUnity初心者に向けたチュートリアルやテクニックを放出しています。詳しいプロフィールはこちら。お仕事の相談や現在提供中のサービスについては、こちらの『サービス内容』のページをご覧ください。Explorers_todoオンライントレーニングのサイトをオープン!エクスプラボを運営しているtodoが、より集中的にゲーム作りについて学べるオンライントレーニングのサイトをオープンしました。エクスプラボのトレーニングルーム』です。勉強したことの進捗も表示できるようになっているので、どれだけ頑張ったのかが分かるようになっています。ゲーム開発の攻略チャート』というe-bookをプレゼントしています。メルマガではゲーム開発のテクニックを中心に役立つ情報をお届けします。詳しくはこちら!お仕事の依頼はこちら!ゲーム開発のサポートも可能!エクスプラボではゲーム開発のサポートのサービスも行なっています。いう場合にオススメのプランです。詳細はこちら!もちろん、普通に開発依頼をいただいてもお手伝いします。その場合はお問い合わせへ。【Unity】ポストプロセシングを使って簡単にプロっぽいゲーム画面を作るゲームの作り方を学べるオンライン講座のサイトをオープンしました!RANKING【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よねMathf【Unity】ゲームといえばランダム要素。(12)作ったアプリ空とにゃんこと風船と癒し系縦スクロール避けゲーの『空とにゃんこと風船と』(TODOWORKS名義でリリース)気軽に遊べるスマートフォン向けアプリです。ボクセルアートで彩られるどこかレトロ、でも新しい世界で癒されてみませんか?ぼく、猫ですって!タップ系RPG『ぼく、猫ですって!』(TODOWORKS名義でリリース)気軽に遊べるスマホRPG。