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

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

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

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

Q&A

解決済

2回答

4247閲覧

Unityで作る神経衰弱

beginner_01

総合スコア22

Unity

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

0グッド

0クリップ

投稿2018/10/03 12:55

前提・実現したいこと

unityで神経衰弱をつくっているのですが
同じ数字のカードを引いた場合カードを場から除くという仕組みで手が止まりどうも思いつきません
サンプルコードや考え方のヒントなどをおしえていただけないでしょうか?

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; using System.Linq; public class Sinken : MonoBehaviour { public int count = 0; public int ok = 0; public UnityEngine.Sprite Chack = null; public Sprite TBack; public Sprite[] TArray = new Sprite[52]; Image Back; Button OK; UnityEngine.Sprite[] Deck = new UnityEngine.Sprite[52]; UnityEngine.UI.Image[] D = new UnityEngine.UI.Image[13]; UnityEngine.UI.Button[] D_ = new UnityEngine.UI.Button[13]; UnityEngine.UI.Image[] K = new UnityEngine.UI.Image[13]; UnityEngine.UI.Button[] K_ = new UnityEngine.UI.Button[13]; UnityEngine.UI.Image[] H = new UnityEngine.UI.Image[13]; UnityEngine.UI.Button[] H_ = new UnityEngine.UI.Button[13]; UnityEngine.UI.Image[] S = new UnityEngine.UI.Image[13]; UnityEngine.UI.Button[] S_ = new UnityEngine.UI.Button[13]; // Use this for initialization void Start() { OK = GameObject.Find("OK").GetComponent<Button>(); for (var i = 0; i < 13; i++) { D[i] = GameObject.Find("D"+(i+1)).GetComponent<Image>(); D_[i] = GameObject.Find("D" + (i+1)).GetComponent<Button>(); K[i] = GameObject.Find("K" + (i+1)).GetComponent<Image>(); K_[i] = GameObject.Find("K" + (i+1)).GetComponent<Button>(); H[i] = GameObject.Find("H" + (i+1)).GetComponent<Image>(); H_[i] = GameObject.Find("H" + (i+1)).GetComponent<Button>(); S[i] = GameObject.Find("S" + (i+1)).GetComponent<Image>(); S_[i] = GameObject.Find("S" + (i+1)).GetComponent<Button>(); } for (var i = 0; i < TArray.Length; i++) { Deck[i] = TArray[i]; } UnityEngine.Sprite [] shuffle = Deck.OrderBy(i => Guid.NewGuid()).ToArray(); for (var i = 0; i < 52; i++) { var x = i; // for文のスコープ内で変数を宣言 if (x < 13) { D_[x].onClick.AddListener(delegate { D[x].sprite = shuffle[x]; // xを利用する D_[x].interactable = false; count++; }); }else if (x < 26) { K_[(x-13)].onClick.AddListener(delegate { K[(x-13)].sprite = shuffle[x]; // xを利用する K_[(x-13)].interactable = false; count++; }); }else if (x < 39) { H_[(x-26)].onClick.AddListener(delegate { H[(x-26)].sprite = shuffle[x]; // xを利用する H_[(x-26)].interactable = false; count++; }); }else if (x < 52) { S_[(x-39)].onClick.AddListener(delegate { S[(x-39)].sprite = shuffle[x]; // xを利用する S_[(x-39)].interactable = false; count++; }); } } } // Update is called once per frame void Update() { if (count == 2) { for (var i = 0; i < 13; i++) { var x = i; D_[x].interactable = false; K_[x].interactable = false; H_[x].interactable = false; S_[x].interactable = false; } } OK.onClick.AddListener(delegate { if(count == 2) { count = 0; for (var i = 0; i < 13; i++) { var x = i; D[x].sprite = TBack; K[x].sprite = TBack; H[x].sprite = TBack; S[x].sprite = TBack; D_[x].interactable = true; K_[x].interactable = true; H_[x].interactable = true; S_[x].interactable = true; } } }); } }

試したこと

配列の要素を使って判断しようとしたのですが中身がSprite型で扱いがこんなんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

一応Spriteのまま使う方法も。
Spriteの名前を「Heart_1」とか「Spade_11」のような表記で統一しておいて、文字列で判断する。

C#

1//「_」で区切った配列になる(Heart_1なら ("Heart","1") になる。区切った文字は消える) 2string[] spl1 = 最初にクリックされたButton.sprite.name.Split('_'); 3string[] spl2 = 次にクリックされたButton.sprite.name.Split('_'); 4 5//数字の部分を比較する 6if (spl1[1] == spl2[1]) { 7 //数字が合致した時の処理を書く 8} else { 9 //数字が合致していない時の処理を書く 10}

投稿2018/10/04 01:59

編集2018/10/04 14:01
sakura_hana

総合スコア11425

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

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

beginner_01

2018/10/04 14:20 編集

最初にクリックされたボタン、次にクリックされたボタンを認識する方法をおしえていただけないでしょうか? おねがいします
sakura_hana

2018/10/04 14:22

お好きなように。 基本は変数を1つ用意して、ボタンが押された時にそれで判定。 bool(一度も押されていないならfalse)、int(n回目に押された)などが考えられますが、1回目のボタンのSpriteを持っていないといけない訳ですから、私ならSprite型ですかね。 Sprite beforeSprite; //1回目に押されたボタンのスプライト void ボタンが押された時のメソッド (Button 押されたボタン) { if (beforeSprite == null) { //1回目に押された時の処理 beforeSprite = 押されたボタン.sprite; } else { //2回目に押された時の処理 //Spriteの名前が一致しているかの判定(省略) //合致していなかった時:比較対象のスプライトをnullに戻しておく beforeSprite = null; } } ちなみに配列D、K、H、Sって存在する必要あるんですかね? (普通の神経衰弱とはルールが違うので必要ってことならスルーで結構です)
beginner_01

2018/10/04 15:05 編集

D_[x].onClick.AddListener(delegate { D[x].sprite = shuffle[x]; // xを利用する D_[x].interactable = false; count++; if(count == 1) { string[] spl1 = D_[x].sprite.name.Split('_'); }else { string[] spl2 = D_[x].sprite.name.Split('_'); } }); D_[x].onClick.AddListenerのなかをかえてみたのですが string[] spl1 = D_[x].sprite.name.Split('_'); string[] spl2 = D_[x].sprite.name.Split('_'); どちらもspriteの部分が「buttonにはspriteの定義が含まれていない」というエラーが出てしまいます D_[x]をD[x]に変えるとエラーが出ないのですがD[x]は画像が入っているだけなので違う気がします。 配列D、K,H,Sには画像を読み込むのにつかっています
sakura_hana

2018/10/05 01:39

すみません、入力ミスです。 button.image.sprite.name.Split('_'); と間にimageが必要でした。 それはそれとして今気づいたのですが、「Buttonコンポーネントに紐づいているImage」と「実際に表示されているカードのImage」って別のコンポーネントですかね? 同じなら D_[x].image.sprite 、違うなら D[x].sprite になると思います。 そして提示のコードだと、spl1とspl2はそのif文の中でしか使えない(当然別のdelegateでも使えない)ので、別のボタン押した時に比較出来ないですね。 クラス変数として持つ必要があります。 (前のコメントで書いたコードで Sprite beforeSprite; がvoidの外にあるのはその為です) > 配列D、K,H,Sには画像を読み込むのにつかっています 普通の神経衰弱ならスートに分ける必要が無いと思うのですが。要素を52個持った配列1つでいいのでは?
beginner_01

2018/10/08 06:07

とても丁寧でわかりやすかったです! おかげで完成しました! ありがとうございます!!
guest

0

Cardクラスを作ってそれをSprite[]みたいに配列にして使ったらいいと思いますよ。

C#

1public class Card{ 2 public Sprite sprite; 3 public int mark; // ハートとかジョーカーとか ほんとは列挙型のほうがよい 4 public int number; // 1~13を示す。 5};

投稿2018/10/04 01:33

pois

総合スコア20

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

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

beginner_01

2018/10/04 13:53

クラスについてあまり詳しくないので判定の際にどのように使うのかなどもう少し詳しくお聞きしたいです おねがいします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問