unityを使ってゲーム制作をしていくpart2。
念のため言っとくと私はゲーム制作初めてのど素人です。
なんとなくゲームを作ってみたくて手探りでやり始めました。
調べて、真似て、動かしてみて、ゲームを作る感じなので、
コーディングのセオリーみたいなのはよくわからずやってます。
今回やったこと。
- カード(トランプ)13枚をリストで保持する
- カードをランダムにシャッフル
- 対応した領域にカードオブジェクト生成
- 数字に対応した画像を表示する
仕様
1~13の数字のトランプ13枚が初期手札。
前領域に3枚、後領域に10枚をランダムに初期配置。
前領域の3枚の内最低でも1枚はHighカード(7~13)。
13枚のカードをシャッフルしてリストデータに保持する
参考にしたのは下記のサイト。

【Unity】Randomクラスを使ってトランプをシャッフルするサンプル
UnityのRandomクラスを使って、トランプをシャッフルするサンプルを作ります。Unityのマニュアルには『ランダムなゲームプレイ要素の追加』として乱数を使ったランダム要素の扱いが載っているので、これを出発点にすると取っ掛かりやすいかも。
Cardスクリプトの作成
カードのデータを保持するクラス
数字、マーク、ジョーカー判定の3項目を持つ。
必要な情報が増えたら適宜足していく予定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public struct Card { // カードのマーク(スート)を保持 public int suit; // カードの数字 public int number; // ジョーカーかどうか public bool isJoker; public Card(int suit, int number, bool isJoker){ this.suit = suit; this.number = number; this.isJoker = isJoker; } } |
OnePokerManagerスクリプトの作成
ゲームの進行を管理するクラス
Start関数で初期の手札を配るInitializeCardListメソッドを呼び出す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// カードリスト初期化メソッド void InitializeCardList (List<Card> list,int suit){ // 13枚の情報を割り振るリストを作る // maxnumは定数13を保持 for(int i=1;i<=maxnum;i++){ Card card = new Card (suit,i,false); list.Add (card); } // シャッフル Card temp; int randomIndex = 0; for(int i=0;i<list.Count;i++){ temp = list[i]; randomIndex = Random.Range (0,list.Count); list [i] = list [randomIndex]; list [randomIndex] = temp; } //Highカードを1枚要素0~2に入れる //前領域の3枚の内1枚はHighカード(7~13)を入れる仕様にしているため for(int i=0;i<list.Count;i++) { if (list[i].number>= 7) { temp = list[i]; randomIndex = Random.Range (0,2); list[i] = list [randomIndex]; list [randomIndex] = temp; break; } } } |
数字に対応した画像を表示する
参考にしたサイトは以下2つ。

【Unity入門】Instantiateを使いこなそう!使い方・使用例まとめ! | 侍エンジニアブログ
みなさんUnityを使っていますか? こちらの記事を閲覧している人の多くはUnityをすでに使い始めている人だと思います。今回はそんなはUnityを使い始めた人が初期につまずきやすいInstantiateについて、わかりやすく1からまとめました! この記事で解説する内容は、 Instantiate関数で何が出来るのか?...

【Unity】プレハブでSpriteAtlasを扱う - gracetory’s blog
皆さんこんにちは。 GWは連日外出でクタクタのgmatsuです。 娘を連れて動物園、公園に行ったり、友達とBBQやったり色々充実したGWとなりました。 気温は温かい…というより暑過ぎたくらいでしたね。 なんとか熱中症にはならずに済みました笑 そういえば最近の休日は、娘を練習台にカメラの練習をしています。 娘が産まれたタ...
InstantiateでカードPrefabの生成して、親を配置したい領域に変更。
画像表示はスプライトアトラスというのを使ってみることにした。
PrefabがuGUIのimageだったので、getComponent<Image>を使ったら
エラーがでた。UnityEngine.UIを呼び込んでいなかったためだった。
Start関数でInstantiateCardメソッドを呼び出して、オブジェクトを生成させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// カードオブジェクトの生成 void InstantiateCard(List<Card> list,GameObject hand,GameObject entry,string spriteName){ // 画像アトラスを取得 SpriteAtlas atlas = Resources.Load<SpriteAtlas>("Sprites/Atlas/" + spriteName); for (int i = 0; i < list.Count; i++) { // ファイル名を指定してスプライトを取得 Sprite sprite = atlas.GetSprite(spriteName + list[i].number); // 最初の3枚はentry領域にオブジェクト生成 if (i < maxprenum) { GameObject creatCardObj = Instantiate (cardObj, new Vector3 (0F, 0F, 0F), Quaternion.identity); creatCardObj.name = "Card" + i; creatCardObj.transform.SetParent (entry.transform, false); creatCardObj.GetComponent<Image> ().sprite = sprite; } // それ以外は手札領域にオブジェクト生成 else { GameObject creatCardObj = Instantiate (cardObj, new Vector3 (0F, 0F, 0F), Quaternion.identity); creatCardObj.name = "Card" + i; creatCardObj.transform.SetParent (hand.transform, false); creatCardObj.GetComponent<Image> ().sprite = sprite; } } |
とりあえず、実行結果がこんな感じになった。

コメント