【解説通りに作るだけ】Unityのデジタルカードゲーム作り方③ 手札の生成編

前回でカードとフィールドの作成が完了しましたね!
※前回の記事はこちら↓

と言うわけで、今回からは
実際にプログラムを書いて、
手札やフィールドにカードを出す
ことを実装していくよ!
今回の完成形としてはこんな感じ↓
これが出来るようになれば、
ドロー効果やモンスターの召喚効果も
実装出来るようになるからね。
ひとつひとつ理解しながら進んで行こう!
では行くぞ!!
手札生成プログラムの実装
では早速、プログラムを書いていくよ!!
と言いたいところだけど、
これからの流れについて理解してた方がやりやすいと思うので、
実装方法についてザックリ説明するよ。
手札の生成プログラムを作るための実装方法をザックリと書くと、
①.新しいスクリプト(プログラムのこと)の作成
②.プログラムの記入(コピペでOK)
③.GameObjectの作成
④.コードとオブジェクトの紐づけ
こんな感じの4段階で進めいていくよ!!
ってひとも大丈夫。
画像付きで超詳しく説明するので安心してね。
そんな訳でいくぞ!!
① 新しいスクリプトの作成
まずは新しくC#プログラムを作ろう。
と、その前に管理しやすいように、スクリプト用のフォルダを作るよ。
スクリプト用のフォルダ作成方法

①.Assetsをクリックする。
②.「+」を押して、”Folder”をクリック。
③.できたフォルダの名前を”Scripts”にする。
GameManagerスクリプトの作成
んで、スクリプトを作るよ。

①.さっき作った”Scripts”フォルダに入って、「+」をクリック→C#スクリプトをクリック。
②.出来たスクリプトの名前を”GameManager”にする。
※この時名前を一旦確定したりすると、コードに書かれるクラス名と、Unity上に表示されている名前に齟齬が産まれてしまう事があるので注意してね。
③.なぜか知らないけど、アイコンが歯車になればOK
② プログラムの記入
そしたら、今作った「GameManager」のコードを開こう。(ダブルクリックで開くよ)
コードには元から色々書かれている部分があるので、とりあえず使わない黄色の部分は削除しよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
削除したら、下のコードの黄色の部分を張り付けて、同じ内容になるようにしてみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] GameObject cardPrefab; [SerializeField] Transform playerHand; void Start() { // 手札を1枚配る(自分) Instantiate(cardPrefab, playerHand); } } |
無事貼れたら、上書き保存しよう。
③ GameObjectの作成
そしたらUnity側に戻って、
“CreateEmpty”でゲームオブジェクトを作るよ。

①.Hierarchyウィンドウの「+」をクリックして、”CreateEmpty”をクリック。
②.CreateEmptyで作ったやつを”GameManager”という名前に変えよう
④ コードとオブジェクトの紐づけ
このGameManagerに、
さっき作ったGameManagerを貼り付けしていくよ。

①.今作った、”GameManager”に対して、
②.さっき書いたプログラムの”GameManager”をドラッグして貼り付ける。
③.貼り付けると、こんな感じに表示されるはず!
そしたら下の画像のように、コードとオブジェクトを紐づけよう。

①.Hierarchyウィンドウ(画像でいう左側のウィンドウ)の”PlayerHand”をドラッグして、Inspecterウィンドウ(画像でいう右側のウィンドウ)のPlayerHandのスペースに貼り付けよう。
②.張り付けるとこんな感じに表示が変わるはず!
同じように今度は、カードを紐づけしよう↓

①.Card(第一回目で作ったカードプレハブ)を、InspecterウィンドウのCardPrefabのスペースに貼り付ける。
②.こんな感じに表示が変わったらOK!!
こうやって紐づけすることで、
コード側にPlayerHandがどこなのか、CardPrefabがどれなのかを
教えてあげれられるのだ!
そしたら実行ボタンを押そう!!
カードが出てきた、、!!
と、まあこんな感じに自分の手札にカードを一枚生成出来ましたかね??
ではでは無事手札の生成に成功したら、
次はプログラムの解説をしていくよ!!
コードの解説
ではそれぞれのコードの意味をざっくりと説明していくよ!!
※あくまで「初心者でもわかる」という趣旨で説明をするので、正確な表現でない場合があります。正確な意味を知りたい場合は、他のサイトでも調べてみてください。
[Srializedfield]とは?
ではまず、7~8行目にある、
[Serializedfield]についての説明。
[Serializedfield]とは、
(ものすごくざっくり言うと)
モノや場所をコードに紐付ける場所を作りますよーってこと。
これをすることによって、
Unity側にPlayerFieldをコードに紐付けするスペースが出現するよ。
試しにこの行を消して保存すると、
さっき紐づけしたスペースが無くなるから見てみて。
まあ、消したらまた紐づけしておいてね笑
GameObject,Transformとは?
次は[Serializedfield]の後に書いてある、
“GameObject” と “Transform”について
GameObject cardPrefab は、
“cardPrefab”というモノがあるよ~ってこと。
Transform playerHand は、
“playerHand”という場所があるよ~ってこと。
要はGameObject(もしくはTransform)の次に書かれるものが、
モノなのか場所なのかを区別してる。って事だね。
Startメソッドとは?
次は10〜14行目にある、
void Start() { // 手札を1枚配る(自分) Instantiate(cardPrefab, playerHand); }
について説明するよ。
void Start() {} は、
Start関数とか、Startメソッドと呼ばれるもので、
ゲームが実行されると一番最初に動くプログラムのこと。
「関数とか、メソッドってなんじゃい!!」ってレベルの人は、コメントに書いてね。
どのレベルの人が読んでくれてるのかわからないので、コメントによってはそのレベルに合わせて書いてくので!
コメントアウト( // )とは?
12行目にある、
// 手札を1枚配る(自分)
についての説明。
これはコメント行と言って、プログラム上でも
” // “と書くと、それ以降の文字はプログラムとして読みませんよ~
っていう便利機能。
わかったこととか、気付いた事を書いておくと、後で何か気づくきっかけになっていいと思うよ。
instantiateとは?
では今回一番大事なところ!
Instantiate(cardPrefab, playerHand);
についての説明をするよー!
これは Instantiate(モノ,場所) という書き方をする事によって、
モノ(この場合では”cardPrefab”)を
場所(この場合では”playerHand”)に出す。
というプログラム。
今回でいうと、
PlayerHandにカードを一枚出すということなので、
ドロー効果みたいなものだね。
ちなみに、
Instantiate(CardPrefab,PlayerField)
だと、自分のフィールドにカードを出す。
って事になるので、召喚効果みたいなものになるよ。
以上、そんな感じのプログラムになってます!
めっちゃ簡単!!!
プログラムの追加
では以上を踏まえて、下の画像の状態をプログラムで実装してみよう!!

これが出来れば、今回のコードについては完全に理解できている!と言えるのでやってみよう。
ヒントを言うと、
①.既に手札にカードを1枚出すことは出来ているので、それを5回繰り返せばいい。
②.自分のフィールド(playerField)と敵のフィールド(enemyField)については、まだUnity側とプログラム側で紐づいていないので、紐づけが必要。
という感じ。
それを踏まえてまずは自力でやってみよう!!
答え合わせ
黄色になってる行が今回変更した行なので、そこを確認してみて!
解答例としてはこんな感じ↓
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] GameObject cardPrefab; [SerializeField] Transform playerHand, playerField, enemyField; void Start() { // 手札を5枚配る(自分) Instantiate(cardPrefab, playerHand); Instantiate(cardPrefab, playerHand); Instantiate(cardPrefab, playerHand); Instantiate(cardPrefab, playerHand); Instantiate(cardPrefab, playerHand); // フィールドに3体出す(自分) Instantiate(cardPrefab, playerField); Instantiate(cardPrefab, playerField); Instantiate(cardPrefab, playerField); // フィールドに2体出す(敵) Instantiate(cardPrefab, enemyField); Instantiate(cardPrefab, enemyField); } } |
ちなみにStart内のコードは、for文(繰り返し処理のこと)を使って以下の様に書いてもやってることは同じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
for (int i = 0; i < 5; i++) // 手札を1枚配る処理を5回繰り返す(自分) { Instantiate(cardPrefab, playerHand); } for (int i = 0; i < 3; i++) // フィールドに1体出す処理を3回繰り返す(自分) { Instantiate(cardPrefab, playerField); } for (int i = 0; i < 2; i++) // フィールドに1体出す処理を2回繰り返す(敵) { Instantiate(cardPrefab, enemyField); } |
どちらかといえばこっちの方がスッキリしてて良いかもね。
そしたら最後にコードと紐づけするのを忘れずに!!

以上、完成!!!
やり方はわかったかな??
まだ細かいところまではわかる必要はないけど、ざっくりでいいからコードの意味を理解しながら進んでいこうね!
カードの生成方法 まとめ
今回から実際にプログラムを書いていったけど、分かったかな、、?
もし分かりづらい部分があれば「~の部分がわからない」だとか、
逆に分かりやすかったら「分かりやすかったよ!」などコメントください。
書いてる側の私としては、
私の記事を読んで、実践してくれているあなたのプログラミングについてのレベルが分かりません。
でもせっかく読んでくれているのだから、分かりやすく理解して欲しいんです。
感想でも、ご意見でも構いません。
コメント待ってます。
そんな感じ!終わりっ!!
次の記事↓

前の記事↓

参考にさせて頂いた動画
[Unityゲーム開発講座] シャドバ風!?カードゲームの作り方 #1 UIの実装
【カードゲームの関連記事とか】


