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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

949閲覧

Buttonを押したら押したButtonと同じ画像(Image)を別のButtonに写したい

futonmin

総合スコア33

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2020/09/17 12:29

編集2020/10/06 03:22

実現したいこと

下の画像のように画像(Image)が貼られたButtonを選択して、DECKにあるButtonを選択するとDECKにあるBUttonの画像(Image)が変わるようにしたい。

OnClickDeck1()メソッドの中でif文やswitch文を使って選択したButtonと同じ画像(Image)をなんらかの方法で取得して(bool値を使って条件分岐させようとしましたが今のところできませんでした)画像(Image)を変えれるようにしたい。

↓参考画像
イメージ説明
↓現在作っているもの
![イメージ説明]

前提 

それぞれのButtonにはスクリプトでステータス(攻撃力、防御力、HP)を設定している。

DECK(上のパネル)にあるButtonにはOnClickDeck1()を、それ以外のButtonにはそれぞれの画像(Image)にあったメソッドを設定している

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class CardStatus : MonoBehaviour 7{ 8 // Image コンポーネントを格納する変数 9 private Image m_Image; 10 11 // 各Spriteを格納する変数 12 public Sprite[] card = new Sprite[50]; 13 // public bool[] boolSerectCrad = new bool[50]; 14 15 public float cardHp; 16 float cardAttack; 17 float cardDefens; 18 int cardLv = 20; 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 // Image コンポーネントを取得して変数 m_Image に格納 24 m_Image = GetComponent<Image>(); 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 31 } 32 33 public void Bujyutuka() //ぶじゅつかの超速加速 34 { 35 if (cardLv == 20) 36 { 37 cardHp = 1160; 38 cardAttack = 77; 39 cardDefens = 48; 40 } 41 } 42 43 public void Bora() //*絢爛ノ美* ボラ&アルヒコ&アペイロン 44 { 45 if (cardLv == 20) 46 { 47 cardHp = 895; 48 cardAttack = 90; 49 cardDefens = 68; 50 } 51 } 52 53 public void Furuuku() //機航師弾 フルーク・ツォイク 54 { 55 if (cardLv == 20) 56 { 57 cardHp = 864; 58 cardAttack = 132; 59 cardDefens = 43; 60 } 61 } 62 63 public void Gaburieru() //魂を司る聖天使 ガブリエル 64 { 65 m_Image.sprite = card[0]; 66 //boolSerectCrad[0] = true; 67 if (cardLv == 20) 68 { 69 cardHp = 1190; 70 cardAttack = 99; 71 cardDefens = 40; 72 } 73 } 74 public void OnClickDeck1() /*DECKにあるButtonにいれるメソッド*/ 75 { 76 //m_Image.sprite = card[0];  77 Gaburieru(); 78 } 79}

試したこと

各メソッド(OnClickDeckメソッドは除く)にbool値を設定し、OnClickDeckメソッド内で条件分岐をさせようとしたができなかった

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

環境:Windows10、VisualStudio2019、Unity2020.1.6f1 Personal

分かりづらいところなどあればご指摘ください。

追記

※コメントアウトしているところはリストでカードの種類を増やそうと試しているところです。一応書いておきます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6//カードのステータス 7[CreateAssetMenu(menuName = "MyScriptable/Create CardStatus2")] 8public class CardStatus2 : ScriptableObject 9{ 10 public string CardName = ""; 11 public int Level; 12 public int Hp; 13 public int Attack; 14 public int Defense; 15 public Sprite sprite; 16 //public List<CardStatus2> CardStatus2List = new List<CardStatus2>(); 17} 18 19//[System.Serializable]  20/*public class CardStatus2Data 21{ 22 public string CardName = ""; 23 public int Level; 24 public int Hp; 25 public int Attack; 26 public int Defense; 27 public Sprite sprite; 28}*/

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6//プレイヤーのステータス 7public class PlayerStatus : MonoBehaviour 8{ 9 public CardStatus2 CardStatus2; 10 11 public int playerLevel;  //プレイヤーのレベル 12 public int playerHp;   //プレイヤーのHP 13 public int playerAttack; //プレイヤーの攻撃力 14 public int playerDefense;//プレイヤーの防御力 15 16 void Start() 17 { 18 playerHp = CardStatus2.Hp; //カードのHPを代入する 19 playerAttack = CardStatus2.Attack; //カードのAttackを代入する 20 playerDefense = CardStatus2.Defense; //カードのDefenseを代入する 21 } 22 23} 24

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

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

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

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

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

guest

回答2

0

自己解決

https://squmarigames.com/2018/12/12/unity-excel-importer-maker/
上のサイトを参考にExcelからデータを読み込んだ。

C#

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5public class CardStatusExcel : ScriptableObject 6{ 7 public List<Sheet> sheets = new List<Sheet> (); 8 9 [System.SerializableAttribute] 10 public class Sheet 11 { 12 public string name = string.Empty; 13 public List<Param> list = new List<Param>(); 14 } 15 16 [System.SerializableAttribute] 17 public class Param 18 { 19 20 public string cardName; 21 public int cardLevel; 22 public int cardHp; 23 public int cardAttack; 24 public int cardDeffense; 25 } 26}

C#

1using UnityEngine; 2using System.Collections; 3using System.IO; 4using UnityEditor; 5using System.Xml.Serialization; 6using NPOI.HSSF.UserModel; 7using NPOI.XSSF.UserModel; 8using NPOI.SS.UserModel; 9 10public class CardStatus_importer : AssetPostprocessor { 11 private static readonly string filePath = "Assets/Terasurware/CardStatus.xls"; 12 private static readonly string exportPath = "Assets/Resources/CardStatusExcel.asset"; 13 private static readonly string[] sheetNames = { "Sheet1", }; 14 15 static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) 16 { 17 foreach (string asset in importedAssets) { 18 if (!filePath.Equals (asset)) 19 continue; 20 21 CardStatusExcel data = (CardStatusExcel)AssetDatabase.LoadAssetAtPath (exportPath, typeof(CardStatusExcel)); 22 if (data == null) { 23 data = ScriptableObject.CreateInstance<CardStatusExcel> (); 24 AssetDatabase.CreateAsset ((ScriptableObject)data, exportPath); 25 data.hideFlags = HideFlags.NotEditable; 26 } 27 28 data.sheets.Clear (); 29 using (FileStream stream = File.Open (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { 30 IWorkbook book = null; 31 if (Path.GetExtension (filePath) == ".xls") { 32 book = new HSSFWorkbook(stream); 33 } else { 34 book = new XSSFWorkbook(stream); 35 } 36 37 foreach(string sheetName in sheetNames) { 38 ISheet sheet = book.GetSheet(sheetName); 39 if( sheet == null ) { 40 Debug.LogError("[QuestData] sheet not found:" + sheetName); 41 continue; 42 } 43 44 CardStatusExcel.Sheet s = new CardStatusExcel.Sheet (); 45 s.name = sheetName; 46 47 for (int i=1; i<= sheet.LastRowNum; i++) { 48 IRow row = sheet.GetRow (i); 49 ICell cell = null; 50 51 CardStatusExcel.Param p = new CardStatusExcel.Param (); 52 53 cell = row.GetCell(0); p.cardName = (cell == null ? "" : cell.StringCellValue); 54 cell = row.GetCell(1); p.cardLevel = (int)(cell == null ? 0 : cell.NumericCellValue); 55 cell = row.GetCell(2); p.cardHp = (int)(cell == null ? 0 : cell.NumericCellValue); 56 cell = row.GetCell(3); p.cardAttack = (int)(cell == null ? 0 : cell.NumericCellValue); 57 cell = row.GetCell(4); p.cardDeffense = (int)(cell == null ? 0 : cell.NumericCellValue); 58 s.list.Add (p); 59 } 60 data.sheets.Add(s); 61 } 62 } 63 64 ScriptableObject obj = AssetDatabase.LoadAssetAtPath (exportPath, typeof(ScriptableObject)) as ScriptableObject; 65 EditorUtility.SetDirty (obj); 66 } 67 } 68} 69

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6using System.IO; 7 8 9public class PlayerStatus : MonoBehaviour 10{ 11 //public CardStatus2 CardStatus2; 12 public CardStatusExcel cse; 13 14 public int playerLevel; 15 public int playerHp; 16 public int playerAttack; 17 public int playerDefense; 18 19 void Start() 20 { 21 cse = Resources.Load("CardStatusExcel") as CardStatusExcel; 22 //現状はplayerHpに直接Excelのデータを引っ張ってきて足しています 23 playerHp = cse.sheets[0].list[0].cardHp + cse.sheets[0].list[1].cardHp; 24 } 25} 26

投稿2020/10/07 12:23

futonmin

総合スコア33

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

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

0

解決に近づくための1歩としてクラス設計を変えたほうが良さそうです。
カード1枚1枚に対して1クラス持たせるような設計が良いでしょう。

マスタデータはUnity特有のscritableobjectとかJSONとかsqlite3を使うことをお勧めします。
調べてみてください。

カードの親クラスにhp,atk,def,imageなどのプロパティと、全カード共通の基本的なメソッドを記述します。もし、特殊な振る舞いをさせたいカードが発生した場合には作っておいた親クラスを継承したクラスを使って実装を拡張していきましょう。

長期間プロジェクトを触っていく上で、
デザインパターンという考え方を取り入れて開発すると綺麗にまとまりますよ。
とても重要な考え方ですので、是非学ばれては如何でしょうか。
https://www.techscore.com/tech/DesignPattern/index.html/

投稿2020/10/04 04:15

U_U_Jenkins

総合スコア110

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

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

futonmin

2020/10/06 02:27

回答ありがとうございます。 ScriptableObjectについてですが、上の追記に書いた通りカードのステータスをScriptableObjectにいれ、それをプレイヤーステータス(スーパークラス?)に代入しました。 最終的にプレイヤーの各ステータスに四種類のカードのステータスを入れる予定です。 そこで質問したいことがあるのですが、カードの種類を効率的に増やすにはどうすればいいでしょうか? カードの種類が100種類あるのならScriptableObjectを100個インスタンス化するしかないのでしょうか 教えていただきたいです。 デザインパターンについてですがとても参考になりました。
U_U_Jenkins

2020/10/07 03:42

...確かにマスタデータ作成だけで考えるとScriptableObjectもありかと思いましたが、 シーン内で同じScriptableObjectを利用するオブジェクトが複数存在しないのなら ScriptableObjectの利用価値はほぼ無いと言って良いです。 提案しておいてすみません。 効率的にデータ挿入を行いたいのであれば、 エクセルシートをマスタデータにできるAssetを使う方法や、 Unityに対応した組み込みDBにするのが手っ取り早いかと思います。
U_U_Jenkins

2020/10/08 05:03

一気に理想に近づいたと思います。また、カード一枚一枚を管理するスクリプト(CardManager)があれば尚良いかと思います。CardManagerは、先ほど貼ったデザインパターンのIteratorを意識するととても管理しやすいかと思います。つまり、cse = Resources.Load("CardStatusExcel")は、CardManagerで一度のみ行い、cseを用いて複数のカードに繰り返しデータ出力し続けると良いでしょう。Image画像名もエクセルシート内に格納し、カードがImage名を受け取ったタイミングでSpriteをResources.LoadしてSprite情報を持っておくと本来実現したいことが可能になるかと思います。
futonmin

2020/10/08 05:41

なるほど、なかなか難しそうですね... とりあえずやってみます。何度もありがとうございました。 参考にさせていただきます。
U_U_Jenkins

2020/10/08 06:13 編集

回答に対して実際に試していただき、追記レスポンスが出来る方はとても好感が持てます。 またわからないことがあった時、お力になれれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問