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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

1回答

2071閲覧

スプリクトで生成したオブジェクトに固有の数値を付属させたい

wata3

総合スコア16

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

1クリップ

投稿2020/06/04 13:21

編集2020/06/07 12:34

前提・実現したいこと

Unityでカードゲームを作ろうとしています。
現在、デッキエディット画面を作ろうとしています。
前回の質問で下記の画像の赤い矢印にマウスオーバーしたときに、
イメージ説明
下記のようなカード情報を表示はできたのですが、
イメージ説明
各オブジェクトに対応した情報を表示することができずに困っています。
問題を解決するには生成したオブジェクトにカードIDを付属させられればいいと考えているのですがどのようにすればいいでしょうか?
カードIDはカード情報をカード種ごとに別のエクセルで管理しているので文字列のほうが都合がいいと思います。

関連したソースコード

マウスオーバーしたにカードIDを出すスプリクト

C#

1using UnityEngine; 2using System; 3using UnityEngine.EventSystems; 4 5public class CardID : MonoBehaviour, IPointerEnterHandler 6{ 7 int cardID ; 8 public event Action<int> OnPointerCard; 9 10 public void OnPointerEnter(PointerEventData eventData) 11 { 12 OnPointerCard?.Invoke(cardID); // マウスオーバーしたのでカードIDを発火 13 } 14} 15 16

表示を実行するスプリクト

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Mouse : MonoBehaviour 7{ 8 public GameObject CardV; 9 void Update() 10 { 11 // 画面上にあるCardスクリプトを持つオブジェクトを取得 12 var allCardInScreen = FindObjectsOfType<CardID>(); 13 14 // マウスオーバーイベントを購読 15 foreach (CardID c in allCardInScreen) 16 { 17 c.OnPointerCard += cardID => { 18 CardV.GetComponent<CardView2>().ShowViewU(cardID); 19 }; 20 } 21 } 22 }

情報表示のテンプレート

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class CardView2 : MonoBehaviour 7{ 8 [SerializeField] Image Image; 9 [SerializeField] Text Name2Text; 10 [SerializeField] Text Name1Text; 11 [SerializeField] Text TypeText; 12 [SerializeField] Text KindText; 13 [SerializeField] Text EffectText; 14 [SerializeField] private unit unit; 15 [SerializeField] private item item; 16 [SerializeField] private spel spel; 17 void Start() 18 { 19 Image.sprite = Resources.Load<Sprite>("CardImage/裏面"); 20 Name2Text.text = ""; 21 Name1Text.text = ""; 22 TypeText.text = ""; 23 KindText.text = ""; 24 EffectText.text = ""; 25 } 26 27 public void ShowViewU(int x) 28 { 29 Image.sprite = Resources.Load<Sprite>("CardImage/" + unit.Sheet1[x].id + " " + unit.Sheet1[x].name1); 30 Name2Text.text = unit.Sheet1[x].name2; 31 Name1Text.text = unit.Sheet1[x].name1 + " Lv" + unit.Sheet1[x].level; 32 TypeText.text = "タイプ:" + unit.Sheet1[x].type; 33 KindText.text = "ユニットカード|ATK/" + unit.Sheet1[x].attack + " DEF/" + unit.Sheet1[x].defence; 34 EffectText.text = unit.Sheet1[x].effect1 + "\n" + unit.Sheet1[0].effect2 + "\n" + unit.Sheet1[x].effect3; 35 } 36 public void ShowViewI(int x) 37 { 38 Image.sprite = Resources.Load<Sprite>("CardImage/" + item.Sheet1[x].id + " " + item.Sheet1[x].name1); 39 Name2Text.text = item.Sheet1[x].name2; 40 Name1Text.text = item.Sheet1[x].name1 + " Lv" + item.Sheet1[x].level; 41 TypeText.text = "タイプ:" + item.Sheet1[x].type; 42 KindText.text = "アイテムカード|" + item.Sheet1[x].kind + "アイテム"; 43 EffectText.text = item.Sheet1[x].effect1 + "\n" + item.Sheet1[x].effect2 + "\n" + item.Sheet1[x].effect3 + "\n" + item.Sheet1[x].effect4; 44 } 45 public void ShowViewS(int x) 46 { 47 Image.sprite = Resources.Load<Sprite>("CardImage/" + spel.Sheet1[x].id + " " + spel.Sheet1[x].name1); 48 Name2Text.text = spel.Sheet1[x].name2; 49 Name1Text.text = spel.Sheet1[x].name1 + " Lv" + spel.Sheet1[x].level; 50 TypeText.text = "タイプ:" + spel.Sheet1[x].type; 51 KindText.text = "スペルカード|" + spel.Sheet1[x].kind + "スペル"; 52 EffectText.text = spel.Sheet1[x].effect1 + "\n" + spel.Sheet1[x].effect2 + "\n" + spel.Sheet1[x].effect3 + "\n" + spel.Sheet1[x].effect4; 53 } 54 55}

赤い矢印先のオブジェクトのテンプレート

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6using UnityEngine.EventSystems; 7 8public class CardD : MonoBehaviour 9{ 10 [SerializeField] Image IconImage; 11 [SerializeField] Text NameText; 12 [SerializeField] Text TypeText; 13 [SerializeField] Text KindText; 14 [SerializeField] Text LvText; 15 [SerializeField] private unit unit; 16 [SerializeField] private item item; 17 [SerializeField] private spel spel; 18 19 20 public void ShowDataU(int x) 21 { 22 IconImage.sprite = Resources.Load<Sprite>("CardImage/"+ unit.Sheet1[x].id+" "+unit.Sheet1[x].name1); 23 NameText.text = unit.Sheet1[x].name1; 24 LvText.text = "Lv" + unit.Sheet1[x].level; 25 TypeText.text = unit.Sheet1[x].type; 26 KindText.text = "ATK/" + unit.Sheet1[x].attack.ToString() + " DEF/" + unit.Sheet1[x].defence.ToString(); 27 } 28 public void ShowDataI(int x) 29 { 30 IconImage.sprite = Resources.Load<Sprite>("CardImage/" + item.Sheet1[x].id + " " + item.Sheet1[x].name1); 31 NameText.text = item.Sheet1[x].name1; 32 LvText.text = "Lv" + item.Sheet1[x].level; 33 TypeText.text = item.Sheet1[x].type; 34 KindText.text = "アイテム|"+item.Sheet1[x].kind+"アイテム"; 35 } 36 public void ShowDataS(int x) 37 { 38 IconImage.sprite = Resources.Load<Sprite>("CardImage/" + spel.Sheet1[x].id + " " + spel.Sheet1[x].name1); 39 NameText.text = spel.Sheet1[x].name1; 40 LvText.text = "Lv" + spel.Sheet1[x].level; 41 TypeText.text = spel.Sheet1[x].type; 42 KindText.text = "スペル|" + spel.Sheet1[x].kind + "スペル"; 43 } 44}

2020/06/05追記
矢印の部分の表示をするスプリクトの根幹部分(全文はすごく長文になってしまっているので省略)

C#

1 public void UnitSearch(int x) 2 { 3 CardData.GetComponent<CardD>().ShowDataU(x); 4 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 5 Obj.transform.parent = SearchArea.transform; 6 } 7 public void SpelSearch(int x) 8 { 9 CardData.GetComponent<CardD>().ShowDataS(x); 10 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 11 Obj.transform.parent = SearchArea.transform; 12 } 13 public void ItemSearch(int x) 14 { 15 CardData.GetComponent<CardD>().ShowDataI(x); 16 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 17 Obj.transform.parent = SearchArea.transform; 18 }

このxにfor文で条件にあったiを代入している感じです。

2020/06/07追記
回答を元に変更してみました。
CardIDのcardIDの値をエクセルのデータのidに変化させることはできました。(インスペクターで確認)
しかし、マウスオーバー時の購読がうまく行ってないようです。
下記に変更した文を記載します。

C#

1using UnityEngine; 2using System; 3using UnityEngine.EventSystems; 4 5public class CardID : MonoBehaviour, IPointerEnterHandler 6{ 7 public string cardID ; 8 public event Action<string> OnPointerCard; 9 10 public void OnPointerEnter(PointerEventData eventData) 11 { 12 OnPointerCard?.Invoke(cardID); // マウスオーバーしたのでカードIDを発火 13 } 14} 15 16using System.Collections; 17using System.Collections.Generic; 18using UnityEngine; 19using UnityEngine.UI; 20 21public class Mouse : MonoBehaviour 22{ 23 public GameObject CardV; 24 public int _cardID; 25 string _c; 26 void Update() 27 { 28 // 画面上にあるCardスクリプトを持つオブジェクトを取得 29 var allCardInScreen = FindObjectsOfType<CardID>(); 30 31 // マウスオーバーイベントを購読 32 foreach (CardID c in allCardInScreen) 33 { 34 35 c.OnPointerCard += cardID => { 36 Debug.Log(cardID);//ここでなぜか2が出力される 37 if (cardID.Contains("CUU")) 38 { 39           _c = cardID.Replace("CUU", ""); 40 int.TryParse(_c, out _cardID); 41 _cardID = _cardID - 1; 42 CardV.GetComponent<CardView2>().ShowViewU(_cardID); 43 } 44 }; 45 } 46 } 47} 48 49 public void UnitSearch(int x) 50 { 51 CardData.GetComponent<CardD>().ShowDataU(x); 52 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 53 CardID_.GetComponent<CardID>().cardID =unit.Sheet1[x].id; 54 Obj.transform.parent = SearchArea.transform; 55 }

MouseでなぜかcardIDが2になってしまっています。
どうすればCardIDのcardIDになると思いますか?

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

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

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

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

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

sakura_hana

2020/06/04 23:50

「各オブジェクトに対応した情報を表示することができず」とはどういうことですか? 「リストのどのオブジェクトを選択しても同じカードの情報が表示される」ということですか?
wata3

2020/06/05 03:18

そうです。今はint型になってますcardIDを変化させることができてない状態です。
hogefugapiyo

2020/06/05 04:14

Mouse で Update で購読を回しているのはちょっとやばそうなのでキリのよいタイミングで修正してください Prefabをインスタンス化しているのはどのスクリプトでしょうか?
wata3

2020/06/05 06:40

「インスタンス化」がいまいちわからなかったのですが、追記したものがおそらくそうだと思います。
hogefugapiyo

2020/06/05 07:21

public void UnitSearch(int x) とかで、int xで渡されているのがカードIDですか?
wata3

2020/06/05 08:42 編集

ほぼそうです。 厳密に言うとエクセルで管理しているデータのセルの何行目かを表しています。 IDを文字列にしたい理由は後でカード種ごとに判別するためです。 エクセル上のカードIDはユニットだとCUU00001、スペルだとCUS00001、アイテムだとCUI00001のようになっています。
guest

回答1

0

ベストアンサー

すっごい雑にやるなら、
CardIDクラスのcardIDをpublicにして、〜SearchShowData〜の部分で
適切な参照.GetComponent<CardID>().cardID = x;
とすればいいです。

もしくはObj = Instantiate(〜);の次の行で
Obj.name = x.ToString();とすることでGameObjectをIDにしておき、
「マウスオーバーイベントを購読」の部分でcardID = Int.Parse(c.name);とかでもいいかもしれません。(このオブジェクトでいいのか分かりませんが)

なお、大分回りくどい気がするので抜本的に変えた方がいい気もします。
先日似たような質問に回答しているので参考にしてみてください。
C# - unity 2D でのオブジェクトの複製スクリプト|teratail

投稿2020/06/06 05:38

編集2020/06/06 05:39
sakura_hana

総合スコア11427

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

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

wata3

2020/06/07 12:36

回答を元に変更しましたがうまくいきませんでした。 本文を追記したのですが、どうすればうまくいくと思いますか?
sakura_hana

2020/06/08 01:52

UnitSearchは CardID_.GetComponent<CardID>().cardID = x; 「c.OnPointerCard += cardID => {」の中身は元のままでどうですか?
wata3

2020/06/08 10:14

変わらず2になってますね。(Debug.log(cardID)で確認)
sakura_hana

2020/06/08 23:59

すいませんちゃんと見てませんでした。 CardID_.GetComponent<CardID>().cardID = x; この行を Obj.GetComponent<CardID>().cardID = x; こうするとどうでしょうか。
wata3

2020/06/09 11:57

できました。ありがとうございます。あとはcardIDをstringにしていろいろ試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問