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

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

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

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

Q&A

解決済

1回答

374閲覧

Unity2D 拡張機能 値の範囲を取得する

isimasa

総合スコア295

C#

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

0グッド

0クリップ

投稿2022/07/31 06:12

前提

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

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

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

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

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

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

y_waiwai

2022/07/31 06:38

そのエラーはどの行で出たもんなんでしょうか
fiveHundred

2022/07/31 07:13

拡張機能を使っている理由は何ですか? 拡張機能はUnityエディタしか使えない(=アプリとしてビルドすると使用不可になる)ので、「リザルト画面で表示したい」という用途で使うのは間違っている気がしますがどうなんでしょう?
isimasa

2022/07/31 07:49

middle = EditorGUILayout.MinMaxSlider(ref minVal, ref maxVal, 0, 30); //***ここ*** この部分です。 先に質問した方に回答よろしくお願い致します。今、自分でも解決策を考え中です。 拡張機能を使っている理由は、MinMaxSliderを使うことで直感的にインスペクターで編集できるようにするためです。例えば、一番小さい値と一番大きい値は変数で取得できるのですが、間の値の時に処理を行いたい場合にどう取得すればよいか、ロジックが分かりません。ご迷惑をおかけして申し訳ありません。
RiaFeed

2022/07/31 08:00

エディタで最大値と最低値を設定しやすくするためのコントロールだから間の値も何もないですよ
guest

回答1

0

自己解決

C#

1[Header("切り替え")] public GameObject[] panel; 2public float min; // 小さい値 3public float max; // 大きい値 4 5public void Value_M() 6 { 7 float count = max + min / 3; 8 Debug.Log("間の値" + count); 9 10 if (min >= hikaku1) 11 { 12 panel[0].SetActive(true); // 黄色 13 panel[1].SetActive(false); 14 panel[2].SetActive(false); 15 } 16 if (max >= hikaku2) 17 { 18 panel[0].SetActive(false); 19 panel[1].SetActive(true);// オレンジ 20 panel[2].SetActive(false); 21 } 22 if (count >= hikaku3) 23 { 24 panel[0].SetActive(false); 25 panel[1].SetActive(false); 26 panel[2].SetActive(true);// 赤 27 } 28 }

これを、Clearオブジェクトにプレイヤーが当たって非表示になる前に実行することで思った通りの実行結果になりました。プレイヤーにつけているスクリプトで処理を書いていたので、クリアオブジェクトに当たった時に一緒に非表示にしてしまっていました。なので、IEnumeratorでコルーチンを使うことで解決しました。

投稿2022/07/31 08:06

isimasa

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問