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

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

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

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

Q&A

解決済

1回答

244閲覧

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

isimasa

総合スコア295

C#

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

0グッド

0クリップ

投稿2022/07/31 05:57

前提

Unity2Dで拡張機能を実装中、分からないことが出てきました。値の範囲を取得するMinMaxSlider
というものの間の範囲を取得したいです。

実現したいこと

例えば、リザルト画面で残機の数に応じて3種類の画像を切り替えたいとき、残機が3以上だったら黄色、残機が2以上だったらオレンジ色、残機が1以上だったら赤色の画像をSetActiveします。if文の判定で三段階のクリア画面を実現したいです。

発生している問題・エラーメッセージ

エラーメッセージ 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型で変数を定義して、"EditorGUILayout.MinMaxSlider(ref minVal, ref maxVal, 0, 30);"
を代入すれば間の値まで取得できると考えました。

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

Unity2D
2021.2.13f1
VisualStudio2017

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

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

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

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

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

guest

回答1

0

自己解決

私が今実装してみるならこんな感じです。簡易的な実装としてTextMeshProUGUIで表示を切り替えてみます。

C#

1using TMPro; 2 3public class GameUIController : MonoBehaviour 4{ 5 public static GameUIController instance; 6 7 [SerializeField] TextMeshProUGUI gameSituation; 8 [SerializeField] string conditions_1_Name; 9 [SerializeField] string conditions_2_Name; 10 [SerializeField] string gameClearName; 11 12 private void Awake() 13 { 14 if(instance == null) 15 { 16 instance = this; 17 } 18 } 19 20 void Start() 21 { 22 gameSituation.text = ""; 23 } 24 25 public void Conditions_1() 26 { 27 gameSituation.text = conditions_1_Name; 28 } 29 public void Conditions_2() 30 { 31 gameSituation.text = conditions_2_Name; 32 } 33 34 public void GameClear() 35 { 36 gameSituation.text = gameClearName; 37 } 38}
public class Quest : MonoBehaviour { private int enemyType01Count = 3; private int enemyType02Count = 2; public void IncrementEnemyCount(EnemyData.EnemyType enemyType) { switch (enemyType) { case EnemyData.EnemyType.ENEMYID_01: if (enemyType01Count > 0) { enemyType01Count--; Debug.Log($"Enemy {enemyType} defeated. {enemyType01Count} remaining."); } else { Debug.Log($"No more enemies of type {enemyType} remaining."); } break; case EnemyData.EnemyType.ENEMYID_02: if (enemyType02Count > 0) { enemyType02Count--; Debug.Log($"Enemy {enemyType} defeated. {enemyType02Count} remaining."); } else { Debug.Log($"No more enemies of type {enemyType} remaining."); } break; // 他の敵の種類に対する処理も必要に応じて追加 default: Debug.LogError($"Unknown enemy type: {enemyType}"); break; } // 敵キャラクター1を全て倒した時のチェック if (enemyType01Count <= 0) { GameUIController.instance.Conditions_1(); } // 敵キャラクター2を全て倒した時のチェック if (enemyType02Count <= 0) { GameUIController.instance.Conditions_2(); } // クリア条件のチェック if (CheckClearConditions()) { GameUIController.instance.GameClear(); Debug.Log("Quest1 Clear"); } } public bool CheckClearConditions() { // クリア条件のチェック int remainingEnemies = enemyType01Count + enemyType02Count; // 他の敵の種類も必要に応じて追加 Debug.Log("enemyCount: " + remainingEnemies); return remainingEnemies <= 0; } }

EnemyData.csではScriptableObjectを継承してenum EnemyTypeで敵のタイプを宣言します。
敵個体につけるスクリプトで以下のようにしてインスペクターからタイプを変更できるようにします。

C#

1public EnemyData enemyData;

載せているスクリプトはそれだけで動作します。
また、便利?なのが
ScriptableObjectのデータをMonoBehaviour継承クラスに流し込み、戻り値で値を返すようにしておき値を取得できるようにしておくことです。

投稿2023/11/07 07:16

isimasa

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問