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

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

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

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

Q&A

1回答

2673閲覧

カスタムエディタのフィールド。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2016/11/11 05:00

編集2016/11/14 14:08

###前提・実現したいこと

※既存のクラスにInspector拡張処理を追記する方法で、カスタムエディタを作成したいと考えています。
(EditorフォルダにInspector拡張用のクラスを用意しない方法。)

下記のようにコードを作成したのですが、変数iのフィールドがインスペクターに表示されません。
また、変数iはstaticにしないとエラーが起きてしまいます。

質問①:
staticな変数iをインスペクタに表示させるにはどうすればよいでしょうか?
「base.OnInspectorGUI();」を記述すればフィールドがインスペクタに表示される思っていたのですが、
表示されません。
「base.OnInspectorGUI();」は拡張したいコンポーネントのクラスのフィールドを表示するものではないのですか?

質問②:
変数iはstaticにしないと、SampleInspectorクラスからアクセスできないのですか?
このスクリプトをアタッチするゲームオブジェクトをプレハブ化して、staticでないインスタンス変数iにして、
SampleInspectorクラスからそのiにアクセスする方法はありますか?

ご教授のほどよろしくお願いします。

###試したこと

下記のコードを空のゲームオブジェクトにアタッチしました。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEditor; 4 5public class Sample : MonoBehaviour { 6 7 [SerializeField] 8 static int i = 100; //staticでないとエラー?インスペクタに表示されない。 9 10 [CustomEditor(typeof(Sample))] 11 public class SampleInspector : Editor 12 { 13 public override void OnInspectorGUI() 14 { 15 base.OnInspectorGUI(); 16 if (GUILayout.Button("ボタン", GUILayout.Width(80f))) { 17 i+=10; 18 Debug.Log (i); 19 } 20 } 21 } 22}

上記のコードではデバッグはとれていて、iの値は変化しています。

###追記。

staticな変数の場合。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEditor; 4 5public class Sample : MonoBehaviour { 6 7 [SerializeField] 8 //int i = 100; 9 //staticな変数にしてみる。 10 static int j = 50; 11 12 [CustomEditor(typeof(Sample))] 13 public class SampleInspector : Editor 14 { 15 16 //SerializedProperty spi; 17 SerializedProperty spj; 18 19 void OnEnable() 20 { 21 // SerializedProperty取得 22 //spi = serializedObject.FindProperty( "i" ); 23 spj = serializedObject.FindProperty( "j" ); 24 } 25 26 public override void OnInspectorGUI() 27 { 28 // 値の更新 29 serializedObject.Update(); 30 31 base.OnInspectorGUI(); 32 if (GUILayout.Button("ボタン", GUILayout.Width(80f))) { 33 //spi.intValue +=10; 34 spj.intValue += 10; 35 } 36 37 // 値の反映 38 serializedObject.ApplyModifiedProperties(); 39 } 40 } 41}

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

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

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

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

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

guest

回答1

0

EditorクラスのserializedObjectを使用すれば、Sampleクラスのメンバにアクセスできます。

[参考]
https://docs.unity3d.com/ja/current/ScriptReference/Editor.html

C#

1using UnityEngine; 2using UnityEditor; 3 4/// <summary> 5/// Sample 6/// </summary> 7public class Sample : MonoBehaviour 8{ 9 [SerializeField] 10 int i; 11 12 /// <summary> 13 /// Start 14 /// </summary> 15 void Start() 16 { 17 i = 0; 18 } 19 20} // class Sample 21 22/// <summary> 23/// SampleInspector 24/// </summary> 25[CustomEditor( typeof( Sample ) )] 26public class SampleInspector : Editor 27{ 28 /// <summary> 29 /// SampleのiにアクセスするためのSerializedProperty 30 /// </summary> 31 SerializedProperty spi; 32 33 /// <summary> 34 /// OnEnable 35 /// </summary> 36 void OnEnable() 37 { 38 // SerializedProperty取得 39 spi = serializedObject.FindProperty( "i" ); 40 } 41 42 /// <summary> 43 /// OnInspectorGUI 44 /// </summary> 45 public override void OnInspectorGUI() 46 { 47 // 値の更新 48 serializedObject.Update(); 49 50 // デフォルトのインスペクター表示 51 base.OnInspectorGUI(); 52 53 if( GUILayout.Button( "ボタン", GUILayout.Width( 80.0f ) ) ) 54 { 55 spi.intValue += 10; 56 Debug.Log( spi.intValue ); 57 } 58 59 // 値の反映 60 serializedObject.ApplyModifiedProperties(); 61 } 62 63} // class SampleInspector 64

投稿2016/11/13 12:45

StudioAres

総合スコア127

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

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

退会済みユーザー

退会済みユーザー

2016/11/14 14:14

ご回答ありがとうございます。 いただいたコードで、プレハブ化して試したところ、インスタンス変数として、インスペクタに表示されてアクセスできることが確認できました。 staticな変数の場合はどのように書けばよいのでしょうか? SerializeFieldに関して、私があまり理解できていない(マニュアルを見ても理解できていない)のもあって、いただいたコードでstaticにして試してみたのですが、インスペクタに表示されませんでした(詳細は追記に記述しました)。 ご教授いただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問