前提
Unity2Dで拡張機能を使い値の範囲を取得する。
実現したいこと
例えば、リザルト画面の画像を残機が3以上の時は黄色、残機が2以上の時はオレンジ色、残機が1以上の時は赤色にして三段階で切り替わるようにしたいです。
発生している問題・エラーメッセージ
エラーメッセージ Assets\Editor\EditorTest\MyDataEditor.cs(33,18): error CS0029: Cannot implicitly convert type 'void' to 'float'
該当のソースコード
C#
1// 拡張する側 2using UnityEditor; 3 4// カスタマイズするクラスを設定 5[CustomEditor(typeof(Zannki))] 6// 複数オブジェクトを選択した時に変更可能にする 7[CanEditMultipleObjects] 8public class MyDataEditor : Editor 9{ 10 // MinMaxSlider用の初期の値 11 float minVal; 12 float maxVal; 13 float middle; 14 15 void OnEnable() 16 { 17 } 18 19 // インスペクタが更新されたら呼ばれる 20 public override void OnInspectorGUI() 21 { 22 // シリアライズオブジェクトの更新 23 serializedObject.Update(); 24 25 // targetでデータを取得しキャスト 26 Zannki zannki = (Zannki)target; 27 28 // MinMaxSliderを使用してmin,maxの値を変える 29 minVal = EditorGUILayout.FloatField("min", zannki.min); 30 maxVal = EditorGUILayout.FloatField("max", zannki.max); 31 middle = EditorGUILayout.MinMaxSlider(ref minVal, ref maxVal, 0, 30); //***ここ*** 32 33 // 変更された値をデータに反映 34 zannki.min = minVal; 35 zannki.max = maxVal; 36 37 zannki.min = EditorGUILayout.FloatField("min", zannki.min); 38 zannki.max = EditorGUILayout.FloatField("max", zannki.max); 39 40 // 並びを調整して表示 41 EditorGUILayout.BeginHorizontal(); 42 43 GUILayout.Label("TEST"); 44 EditorGUILayout.LabelField("Test"); 45 46 EditorGUILayout.EndHorizontal(); 47 48 // シリアライズオブジェクトのプロパティの変更を更新 49 serializedObject.ApplyModifiedProperties(); 50 51 // デフォルトのインスペクタを表示 52 DrawDefaultInspector(); 53 54 // インスペクタにボタンを表示し押したら値をリセット 55 if (GUILayout.Button("全てのパラメータをリセット")) 56 { 57 58 Debug.Log("パラメータをリセットしました"); 59 } 60 61 // エディターの設定を取得 62 if (EditorPrefs.HasKey("TEST")) 63 { 64 if (EditorPrefs.GetBool("TEST")) 65 { 66 Debug.Log("エディター設定がセットされている"); 67 } 68 else 69 { 70 Debug.Log("エディター設定がセットされていない"); 71 } 72 } 73 74 // エディターの設定を保存 75 if (GUILayout.Button("値をセット・リセット")) 76 { 77 EditorPrefs.SetBool("TEST", !EditorPrefs.GetBool("TEST")); 78 } 79 80 // エディターの設定を削除 81 if (GUILayout.Button("エディター設定を削除")) 82 { 83 if (EditorPrefs.HasKey("TEST")) 84 { 85 EditorPrefs.DeleteKey("TEST"); 86 Debug.Log("エディター設定を削除しました。"); 87 } 88 } 89 90 EditorGUILayout.HelpBox("ここでインスペクタ項目終わり", MessageType.Info); 91 } 92}
C#
1// 拡張される側 2using UnityEngine.UI; 3using UnityEngine.SceneManagement; 4 5public class Zannki : MonoBehaviour 6{ 7 private Text zannkiText = null; 8 [HideInInspector] public int oldZannkiNum = 0; 9 [HideInInspector] public bool isGameOver; 10 public GameObject ScoreText; 11 Text SoldierScoreText; 12 13 [Header("切り替え")] public GameObject[] panel; 14 [Header("ライフ")] public int hikaku1; 15 [Header("ライフ")] public int hikaku2; 16 [Header("ライフ")] public int hikaku3; 17 18 public float min; // 小さい値 19 public float max; // 大きい値 20 21 public static Zannki instance; 22 private void Awake() 23 { 24 if (instance == null) 25 { 26 instance = this; 27 } 28 } 29 30 // Start is called before the first frame update 31 void Start() 32 { 33 zannkiText = GetComponent<Text>(); 34 SoldierScoreText = ScoreText.GetComponent<Text>(); 35 this.transform.localPosition = new Vector3(0f, 0f, 0f); 36 37 if (SceneManager.GetActiveScene().name == "Tutorial" || 38 SceneManager.GetActiveScene().name == "Stage1") 39 { 40 oldZannkiNum = ParaamsSO.Entity.zannki1; 41 } 42 if (SceneManager.GetActiveScene().name == "Stage2") 43 { 44 oldZannkiNum = ParaamsSO.Entity.zannki2; 45 } 46 if (SceneManager.GetActiveScene().name == "Stage3") 47 { 48 oldZannkiNum = ParaamsSO.Entity.zannki3; 49 } 50 if (SceneManager.GetActiveScene().name == "Stage4") 51 { 52 oldZannkiNum = ParaamsSO.Entity.zannki4; 53 } 54 if (SceneManager.GetActiveScene().name == "Stage5") 55 { 56 oldZannkiNum = ParaamsSO.Entity.zannki5; 57 } 58 if (SceneManager.GetActiveScene().name == "Stage6") 59 { 60 oldZannkiNum = ParaamsSO.Entity.zannki6; 61 } 62 if (SceneManager.GetActiveScene().name == "Stage7") 63 { 64 oldZannkiNum = ParaamsSO.Entity.zannki7; 65 } 66 if (SceneManager.GetActiveScene().name == "Stage8") 67 { 68 oldZannkiNum = ParaamsSO.Entity.zannki8; 69 } 70 if (SceneManager.GetActiveScene().name == "Stage9") 71 { 72 oldZannkiNum = ParaamsSO.Entity.zannki9; 73 } 74 if (SceneManager.GetActiveScene().name == "Stage10") 75 { 76 oldZannkiNum = ParaamsSO.Entity.zannki10; 77 } 78 if (SceneManager.GetActiveScene().name == "Stage11") 79 { 80 oldZannkiNum = ParaamsSO.Entity.zannki11; 81 } 82 if (SceneManager.GetActiveScene().name == "Stage12") 83 { 84 oldZannkiNum = ParaamsSO.Entity.zannki12; 85 } 86 } 87 88 public IEnumerator SubZannki() 89 { 90 if (oldZannkiNum > 0) 91 { 92 oldZannkiNum--; 93 SoldierScoreText.color = Color.red; 94 yield return new WaitForSeconds(0.7f); 95 SoldierScoreText.color = Color.black; 96 } 97 else 98 { 99 isGameOver = true; 100 SoldierScoreText.color = Color.red; 101 yield return new WaitForSeconds(0.7f); 102 SoldierScoreText.color = Color.black; 103 } 104 zannkiText.text = "" + oldZannkiNum.ToString(); 105 } 106 public IEnumerator AddZannki() 107 { 108 if (oldZannkiNum < 99) 109 { 110 oldZannkiNum +=2; 111 SoldierScoreText.color = Color.green; 112 yield return new WaitForSeconds(0.7f); 113 SoldierScoreText.color = Color.black; 114 } 115 zannkiText.text = "" + oldZannkiNum.ToString(); 116 } 117 118 public void RetryGame() 119 { 120 isGameOver = false; 121 } 122}
試したこと
小さい値と大きい値の範囲を取得しようとfloat型の変数を用意して代入してみたのですがエラーが発生してしまいました。
補足情報(FW/ツールのバージョンなど)
Unity2D
2021.2.13f1
VisualStudio2017
こちらの質問が複数のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。
そのエラーはどの行で出たもんなんでしょうか
https://teratail.com/questions/4zmb2jy34wvxnl
同じ質問を二重で投稿されてるようですがどっちに返せばいいんでしょう。
拡張機能を使っている理由は何ですか?
拡張機能はUnityエディタしか使えない(=アプリとしてビルドすると使用不可になる)ので、「リザルト画面で表示したい」という用途で使うのは間違っている気がしますがどうなんでしょう?
middle = EditorGUILayout.MinMaxSlider(ref minVal, ref maxVal, 0, 30); //***ここ***
この部分です。
先に質問した方に回答よろしくお願い致します。今、自分でも解決策を考え中です。
拡張機能を使っている理由は、MinMaxSliderを使うことで直感的にインスペクターで編集できるようにするためです。例えば、一番小さい値と一番大きい値は変数で取得できるのですが、間の値の時に処理を行いたい場合にどう取得すればよいか、ロジックが分かりません。ご迷惑をおかけして申し訳ありません。
エディタで最大値と最低値を設定しやすくするためのコントロールだから間の値も何もないですよ
回答1件
あなたの回答
tips
プレビュー