Unity2Dでカードゲーム(ローグライク)を作成のPart3です。
はじめに
前回の続きのPart3を作成していきます。Part2は下記から。
前回まで「スクリプトでカードを生成」、「カードを管理するスクリプトの作成」をしました。Part3ではカードを使用して攻撃します。
利用する画像
下記画像を攻撃対象として利用します。Inkscapeで簡単に作成したブドウです。分かりやすいように敵キャラクターと位置づけます。

ゲーム作成開始
カードの使用先となるフルーツ(敵キャラ)を作成していきます。
攻撃対象(敵キャラ)の作成
空オブジェクトを追加して名前を「Enemy」に変更、名前は分かりやすければ「Fruit」でもOKです。

カードの時と同様に配下に「UI(Canvas)」→「Image」と「Text-TextMeshPro」を追加します。

カードの時と同様、サイズを変更して画像を指定します。

テキスト位置も変更して画像下に表示されるようにします。

カードスクリプトの変更
次にカードスクリプトを下記に変更して、カードをマウスで掴んで動かせるようにします(ドラッグアンドドロップ)。マウスを離したら元の位置に戻るように、コスト、ダメージを変数にしています。
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
public class Card : MonoBehaviour
{
[SerializeField] private TMP_Text cost_Text;
[SerializeField] private TMP_Text damage_Text;
private int cost;
private int damage;
private Camera cam;
private Vector2 initPos;
private void Start()
{
// TEST
cost = 1;
damage = 3;
cost_Text.text = cost.ToString();
damage_Text.text = damage.ToString();
cam = Camera.main;
}
private void OnMouseDown()
{
initPos = transform.position;
}
private void OnMouseDrag()
{
transform.position = (Vector2)cam.ScreenToWorldPoint(Mouse.current.position.ReadValue());
}
private void OnMouseUp()
{
transform.position = initPos;
}
}
カードプレハブにBoxCollider2Dをアタッチ、コストとダメージの初期テキストを変更します。

試しに動かして、下記の様にマウスでカードを動かすことが出来ればOK。

カードを使用
次に新規スクリプトを作成「Enemy」とします。ライフ設定、ダメージを食らった時にライフ表示を変更しています。
using TMPro;
using UnityEngine;
public class Enemy : MonoBehaviour
{
[SerializeField] private TMP_Text health_Text;
private int health;
private void Start()
{
health = 7;
HealthUpdate();
}
public void TakeDamage(int amount)
{
health -= amount;
if (health < 0)
health = 0;
if (health == 0)
Destroy(gameObject);
HealthUpdate();
}
private void HealthUpdate()
{
health_Text.text = health.ToString();
}
}
スクリプトをアタッチして、「BoxCollider2D」と「Rigidbody2D」をアタッチします。BoxCollider2Dは「isTrigger」にチェック、Rigidbody2DはBodyTypeを「Kinematic」にします。

Cardスクリプトに下記関数を追加します。カードを離した時、敵に接触していたら攻撃しています。
private void OnMouseUp()
{
if (enemy != null)
{
enemy.TakeDamage(damage);
Destroy(gameObject);
}
else
{
transform.position = initPos;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
image.color = new Color(image.color.r, image.color.g, image.color.b, 0.2f);
enemy = collision.GetComponent<Enemy>();
}
private void OnTriggerExit2D(Collider2D collision)
{
image.color = new Color(image.color.r, image.color.g, image.color.b, 1f);
enemy = null;
}
}
実行して、カードをブドウに重ねて離した時に攻撃出来ればOK。

