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

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

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

3732閲覧

unity でkeyと値がついたinspectorが作れずに困っています。

meJ15

総合スコア55

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/11 08:17

編集2019/10/11 09:51

前提・実現したいこと

参考URL
下のようなinspectorを作りたいのですが
イメージ説明

一つづつ

public float idle; public float eyeBlink; public void Upadate() { idel=... eyeBlink=... }

とするのはめんどくさいと感じて下のように
public float配列で作ったのですが、keyがわからなく困っています。

イメージ説明

もっと賢い作り方を考えているのですが、限界を感じて質問しています。

該当のソースコード

C#

1 2 public float eye_face; 3 4 public float[] face_list = new float[65]; 5 6 private bool nameListBool = false; 7 8 public void Update() { 9 var net = NetworkMeshAnimator.Instance; 10 face_list = net.blendShapeList; 11 12 13 if(!nameListBool){ 14 var nameList = net.blendShapeName; 15 Debug.Log(nameList); 16 Debug.Log(nameList.Count); 17 for (int i = 0; i < nameList.Count; i++) 18 { 19 Debug.Log(nameList[i]); 20 if(i>19){ 21 nameListBool = true; 22 } 23 } 24 }

できていること

face_listという配列の一つずつに値を入れることはできています。
nameListという配列にkeyにしたい文字列を入れています。

やりたいこと

nameList[0] : face_list[0]
nameList[1] : face_list[1]
nameList[2] : face_list[2]

このように nameListの文字列 = face_listの値
というインスペクタを参考URLのように作りたいです。

考え方だけやヒントになりそうなことでも教えていただけると嬉しいです。

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

Mac
Unity 2018.3.14

修正に関して

クラスを作ることをやってみようとしているのですが、遠回りの実装をしている気がしたので、アドバイスを頂きたいです。

クラスを作って
その変数にfloat でbrowOuterUpRight .... とすることで、
参考URLのようにinspectorを作るつことができたのですが、
updateの中でそのクラスに値をセットするメソッドを使って、適当な値を下のように代入しても

public void SetDate(int order ,float data){ //faceList[order] = data; cheekPuff = data; }

inspectorでは反映されませんでした。(なぜなのでしょうか?)
update関数内での

Debug.Log(faceblendshape.cheekPuff);

では値が入ってることを確認できています。

イメージでは、
update関数で配列のindexと値を使って
クラスのset関数を呼び出して、
配列のindexに対応するfloat(cheekPuff)に値を代入しようと思っているのですが、、、、

c#

1 [System.Serializable] 2 class FaceBlendShape 3 { 4 public float browOuterUpRight, mouthLowerDownLeft, eyeLookUpLeft, cheekPuff; 5 6 public string[] faceList = {"browOuterUpRight","mouthLowerDownLeft","eyeLookUpLeft","cheekPuff"}; 7 8 public string SetDate(int order ,float data){ 9 //faceList[order] = data;としたいが、stringにfloatを入れることになってしまう。 10 cheekPuff = data; 11 return "0"; 12 } 13 } 14 [SerializeField] FaceBlendShape faceBlend; 15 16 17 public void Update() { 18 FaceBlendShape faceblendshape = new FaceBlendShape(); 19 var net = NetworkMeshAnimator.Instance; 20 var nameList = net.blendShapeName; 21 22 for (int i = 0; i < nameList.Count; i++){ 23 faceblendshape.SetDate(i,net.blendShapeList[i]); 24 } 25 Debug.Log(faceblendshape.cheekPuff);

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

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

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

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

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

sakura_hana

2019/10/11 08:28

データ形式としては「Dictionary」の出番だと思うけど、そのままだとインスペクターに出ないので 「unity dictionary inspector」でググってみてください。 その他、用途によってはstringとfloatを持ったクラスを作ってその配列を使うのもありかもしれません。
sakura_hana

2019/10/13 04:02

>追記部分に関して このコードだと、毎フレーム(Updateする度)新しいクラスを作成し、その中の「cheekPuff」変数へデータを入れています。 インスペクタ上に表示されるのはクラスの中、メソッドの外で定義されているpublic変数のみです。 今回の場合は「faceBlend」がインスペクタに表示されます(「faceblendshape」ではない)。 なので「faceblendshape」の部分を「faceBlend」にすれば動くのではないかと思います。
guest

回答1

0

自己解決

辞書形式で保存して(blendshape:value)それを全部もとめて表示するようにしました

public string[] faceList=new string[65]; foreach (KeyValuePair<string, float> pair in dict_sorted) { faceList[i]=(pair.Key + " : " + pair.Value); }

投稿2019/10/14 08:09

meJ15

総合スコア55

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問