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

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

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

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

Unity

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

Q&A

解決済

1回答

853閲覧

PropertyDrawerのリストの要素ごとで変数を保持したい

LightGive

総合スコア14

C#

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

Unity

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

0グッド

0クリップ

投稿2017/10/11 08:54

###前提・実現したいこと
現在オーディオ関係をまとめた自作クラスのPropertyDrawerを作成しそれをリストにして、インスペクターの拡張をしています。

インスペクタ上でボタンを押したとき、ループ再生や通常再生などが出来るようにする予定ですが、下の画像の様に、ボタンを押したとき、リスト全てのボタンが押された状態になってしまいます。

調べていたら、変数がリストになっていたのが原因だと分かりましたが、解決方法が分かりません。

インスペクター拡張が複雑になっていたので、シンプルなPropertyDrawerを作りました。
挙動としてはリストを使用しつつ、画像1の様にそれぞれボタンを押せるようにしたいです。

【画像1:変数を一つずつ分けた時】
変数を一つずつ分けた時

【画像2:変数をリストにした時】
変数をリストにした時

###該当のソースコード
テストコードはGitHubに公開しました。
こちらにプルリクエストしてもらっても大丈夫です。

GitHub

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

・自作した変数

[System.Serializable] public class Piyo { }

・上のクラスのPropertyDrawer

using UnityEngine; [System.Serializable] public class PiyoAttribute : PropertyAttribute { public bool isButtonOn = false; public PiyoAttribute() { } }
using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(PiyoAttribute))] public class PiyoDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { PiyoAttribute att = (PiyoAttribute)attribute; using (new EditorGUI.PropertyScope(position, label, property)) { var buttonLabelRect = new Rect(position) { width = position.width / 2.0f }; var buttonRect = new Rect(position) { x = position.width / 2.0f, width = position.width / 2.0f }; EditorGUI.LabelField(buttonLabelRect, "Test"); att.isButtonOn = GUI.Toggle(buttonRect, att.isButtonOn, att.isButtonOn ? "On" : "Off", GUI.skin.button); } } }

・インスペクター表示用

using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { [SerializeField, Piyo] private List<Piyo> piyo = new List<Piyo>(); }

###補足情報(言語/FW/ツール等のバージョンなど)
使用言語:C#
Unityのバージョン:Unity20171.1.p3

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

適切な方法なのかはちょっと自信ないのですが、下記のように手を加えてみました。

PiyoAttribute

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class PiyoAttribute : PropertyAttribute 7{ 8 public Dictionary<string, bool> buttonStates = new Dictionary<string, bool>(); // 変更...プロパティパスをキーとするDictionaryを使う 9 public PiyoAttribute() { } 10}

PiyoDrawer

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEditor; 5 6[CustomPropertyDrawer(typeof(PiyoAttribute))] 7public class PiyoDrawer : PropertyDrawer 8{ 9 public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 10 { 11 PiyoAttribute att = (PiyoAttribute)attribute; 12 using (new EditorGUI.PropertyScope(position, label, property)) 13 { 14 var buttonLabelRect = new Rect(position) 15 { 16 width = position.width / 2.0f 17 }; 18 var buttonRect = new Rect(position) 19 { 20 x = position.width / 2.0f, 21 width = position.width / 2.0f 22 }; 23 EditorGUI.LabelField(buttonLabelRect, "Test"); 24 var propertyPath = property.propertyPath; // 追加...プロパティパスを取得 25 Debug.Log(propertyPath); // 追加...プロパティパスをコンソールに表示してみる 26 bool currentState; // 追加...この変数にattに格納されているボタン状態を受け取る 27 att.buttonStates.TryGetValue(propertyPath, out currentState); // 追加...プロパティパスに対応するボタン状態を取得、キーが存在しなければfalse(boolのデフォルト値) 28 att.buttonStates[propertyPath] = GUI.Toggle(buttonRect, currentState, currentState ? "On" : "Off", GUI.skin.button); // 変更...プロパティパスをキーとしてボタン状態を保管する 29 } 30 } 31}

他のスクリプトは変更していません。
ちなみに、ボタン状態をPiyoではなくPiyoAttributeに格納しているため(だと思いますが...エディタ拡張の勉強が足りず不確かです...)、別のオブジェクトのインスペクタを表示させてからTestのインスペクタを再表示させるとボタン状態が全部オフに戻ってしまいますが、この動作でOKでしょうか(最終目的がループ再生の切り替えボタンの作成なら、この動作の方が都合がいいかもしれませんね)。

投稿2017/10/14 14:16

編集2017/10/14 14:18
Bongo

総合スコア10807

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

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

LightGive

2018/03/17 00:14

回答に気づかず申し訳ありません>_< 他のところで同じ方法で教えてもらい、成功しました! property.propertyPathで分けるのがいいみたいですね、 丁寧な回答ありがとうございました(*'-'*)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問