質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

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

Q&A

解決済

2回答

14980閲覧

UI.Buttonを継承したクラスのメンバ変数がインスペクタに表示されない。

Waken

総合スコア37

Unity

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

0グッド

0クリップ

投稿2016/06/21 14:17

UI.Buttonを継承して、自分用のリッチなButtonを作ろうと考えました。

試しに、以下のようにしたのですが、

C#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections; 4 5public class RichButton : Button { 6 public int myInt; 7}

このmyIntがインスペクタ上に表示されず、エディタから値を変更することができません。

継承元のButtonの変数はインスペクタ上に表示されています。

どうして、このようなことが起きるのでしょうか?

また、継承先の変数をインスペクタ上に表示されるようにすることはできるのでしょうか?

よろしくお願いいたします。

バージョン : Unity 5.3.5f1 Personal for Mac

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

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

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

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

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

guest

回答2

0

ベストアンサー

推測で申し訳ないのですが、Unity標準のコンポーネントはエディタ拡張されているからではないでしょうか。
RichButtonCutomEditorを用いて、変数の型通りにInspector上に表示してみると、以下の画像のようになりました。

RichButton.cs

csharp

1using UnityEngine; 2using UnityEditor; 3 4[CustomEditor( typeof( RichButton ) )] 5public class RichButtonEditor : Editor 6{ 7 public override void OnInspectorGUI() 8 { 9 // 各変数の型通りに表示する 10 base.OnInspectorGUI(); 11 } 12 13} // class RichButtonEditor

イメージ説明

比べてみるとわかる通り、単純に変数の型通りにInspectorに表示しても、Buttonコンポーネントの表示と違ってきています。
そのためButtonコンポーネントはエディタが拡張されていることがわかります。

ただ、自分でMonoBehaviourを継承したクラスAをさらに継承したクラスBを作成し、クラスAのみCutomEditorを用いた場合以下のようになりました。

A.cs

csharp

1public class A : MonoBehaviour 2{ 3 public int AAA; 4 5} // class A

B.cs

csharp

1public class B : A 2{ 3 public int BBB; 4 5} // class B 6

AEditor.cs

csharp

1[CustomEditor( typeof( A ) )] 2public class AEditor : Editor 3{ 4 public override void OnInspectorGUI() 5 { 6 var so = serializedObject.FindProperty( "AAA" ); 7 so.intValue = EditorGUILayout.IntSlider ( so.name, so.intValue, -100, 100 ); 8 serializedObject.ApplyModifiedProperties(); 9 } 10 11} // class AEditor

イメージ説明

継承元のクラスAのエディタ拡張がなくなって、クラスBの変数が表示されるという状態になり、Buttonの時とは違う挙動になってしまいました。
Unity標準のコンポーネントはエディタの拡張が特殊なのかもしれません。

投稿2016/06/26 21:43

urahimono

総合スコア714

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

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

Waken

2016/06/27 01:45

回答ありがとうございます。 Unity初心者で、Editor拡張に疎いので非常に勉強になりました。 >継承元のクラスAのエディタ拡張がなくなって、クラスBの変数が表示されるという状態になり、Buttonの時とは違う挙動になってしまいました。 うーん、これ、不可解で気持ち悪いですね。 ButtonがクラスAと同じように普通のEditor拡張なのであれば、Buttonの変数にRichButtonの変数が追加されたものがInspector上に表示されるだけなはずですよね。 どうなっているんでしょう??? もう少し、他に回答がつかないか待ってみることにします。 ありがとうございました。
guest

0

MonoBehaviourを継承したクラスであればpublic変数はインスペクターに表示されます。

直接Buttonクラスを拡張するのではなく、
MonoBehaviourを継承したCustomButtonクラスを用意して、
それでボタンを拡張する処理を作り込めば簡単だと思います。

イメージ説明

C#

1using UnityEngine; 2using System.Collections; 3 4public class CustomButton : MonoBehaviour 5{ 6 public int myInt; 7 void Awake () 8 { 9 // myIntの値に応じてボタンを拡張する 10 } 11}

投稿2016/06/26 05:36

buibui80

総合スコア1033

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

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

Waken

2016/06/26 06:11

回答有り難うございます。 そのようにできるのは理解できるのですが、Buttonクラスも元をたどればMonoBehaviourを継承しています。なので、Buttonクラスを継承した場合もInspectorに変数が表示されてしかるべきだと思うのですが、何故表示されないのかが疑問です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問