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

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

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

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

Unity

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

Q&A

解決済

2回答

473閲覧

エディタ拡張でスライダーが動かなくなる

pikumin001

総合スコア132

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/10 06:48

パーリンノイズを作成して重ねたいのですが、インスペクターが見にくいため、エディタ拡張で少し見やすくしようと思ったのですが、
boolでノイズをオートアップデートするかどうかのチェックが入っていると、スライダーが動かなくなります。
ただ単にノイズ作成の関数を呼び出さなければスライダーは動くようなのですが、なぜスライダーが動かなくなるのでしょうか?

ノイズ作成

c#

1using System.Collections; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5 6public class noise001 : MonoBehaviour { 7 8 public Vector2 size; 9 public int octave; 10 11 public bool autUpdat; 12 13 14 public List<NoiseArray> noise_array; 15 16 17 [System.Serializable] 18 public class NoiseArray 19 { 20 [Range(1,0)] 21 public float frewuency; 22 public Vector2 org; 23 public float scale; 24 } 25 26public void NoiseCreate() 27 { 28 float Objx = transform.position.x; 29 float Objy = transform.position.z; 30 float[,] PerlinNoiseArry = new float[(int)size.x, (int)size.y]; 31 32 for (int i = 0; i < noise_array.Count; i++) 33 { 34 for (int x = 0; x < size.x; x++) 35 { 36 for (int y = 0; y < size.y; y++) 37 { 38 float noiseX = x / size.x * noise_array[i].scale; 39 float noiseY = y / size.y * noise_array[i].scale; 40 float NoisTmp = Mathf.PerlinNoise(noiseX, noiseY); 41 42 PerlinNoiseArry[x, y] = NoisTmp; 43 } 44 } 45 } 46 47 48 49 display(PerlinNoiseArry); 50 } 51 52 public Renderer rend; 53 Color[] color; 54 void display(float[,] Array) 55 { 56 rend = GetComponent<Renderer>(); 57 Material m = new Material(rend.sharedMaterial); 58 color = new Color[(int)size.x * (int)size.y]; 59 60 for (int x = 0; x < size.x; x++) 61 { 62 for (int y = 0; y < size.y; y++) 63 { 64 color[x * (int)size.y + y] = Color.Lerp(Color.black, Color.white, Array[x, y]); 65 } 66 } 67 68 Texture2D texture = new Texture2D((int)size.x, (int)size.y); 69 70 texture.SetPixels(color); 71 texture.Apply(); 72 rend.material = m; 73 rend.sharedMaterial.mainTexture = texture; 74 rend.transform.localScale = new Vector3((int)size.x, 1, (int)size.y); 75 } 76

エディタの拡張

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEditor; 5 6 7[CustomEditor(typeof(noise001))] 8public class noise001Editor : Editor 9{ 10 11 SerializedProperty itemsProp; 12 int currentIndex; 13 14 private void OnEnable() 15 { 16 } 17 18 19 public override void OnInspectorGUI() 20 { 21 serializedObject.Update(); 22 23 noise001 noise = (noise001)target; 24 25 noise.OctChange(); 26 27 if (noise.autUpdat) 28 { 29 noise.NoiseCreate(); 30 } 31 32 noise.size = EditorGUILayout.Vector2Field("Size", noise.size); 33 noise.octave = EditorGUILayout.IntField("octave", noise.octave); 34 noise.autUpdat = EditorGUILayout.Toggle("autoUpdata", noise.autUpdat); 35 36 itemsProp = serializedObject.FindProperty("noise_array"); 37 if (noise != null && itemsProp.arraySize != 0) 38 { 39 currentIndex = EditorGUILayout.IntSlider(currentIndex, 0, itemsProp.arraySize - 1); 40 41 SerializedProperty selectedItemProp = itemsProp.GetArrayElementAtIndex(currentIndex); 42 EditorGUILayout.PropertyField(selectedItemProp,true); 43 selectedItemProp.isExpanded = true; 44 } 45 46 serializedObject.ApplyModifiedProperties(); 47 48 } 49}

イメージ説明

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しましたが、バグですかね・・・
解決方法を記載しておきます。

どうやら、マテリアルにnewマテリアルをいれる動作が悪さをしていたようなので
関数からMaterial mを取り出して、
if(m == null) m = new Material(rend.sharedMaterial);
としたところ、スライドすることが可能になりました。

c#

1 public Renderer rend; 2 Color[] color; 3 Material m; 4 void display(float[,] Array) 5 { 6 rend = GetComponent<Renderer>(); 7 if(m == null) m = new Material(rend.sharedMaterial); 8 color = new Color[(int)size.x * (int)size.y]; 9 10 for (int x = 0; x < size.x; x++) 11 { 12 for (int y = 0; y < size.y; y++) 13 { 14 color[x * (int)size.y + y] = Color.Lerp(Color.black, Color.white, Array[x, y]); 15 } 16 } 17 18 Texture2D texture = new Texture2D((int)size.x, (int)size.y); 19 20 texture.SetPixels(color); 21 texture.Apply(); 22 rend.material = m; 23 rend.sharedMaterial.mainTexture = texture; 24 rend.transform.localScale = new Vector3((int)size.x, 1, (int)size.y); 25 }

投稿2018/05/10 08:52

pikumin001

総合スコア132

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

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

0

推論です。
OnInspectorGUIはエディタが開いている間毎フレーム呼び出される為、noise.NoiseCreate();の負荷によりスライダーが動かなくなっている可能性があります。
まずはソースコードを少しずつコメントアウトしていき、どこで動かなくなるか確認するといいと思います。

投稿2018/05/10 08:51

sakura_hana

総合スコア11427

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

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

pikumin001

2018/05/10 08:57

回答ありがとうございます。 負荷によって動かなる場合でも、バー横のボックスに数値を直接入力すれば変わるはずなのですが、 数値を入力した直後に0に戻されるため、バグの一種ではないかと思います。 とりあえず分岐でマテリアルがない場合にのみ新しいrend.sharedMaterialをいれると 動くので、よしとします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問