Unity2Dでカードゲーム(ローグライク)を作成のPart6です。
はじめに
前回の続きのPart6を作成していきます。Part5は下記から。
前回まで「スクリプトでカード生成」、「カードを管理するスクリプト作成」、「カードの使用」、「カードをランダムに選択して配る」、「カードを複数枚配る・カードの手札位置を更新」を作成しました。
今回は「カードを引く(カードをドロー)」「ゲームクリア」を実装していきます。
ゲーム作成開始
まずはカードを引くのを作成します。今回は敵を倒したらカードを追加します。
スクリプトの修正
HandManagerに「DrawCard」を追加します。Start内の初期カードを配る部分を「DrawCard」に変更します。
public class HandManager : MonoBehaviour
{
//省略
private void Start()
{
handcreate = FindAnyObjectByType<HandCreate>();
DrawCard(cardInitNum);
}
public void DrawCard(int num)
{
for (int i = 0; i < num; i++)
{
cards.Add(handcreate.CreateCard());
UpdateHand();
}
}
//省略
}
Enemyスクリプトの「TakeDamage」を変更します。敵を倒した時にカードを1枚追加。ライフを丁度0で倒した場合、更に1枚追加します。
public class Enemy : MonoBehaviour
{
//省略
public void TakeDamage(int amount)
{
health -= amount;
if (health == 0)
{
HandManager.Instance.DrawCard(1);
health = -1;
}
if (health < 0)
{
HandManager.Instance.DrawCard(1);
Destroy(gameObject);
}
HealthUpdate();
}
//省略
}
Hierarchyに空オブジェクトを追加して「Enemies」という名前に変更。配下にenemyを移動、コピーして増やしておきます。

実行して下記の様に倒した時にカードをドローしたらOK。

ゲームクリアを仮作成
敵を全て倒した時に仮のゲームクリアを設定します。実際にはリフレッシュ、ステージを切り替えるなどになりますが一旦仮で設定します。
Hierarchyに空オブジェクトを追加して名前を「GameManager」に変更。同じ名前でスクリプトを作成します。

スクリプトを下記に変更します。アクティブな敵がいない場合クリアとします。
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
[SerializeField] private Transform Enemies;
private void Awake()
{
Instance = this;
}
public void CheckEnemies()
{
foreach (Transform enemy in Enemies)
{
if (enemy.gameObject.activeSelf)
{
return;
}
}
Debug.Log("CLEAR");
}
}
GameManagerスクリプトのパラメータに敵の親オブジェクトを指定します。

Enemyスクリプトを変更します。Destroyで破棄している部分を「SetActive(false)」に変更します。
public class Enemy : MonoBehaviour
{
//省略
public void TakeDamage(int amount)
{
health -= amount;
if (health == 0)
{
HandManager.Instance.DrawCard(1);
health = -1;
}
if (health < 0)
{
HandManager.Instance.DrawCard(1);
this.gameObject.SetActive(false);
GameManager.Instance.CheckEnemies();
}
HealthUpdate();
}
//省略
}
実行して、敵キャラを全て倒してログが表示されたらOKです。

