🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

7684閲覧

Unity 継承したpublicフィールドをInspector画面で非表示にしたい。

kuriyama.kazuki

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/01/25 09:22

編集2021/01/26 00:56

前提・実現したいこと

Unityで継承したpublicフィールドをInspector画面で非表示にしたい。

発生している問題・エラーメッセージ

継承元の親クラスのpublicフィールドに対してAttributeを付与してもInspector画面にフィールドが表示されます。

試したこと

子クラスで作成したフィールドはHideInInspectorのAttributeを付与することで、Inspector画面上で非表示にすることができることは確認できました。

String型で試したところフィールドが非表示になることが確認できましたが、SteamVR_Action_Boolean型だと本事象が発生するようです。

ソースコードは以下の通り。

C#

1子クラス 2namespace Valve.VR.InteractionSystem 3{ 4 public class CustomTereport : Teleport 5 { 6 [HideInInspector] new public SteamVR_Action_Boolean teleportAction; 7     …   

C#

1親クラス 2namespace Valve.VR.InteractionSystem 3{ 4 //------------------------------------------------------------------------- 5 public class Teleport : MonoBehaviour 6 { 7 public SteamVR_Action_Boolean teleportAction = SteamVR_Input.GetAction<SteamVR_Action_Boolean>("Teleport"); 8     …

補足情報(FW/ツールのバージョンなど)

Unity2019.4.17f

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/25 09:38

試したら普通に消えるんですが、、、
kuriyama.kazuki

2021/01/26 00:59

ご確認いただきありがとうございます。 String型で試したところ確かに非表示になることが確認できました。 ただ、今回非表示となったのは追記したソースコード中のSteamVR_Action_Boolean型だったのですが、こちらは非表示となりませんでした。 小出しとなり、申し訳ございませんがソースコードを追加しました。
退会済みユーザー

退会済みユーザー

2021/01/26 06:07

親クラスにも[HideInInspector]付けたら消えませんか? 派生元がuew publicでも親のSteamVR_Action_Booleanは存在しますので、特に問題ない気がするのですが、、、
kuriyama.kazuki

2021/01/26 07:02

おっしゃる通り、[HideInInspector]付けたら消えると思うのですが、親クラスはSteamVR Pluginに含まるスクリプトになるため、Pluginのバージョンアップするごとに親クラスを修正する必要がでてしまうので、あまり触りたくないと考えています。 >派生元がuew publicでも親のSteamVR_Action_Booleanは存在しますので、特に問題ない気がするのですが、、、 new publicを子クラスの同名同型のクラスに付与したところでoverrideの様に上書きされずに別フィールドが生成されているということでしょうか。
退会済みユーザー

退会済みユーザー

2021/01/26 07:27

こういったnewは使った事が無いので残念ながら詳細はわかりません。 読んだのは派生先で隠しているだけでキャストなどすると実は別に本体があってそちらが実行されるみたいな仕様だと。確認はしていないので間違っているかもしれませんが、隠蔽っていう言葉の通り隠されているだけで生成はされているって事だと思います。 この系を調べると総じて使わないで!みたいな記事が多いのも分かりにくい罠があるって事なんでしょう。 インスペクタ表示部分が複雑でないならエディターで必要な表示だけにインスペクタを加工してしまうのもアリかもしれませんが、、、 さわりばかりで浅い知識しかないのでこれ以上はちょっと私では無理です。
退会済みユーザー

退会済みユーザー

2021/01/26 21:24

軽くさわってみましたが、やはりbaseとして存在して継承されたクラスには実はbaseのbaseが存在する、みたいな挙動でした。なので内容的にはoverrideに近いのではないでしょうか? いろいろ試した結果、質問の挙動としたい部分に関しては[System.NonSrialized]属性でインスペクタから消す事はできました、がそれに対する弊害は分からないです
kuriyama.kazuki

2021/01/29 00:46

色々調べて頂きありがとうございました。
guest

回答1

0

ベストアンサー

私もmrmthdtmさんのコメントに同意いたします。基底クラスのフィールドをインスペクターで見せたくないがために同名のフィールドを定義するというのは、何だかおかしなトラブルを起こしそうでおすすめしがたいですね...
CustomTeleport(ご提示のコードだとCustomTereportになっているようですが、打ち間違いでしょうか?)用のカスタムエディターを作ってインスペクターの表示をカスタマイズしてやれば、teleportActionだけ隠すことができそうです。

C#

1#if UNITY_EDITOR 2using UnityEditor; 3#endif 4 5namespace Valve.VR.InteractionSystem 6{ 7 public class CustomTeleport : Teleport 8 { 9 } 10 11 #if UNITY_EDITOR 12 [CustomEditor(typeof(CustomTeleport), true)] 13 public class CustomTeleportEditor : Editor 14 { 15 public override void OnInspectorGUI() 16 { 17 this.serializedObject.UpdateIfRequiredOrScript(); 18 var iterator = this.serializedObject.GetIterator(); 19 for (var enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false) 20 { 21 // 「teleportAction」という名称のプロパティがあれば、それは表示せず次のプロパティに進む 22 if (iterator.propertyPath == "teleportAction") 23 { 24 continue; 25 } 26 27 using (new EditorGUI.DisabledScope(iterator.propertyPath == "m_Script")) 28 { 29 EditorGUILayout.PropertyField(iterator, true); 30 } 31 } 32 this.serializedObject.ApplyModifiedProperties(); 33 } 34 } 35 #endif 36}

※ちなみに私の試した限りでは「string型なら非表示にできる」とおっしゃる点を再現させることができず、たとえstring型であっても、派生クラス上で基底クラスのシリアライズ対象フィールドと同名のフィールドを定義しようとしたところ「The same field name is serialized multiple times in the class or its parent class. This is not supported:」と文句を言われてしまいました。2020.2.2f1で試したのですが、バージョンの違いによるんでしょうかね?

投稿2021/01/26 10:10

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuriyama.kazuki

2021/01/29 00:47

やろうとしていた事が実現できました。ご回答頂き有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問