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

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

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

595閲覧

選択肢分岐する際に他のクラスの情報を取得したい

Gchan

総合スコア19

C#

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

Unity

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

0グッド

0クリップ

投稿2019/11/01 06:45

簡単なカードゲームにおいて、プレイヤーのキャラクター(Hero)に割り当てたenumの種類によって
ターン開始時に表示される選択肢パネル上のテキストを変更して、果物関連の選択肢か野菜関連の選択肢かに切り替えるスクリプトを書きたいと思っていて

プレイヤーのキャラクターに関してはプレハブをインスタンス化してスクリプタブルオブジェクトで管理しています。
とりあえず全体の流れを書いていきます。

まずHeroEntity.csでHeroのスクリプタブルオブジェクトを作成

HeroEntity.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4[CreateAssetMenu(fileName ="HeroEntity",menuName ="Create HeroEntity")] 5public class HeroEntity : ScriptableObject 6{ 7 public Sprite hero; //heroのアイコン画像 8 public CARDLEVEL level; //heroのレベル 9} 10public enum CARDLEVEL //heroのレベル段階 11{ 12 LEVEL3, 13 LEVEL4, 14 LEVEL5, 15}

次にHeroModel.csでHeroの器を作成

HeroModel.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4public class HeroModel 5{ 6 public Sprite hero; 7 public CARDLEVEL level; 8 public bool isPlayerHero; //プレイヤーのヒーローかどうか 9 public HeroModel(int heroID, bool isPlayer) 10 { 11 HeroEntity heroEntity = Resources.Load<HeroEntity>("HeroEntityList/Hero" + heroID); 12 hero = heroEntity.hero; 13 isPlayerHero = isPlayer; 14 } 15} 16

次にHeroView.csでHeroの見かけを設定

HeroView.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5public class HeroView : MonoBehaviour 6{ 7 [SerializeField] Image heroImage = default; 8 9 public void ShowHero(HeroModel heroModel) 10 { 11 heroImage.sprite = heroModel.hero; 12 } 13}

最後にHeroController.csでコントローラーを設置

HeroController.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4public class HeroController : MonoBehaviour 5{ 6 HeroView view; 7 public HeroModel model; 8 9 private void Awake() 10 { 11 { 12 view = GetComponent<HeroView>(); 13 } 14 } 15 public void MakeHero(int heroID, bool isPlayer) 16 { 17 model = new HeroModel(heroID, isPlayer); 18 view.ShowHero(model); 19 } 20}

Heroを表示するためのメソッドはGameManager.csに記載

GameManager.cs

C#

1 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using UnityEngine.UI; 7 8 [SerializeField] Transform playerHeroTransform = default; //プレイヤーHeroを表示するパネル 9 [SerializeField] Transform enemyHeroTransform = default; //エネミーHeroを表示するパネル 10 [SerializeField] HeroController heroPrefab = default; //Heroのプレハブ 11 12 List<int> playerHero = new List<int>(); 13 List<int> enemyHero = new List<int>(); 14 15 List<int> HeroEvolve = new List<int>() { 1, 2, 3 }; 16 17 public bool isPlayerTurn; //プレイヤーターンかどうか 18 19 void Start() 20 { 21 //HeroEvolveのリストをそれぞれのプレイヤーのHeroリストに追加 22 playerHero.AddRange(HeroEvolve); 23 enemyHero.AddRange(HeroEvolve); 24 25 //それぞれのHeroパネルの上にHeroを生成 26 //この段階ではHeroEvloveの要素1番目がお互いに生成されているので 27 //要素[0]の1がHeroModel.csの"HeroEntityList/Hero" + heroIDのheroIDに入るので 28 //HeroEntityListフォルダに入っているHero1という名前で設定されたHeroが表示される 29 GiveHero(HeroEvolve, playerHeroTransform); 30 GiveHero(HeroEvolve, enemyHeroTransform); 31 } 32 33 34 public void GiveHero(List<int> evolve, Transform herofield) 35 { 36 int heroID = evolve[0]; //取得したリストの1番目の要素をheroIDとする 37 CreateHero(heroID, herofield); 38 } 39 void CreateHero(int heroID, Transform herofield) 40 { 41 HeroController hero = Instantiate(heroPrefab, herofield, false); //Heroプレハブのインスタンス生成 42 if (herofield.transform == playerHeroTransform) //生成場所がプレイヤーのHero配置場所なら 43 { 44 hero.MakeHero(heroID, true); //isPlayerHeroをtrueに 45 } 46 else 47 { 48 hero.MakeHero(heroID, false); 49 } 50 }

今回追加したい要素
aとbどちらを選びますか?という選択肢のパネルをHeroのenumに設定したカードレベルで条件分岐させたい。
多分スクリプトを先に書いた方が早いと思うので、変更したスクリプトを書きます

まずGameManager.cs

変更予定のGameManager.cs

C#

1 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using UnityEngine.UI; 7 8 [SerializeField] Transform playerHeroTransform = default; 9 [SerializeField] Transform enemyHeroTransform = default; 10 [SerializeField] HeroController heroPrefab = default; 11 [SerializeField] GameObject choisePanel = default; //選択肢表示パネル 12 [SerializeField] Text choiseText = default; //パネル全体のテキスト。"どちら選びますか?"的な 13 [SerializeField] Text achoiseText = default; //aボタン上のテキスト 14 [SerializeField] Text bchoiseText = default; //bボタン上のテキスト 15 16 List<int> playerHero = new List<int>(); 17 List<int> enemyHero = new List<int>(); 18 19 List<int> HeroEvolve = new List<int>() { 1, 2, 3 }; 20 21 void Start() 22 { 23 choisePanel.SetActive(false); //スタート時には表示させないため 24 playerHero.AddRange(HeroEvolve); 25 enemyHero.AddRange(HeroEvolve); 26 GiveHero(HeroEvolve, playerHeroTransform); 27 GiveHero(HeroEvolve, enemyHeroTransform); 28 } 29 30 public void ChangeTurn() //ターン切り替えの処理、これをターン切り替えボタンに設置して切り替えしている 31 { 32 isPlayerTurn = !isPlayerTurn; //boolの真偽でターン切り替えしている 33 if (isPlayerTurn == true) //プレイヤーターンの場合の処理 34 { 35 choisePanel.SetActive(true); //ターン切り替え時にこの選択肢表示パネルを表示させたい 36 } 37 else //エネミーターンの時も同様に 38 { 39 choisePanel.SetActive(true); 40 } 41 } 42 43 //ここからは選択肢パネル上のボタンを押した際の処理 44 public void AChoise() //Aボタンを押したときの処理 45 { 46 choisePanel.SetActive(false); //押したら選択肢表示パネルは消す 47 48 } 49 public void BChoise() //Bボタンを押したときの処理 50 { 51 choisePanel.SetActive(false); 52 }

・今回実装したい具体的なコード

まず直したい部分

GameManager.cs

C#

1 public void ChangeTurn() //ターン切り替えの処理、これをターン切り替えボタンに設置して切り替えしている 2 { 3 isPlayerTurn = !isPlayerTurn; //boolの真偽でターン切り替えしている 4 if (isPlayerTurn == true) //プレイヤーターンの場合の処理 5 { 6 choisePanel.SetActive(true); //ターン切り替え時にこの選択肢表示パネルを表示させたい 7 } 8 else //エネミーターンの時も同様に 9 { 10 choisePanel.SetActive(true); 11 } 12 } 13

この処理の時に

C#

1 public void ChangeTurn() //ターン切り替えの処理、これをターン切り替えボタンに設置して切り替えしている 2 { 3 isPlayerTurn = !isPlayerTurn; //boolの真偽でターン切り替えしている 4 if (isPlayerTurn == true) //プレイヤーターンの場合の処理 5 { 6 if( もしプレイヤーヒーローのenumがLEVEL5なら) //本質問の冒頭のスクリプトでheroにenumを割り当てています 7 { 8 choiseText.text = "あなたが選ぶ果物は"; //パネル上のテキストを変更 9 achoiseText.text = "リンゴ"; //aボタン上のテキストをリンゴに変更する 10 bchoiseText.text = "オレンジ"; //bボタン上のテキストをオレンジに変更する 11 } 12 else (そうじゃないなら) 13 { 14 choiseText.text = "あなたが選ぶ野菜は"; //パネル上のテキストを変更 15 achoiseText.text = "ニンジン"; //aボタン上のテキストをニンジンに変更する 16 bchoiseText.text = "キャベツ"; //bボタン上のテキストをキャベツに変更する 17 } 18 choisePanel.SetActive(true); //↑でテキストを変更した選択肢表示パネルを表示 19 } 20 else //エネミーターンの時も同様に 21 { 22 choisePanel.SetActive(true); 23 } 24 }

この、もしプレイヤーヒーローのenumがLEVEL5ならの部分をどうやって取得してくればいいのかが分かりません。

playerHeroTransform上に表示されているHeroインスタンスのenum CARDLEVELがLEVEL35のどれであるかを取得して、LEVEL5であれば、パネル上のテキストを果物関連に、LEVEL34であれば野菜関連の表示にしたいのですが

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

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

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

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

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

guest

回答1

0

ベストアンサー

他の方法の勧め

このような場合は、後からの追加(野菜、果物の他に調味料を追加したいなど)を考えると、列挙体では無くDictionary<int, string> や、単にstringを用いた方が良いと思います。

クラスから取得

これは簡単です。

C#

1≪CARDLEVEL≫ = ≪Class≫.≪CARDLEVEL≫;

このクラスは作成時の変数を変数に保管しておき、それを使用します。

C#

1class A 2{ 3 public static ≪Enumのあるクラス≫ player; 4 5 void Start() 6 { 7 GameObject v = new GameObject().AddComponent<≪Enumのあるクラス≫>(); 8 ≪Enumのあるクラス≫ player = v.GetComponent<≪Enumのあるクラス≫>(); 9 } 10}

C#

1≪CARDLEVEL≫ = A.player.≪CARDLEVEL≫;

列挙体の分岐

列挙体にはそれぞれの値に必ず整数値が与えられていますので、その値を比較します。

▼このような列挙体があったとします。

C#

1public enum Enum 2{ 3 Level1 = 1, 4 Level2, 5 Level3, 6 Level4, 7 Level5, 8 Level6, 9}
ifで値を比較する方法

この時Level5は5、Level6は6が割り振られている(先頭から順に自動的に割り当てられる)ので

C#

1if (5 =< (int)≪Enum≫) /*ここに処理を書く*/

これでOKです。

switchの方法

上記の場合あまりおすすめは出来ませんが、

C#

1switch (≪Enum≫) 2{ 3 case Level1 : 4 //Level1~Level4の処理 5 break; 6 case Level2 : goto case Level1; 7 case Level3 : goto case Level1; 8 case Level4 : goto case Level1; 9 case Level5 : 10 //Level5,Level6の処理 11 break; 12 case Level6 : goto case Level5; 13}

このような方法をとっているのは、コードを変更する時に手間を省くためです。
ただ忌まれているgotoを使っているので良いコードとは言えませんが

投稿2019/11/01 11:38

編集2019/11/01 11:57
KanazawaKureha

総合スコア368

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

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

Gchan

2019/11/01 12:55

丁寧にありがとうございました! 無事解決できました、助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問