簡単なカードゲームにおいて、プレイヤーのキャラクター(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であれば野菜関連の表示にしたいのですが
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/01 12:55