本記事をご購入頂きありがとうございます!!
この記事はカードゲーム作成講座【基礎編】にあたる下記のシリーズの続編となります。
あまりいないとは思いますが、【基礎編】が終わっていない状態でこちらを始めてしまうと
こいつは何を言ってんだ??
こんな状態になること請け合いなので、
必ず【基礎編】をやり終えてから、こちらの記事【応用編】を実施して下さい!
この解説記事をやり終えた時には、こんな感じのゲームを作れるように解説していくので、
自分のペースで楽しみながら進めてみて下さいな!
※↓音出るので注意!!
という訳で、さっそくですが解説に入って行くよ!!
Contents
【序章】実装内容の全体概要説明
まずは今回の解説記事にて実装する内容を説明していくよ!
ざっくり分けると実装内容はこの5つ↓
- 【第一章〜第四章】効果持ちカードの実装
- 【第五章〜第六章】カードとフィールドの見た目の向上
- 【第七章】モーションの向上
- 【第八章】BGM、効果音の実装
- 【第九章】バグ修正
※それぞれ独立した内容ではあるけど、上から順番に実装するのが推奨。
各章の実装の流れとしては、こんな感じ↓
①【第一章〜四章】効果持ちカードの実装
ここでは本記事でのメインとなる「効果持ちカードの実装方法」の解説をしていくよ!
ざっくりいうと、こんな感じ↓
- 第一章で、効果カード実装の下準備
- 第二章で、効果モンスターカードを実装
- 第三章で、スペルカードを実装
- 第四章で、敵の使うカードにも効果を実装
詳細としてはこんな流れ↓
- 【第一章】実装の前準備
- カードの見た目の修正
- カードに効果のデータを持たせる
- 【第二章】効果モンスターカードの実装
- スピードアタッカー効果の実装
- ドロー効果の実装
- トークンカードを手札に加える効果の実装
- トークンカードの召喚効果の実装
- 敵味方のリーダーのHP変化効果の実装
- マナポイント増加効果の実装
- 【第三章】スペルカードの実装
- スペルカードの実装
- スペルカードらしい見た目と挙動にする
- 【第四章】敵のカードへの効果実装
- 敵モンスターへの効果実装
- 効果実装に伴うバグの修正
ここを理解しながら進めれば自力で他の効果も実装できるようになるはずなので、
ぜひ理解しながら進めてみてね!!
②【第五章〜六章】カードとフィールドの見た目の向上
ここでは新しくアセットをインポートして、カードとフィールドの見た目を良くしていくよ!
ざっくり言うと、こんな感じ↓
- 第五章で、カードの見た目を修正
- 第六章で、フィールドの見た目を修正
ここではある程度、見た目を良くしていくアセットと方法を紹介するので、
「このアセットはこんな感じに使えそうだなー」とか
「自分の作りたいゲームもこれが使えそう!!」とか
自分の作りたいゲームに流用できる部分はどこかな〜?って考えながら進めてみてね!
③【第七章】モーションの実装
この章では具体的には下記の3つのモーションを実装or修正していくよ!!
- 召喚時のモーション
- 敵モンスターの攻撃時のモーション
- スペルカード使用時のモーション
DoTweeenを使って色んなモーションを作っていくので、
他にも実装したいモーションを自分で作れるように色々試しながら進めてみてね!
④【第八章】BGM、効果音の実装
この章ではBGMや効果音をダウンロードして、ゲームにサウンドを実装していくよ!
具体的には、この辺りのサウンドを実装するよ↓
- ゲーム実行中に流れるBGM
- ボタンを押した時の効果音
- 攻撃時の効果音
- 召喚時の効果音
- スペルカード使用時の効果音
- リーダーのHPが回復した時の効果音
- リーダーのHPがダメージを受けた時の効果音
実装自体は難しくないので、
しっかりやり方を覚えて自分の好きなようにサウンドを実装できるようにやり方を習得しよう!!
⑤【第九章】バグ修正
この章では新しい機能の実装に伴うバグの修正や、
【基礎編】から引き続き起きているバグの修正を行うよ!
具体的にはこの辺りのバグを修正していくよ↓
- 攻撃可能な敵カードが操作出来ちゃうバグ修正
- 攻撃可能な敵カードを味方に攻撃出来てしまうバグ修正
- 相手のターン中にもカードが使えるバグ修正
- ターンエンドボタンを何度も押せるバグ修正
- カードの順番が変わってしまうバグ修正
- 敵のカードの攻撃後に場所が一番右に移動してしまうバグの修正
- ライフが0になっても終わらないバグ修正
- 【おまけ】ゲームのリスタートボタンの実装
バグの修正は演習を通して解説していくので、
面倒に思うかも知れないけど、バグ修正が一番力が付くので、すぐに答えを見ずに自力でやってみてね!!
ではではこの辺りで本記事の全体概要説明は終わりです!!
結構ボリュームがあると思うので、自分のペースでゆっくり進めてみてね!
わからない部分が出てきたらコメントをくれれば出来るだけ返信するので、気軽に聞いてくださいな。
(もちろん記事の感想でも何でもコメントは大歓迎です( ´ ▽ ` )ノ)
それでは楽しみながらゲーム制作やっていきましょう!!
【第一章】効果持ちカード実装の前準備
では早速、効果持ちカードの実装をしていこう!!
この章ではその前準備として、カードの見た目の修正とカード効果のデータ実装をしていくよ!
本章の完成形としてはこんな感じ↓
こんな感じにカードに効果のデータを持たせて、その効果テキストが表示されるようになるよ!!
それでは順番にやっていこう!
みじんこさん こんにちわ
応用編、本日終了しました
まだまだ勉強不足ですが
少しづつ前にすすんでる気がします
ありがとうございました
ボリノークサマーンさん
返信遅くなって、すみません。コメントありがとうございます!
そして応用編の最後までお疲れ様でした!!
ボリノークサマーンさんのゲーム作成の上達の手助けになれたのなら良かったです。
今のゲームを自分の好きなように作り変えたり、解説を見ずに自力で一から作ったりすると更に力が付くと思うので、今後も楽しみながらゲーム制作続けていってくださいね〜
みじんこさん Restartの後、ターンエンドボタンが押せないです。
敵のターンで終わってるから、何かコードが抜けてますかね?
public void RestartGame()
{
foreach (Transform n in playerHand.transform) // Playerの手札のカードを全て破壊する
{
GameObject.Destroy(n.gameObject);
}
foreach (Transform n in playerField.transform) // Playerのフィールドのカードを全て破壊する
{
GameObject.Destroy(n.gameObject);
}
foreach (Transform n in enemyField.transform) // Enemyのフィールドのカードを全て破壊する
{
GameObject.Destroy(n.gameObject);
}
isPlayerTurn = true; // 敵ターンだった場合に、リスタート後に敵ターンから始まってしまう為
deck = new List() { 7, 6, 7, 1, 1, 2, 4, 8, 6, 5, 2, 8, 1, 2, 1, 1, 2, 8 }; // デッキリストの設定
uIManager.HideGameEndPanel();
StartGame();
}
// ターンエンドボタンを押下可能/不可能にする
turnEndButton.interactable = !turnEndButton.interactable;
を挟んだら解決しました
奇跡的に自分で解決できました
あー、、確かに敵のターンで終わっちゃうとターンエンドボタンが非アクティブのままリスタートになっちゃいますね。。
ご指摘ありがとうございます!!
はい、その直し方で良いかと思います!
元の記事の方も修正しておきますね。また何かあればコメントくださいー!
はじめまして。
オリジナルのカードゲームを制作したくて、ひとまず手を付ける前に、ここまでの記事を読ませていただきました。基礎編が完了したら、応用編の購入も視野に入れております。
私の作りたいゲームはオンラインでの対人戦でして、さらなる発展形としてPhotonを導入したオンライン対戦を学べると嬉しいのですが、そういった記事のご予定はありますでしょうか。
一通り読んで非常にわかりやすく、応用すれば自分が作成したいカードゲームが作れそうですので、そこからさらにオンライン対戦まで実装できると非常に嬉しいです。
(戦闘が少し複雑なのでCPUの実装が難しく、対人戦を実装してCPUは後回しにしたい、という気持ちもあります。)
くるシュウさん
コメントありがとうございます!
なるほど、オンライン対戦ですね。。
全然頭になかったので、貴重なご意見ありがとうございます!
確かに実装したい機能ですよね。
前向きに検討させていただきます!
こんにちは。
はじめまして。
とても分かりやすい記事で感動です。
現在基礎編の8まで進めており、基礎編が完了次第応用編の購入をしようと思っています!
これからもよろしくお願いいたします!
上の方と同じく、私もオンライン対戦の実装に対する記事をひそかに希望しております、、、
moveMさん
コメントありがとうございます( ´∀`)
オンライン対戦の記事は需要あるんですねぇ、、笑
自分自身、ちょっと勉強しないと記事書けない部分があるので、勉強しつつ解説記事書きますね!
貴重なご意見ありがとうございますー!
こんにちは。
はじめまして。
応用編を購入させていただいたのですが、
コードのところがハイライトになっていなかったです。
(白地のメモ帳のようになっていました)
お手数ですが、ご確認お願いできますでしょうか。
>しぐまさん
コメントありがとうございます!
やはりそうでしたか、、
ご連絡ありがとうございます。
原因の調査に時間が掛かってしまいそうな為、一時的に別記事にて同内容を記載致しました。
そちらであればハイライト等は問題ないはずですので、ご確認よろしくお願い致します。
(ご購入いただいた方のみ読める形で公開しております)
ご不便をお掛け申し訳ありませんが、また何かありましたらご連絡お願い致します。
ご対応ありがとうございます。
確認でき、無事最後まで終わりました。
非常に分かりやすく、初めてこのような記事で最後まで終えることが出来ました。ありがとうございます。
要望としては発展編②として以下あれば更にやってみたいと思いました。
・対人戦の実装
・デッキの中身をランダムにする方法
・デッキ編集画面の作成
はじめまして。
いつも参考にさせて頂いてます。
デッキからカードを選択し手札にカードを持ってくる処理、その為にデッキのカード一覧を表示する処理を教えて頂きたいです。
はじめまして
みじんこさんの記事はとても分かりやすく、とても助かっています!
次は他の方もおっしゃられていたようにオンラインでの対戦や、その為のユーザーごとのデッキ情報の管理などについて知りたいです!!
はじめてコメントさせていただきます。
応用編を購入させていただきました。いつも参考にさせていただいてます。
手札やフィールドのカードにマウスを合わせるとその詳細情報がポップアップに表示される機能について知りたいです!
はじめまして。みじんこさんのブログを参考にカードゲーム制作をしています。
応用編を購入し、制作をしている最中なのですがエラーが出たため質問させてください。
「3.トークンカードを手札に加える効果の実装」「④「エラーの修正」新しく加わったカードが使用できないバグの修正」で
GameManagerクラスに「public void SetCanUsePanelHand(bool isAttachPanel)」を実装したところエラーが出ました。
エラーの発生箇所:
GameManagerクラス(ShowManaPoint、DrawCard)にある「SetCanUsePanelHand();」
CardControllerクラスの(activateAbilitiy)「GameManager.instance.SetCanUsePanelHand();//効果処理の最後に実施」
エラーの内容:
「error CS7036: There is no argument given that corresponds to the required formal parameter ‘isAttachPanel’ of ‘GameManager.SetCanUsePanelHand(bool)’」
お手数おかけしますが返信よろしくお願いします。
「SetCanUsePanelHand(true);」、「GameManager.instance.SetCanUsePanelHand(true);」
と記述することで解決できました。
Junoさん、返信遅くなってすみません!!
ご解決されたようでよかったです!
こちらですが確認したところ、ご指摘頂いた箇所で「public void SetCanUsePanelHand(bool isAttachPanel)」とするのは確かに間違いの様でした。
SetCanUsePanelHandメソッドに引数を追加するのは、
「【第九章】バグの修正」の「相手のターン中にもカードが使えるバグ」の項目にて行う為、この時点ではSetCanUsePanelHandメソッドをpublic化するだけ。が正しいです。
ご迷惑お掛けしましたm(_ _)m
該当箇所については修正しましたが、他にも不明点、疑問点等あればご質問ください!!
返信、対応ありがとうございます。
「第七章モーションの向上」の召喚モーションの実装でエラーが出たため質問させてください。
エラーの発生箇所:
CardMovementクラス(SummonMotion)の「transform.DOScale(1.2f,0.5f);」
エラーの内容:
「error CS1501: No overload for method ‘DOScale’ takes 3 arguments」
「using DG.tweening;」の記述はあり、Unityデジタルゲームの作り方⑪の時にDOTweenのインストール、インポート、セットアップを実施しているのと敵の攻撃モーションは機能しています。
返信よろしくお願いします。
んーー、、色々調査はしてみたんですけど、現状不明です。。
エラー内容を見た限り「DOScale」の引数に3つの引数を指定してる。ってエラーだと思いますが、
記事内ではそのような記載はないので、記載のコードであれば恐らくそのエラーは出ないかと思っています。
Junoさんの記載のコードが3つの引数を記載していないか確認してもらって、
もしそれでも解決しないようであれば、直接画面を見ながらお話しするのも可能なので今一度、確認をお願いします!
みじんこさん返信ありがとうございます。
確認してみたところ、「transform.DOScale(1.2f,0.5f);」の「0.5f」を「0,5f」とドットでなくカンマになっているというケアレスミスでした。
自分で確認しているときは全然気づかなかったのですが、返信をいただいた後に確認して気づけました。
ありがとうございました。
応用編「[第9章][おまけ]リスタートボタンの実装」まで完了しました。
ありがとうございました。
解決&最後まで実施出来たようでよかったです!
エラーの内容を翻訳するだけで何となく分かることも多いかと思うので、
もしまた何かしたら詰まった時はエラーコードを翻訳してみると良きかもです!
みじんこさん、返信ありがとうございます。
エラーメッセージを検索してみたりChatGPTで質問してみたりしていたのですが、今回のエラーは全然気が付きませんでした。
エラーではないのですがうまく動いてくれない箇所があったので質問させてください。
リスタートボタンからゲームを開始したときにターンエンドボタンを押すことができないという問題が発生しました。
1回目のゲームではターンの挙動に問題はないです。
返信お願いします。
プレイヤーが勝利したときはリスタート後ターンエンドボタンが機能しますが、プレイヤーが敗北した後のリスタートでターンエンドボタンが機能しないと言う挙動です。
if(isPlayerTurn==false)
{
turnEndButton.interactable=!turnEndButton.interactable;
}
という処理をRestartGameメソッドに入れることで問題を解決できました。
ボリノークサマーンさんのコメントを参考に
「turnEndButton.interactable=!turnEndButton.interactable;」
をRestartGameメソッドに入れてみたところ「敗北時(相手ターンでゲームが終了したとき)にターンエンドボタンが機能するが、勝利時(プレイヤー炭でゲームが終了したとき)にターンエンドボタンが押せなくなるという状態」になったので、if文でisPlayerTurn==falseで処理を分岐することで解決できました。
みじんこさんこんにちは。
ガチャ機能、デッキ機能の実相をしたのちバトル機能(この記事の内容)を実装しこれからデッキリストの連携をするところです。
カードゲームの作り方の記事から再度自身でコードの入力をして作成したのですが、
RestartGameメソッドに
if(isPlayerTurn==false)
{
turnEndButton.interactable = !turnEndButton.interactable;
}
という処理をforeach文の後に実装しなければ「相手ターンでゲームが終了したときのにターンエンドボタンを押せない」という問題は解決しませんでした。
また、統合した後に出てしまったエラーとして、デッキ編成画面で「stockCardTrans」にあるカード(所持数0枚の状態)を「stockCardTrans」にあるカードにドラッグした際、
NullReferenceException: Object reference not set to an instance of an object
AttackedCard.OnDrop (UnityEngine.EventSystems.PointerEventData eventData) (at Assets/Scripts/AttackedCard.cs:20)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IDropHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:92)
UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:530)
というエラーが出てしまうようになりました。
「AttackCard.cs」の20行目は「BattleManager.instance.CardBattle(attackCard,defenceCard);
」です。
また、「Home」シーンの「Battle」ボタンからシーンの遷移はできるのですがゲームをスタートすることができません。
ゲームスタートに関しては「リスタートボタンの実装」を参考に解決できそうです。
名前が重複しないように「BattleManager.cs」というファイル名にしたのですが
public void Awake()
{
if(instance==null)
{
instance=this;
}
}
を
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
else
{
Destroy(this.gameObject);
}
}
とすることで「Home」シーンから「Battle」シーンに移ったときもバトルできるようになりました。