Unityを使用して作成したにゃんこ大戦争風タワーディフェンスゲームの作り方のメモです。ゲーム制作の参考にしていただければ嬉しいです。トグルボタンをクリックすると記事が表示されます。小さくて見ずらい画像はクリックで拡大できます。
にゃんこ大戦争について
『にゃんこ大戦争』は、PONOSが開発したモバイルゲームで、簡単なルールで楽しめるタワーディフェンスゲームです。以下は、ゲームの基本的なルールの概要です。
- 基本の目的: プレイヤーは「キャットベース」と呼ばれる拠点を守り、敵の進撃を阻止することが目的です。
- にゃんこユニットの配置: プレイヤーはさまざまなにゃんこユニット(キャラクター)を選んで配置し、それらのユニットが敵に立ち向かいます。ユニットは一定の時間で生成され、コストを消費して配置します。
- 敵の進撃: 敵は波状にやってきて、キャットベースに向かって進撃してきます。プレイヤーの目標は、敵を倒してキャットベースを守ることです。
ステージの作成
オブジェクトをまとめて、名前を変更しました。

UIの作成
UI→Canvasを作成しました。
RenderModeをScreenSpaceCameraに変更しました。
RenderCameraにMainCameraをアタッチしました。
一番手前に表示したいのでOrderinLayerを100に設定しました。

UIScaleModeをScaleWithScreenSizeに変更しました。
ReferenceResolutionを画面サイズと同じに変更しました。
ScreenMatchModeをExpandに変更しました。

拠点のHP
テキストを二つ作成して拠点の上に配置しました。

召喚ボタンの作成
キャラクターを召喚するボタンを配置します。
空のオブジェクトを作成して、その子オブジェクトにボタンを4つ作成しました。

空のオブジェクトにGridLayoutGroupをアタッチして位置を調整しました。

ボタンの色やTextを変更しました。

ゴールドの表示
テキストを二つ配置して現在のゴールドを表示するUIを作成しました。


LEVELボタン
キャラクターの作成
こちらのアセットを使用してプレイヤーを配置しました。
歩くモーションの画像を複数選択してヒエラルキーウィンドウにドラッグ&ドロップしました。
名前をKnightDに変更しました。

同時にアニメーションが作成されるので名前を付けて保存しました。
モンスターをプレイヤーと同じように配置しました。
追加するコンポーネントはプレイヤーと同じです。
こちらのアセットを使用してモンスターを配置しました。
Enemyタグを作成して設定しました。
新しくC#スクリプトを作成しました。名前はCharactorMoveにしました。

作成したスクリプトを敵と味方のキャラクターにアタッチしました。
スクリプトを開いてコードを追加しました。
using UnityEngine;
public class CharactorMove : MonoBehaviour
{
public enum TYPE
{
PLAYER,
ENEMY,
}
public TYPE type;
float direction;
Vector3 pos;
bool isMove = true;
void Start()
{
switch (type)
{
case TYPE.PLAYER:
direction = -1;
break;
case TYPE.ENEMY:
direction = 1;
break;
}
pos = new Vector3(direction, 0, 0);
}
void Update()
{
if (isMove)
{
transform.position += pos * Time.deltaTime;
}
}
}
キャラクターのinspector画面からタイプを設定しました。

キャラクターが歩くようになりました。
新しくC#スクリプトを作成しました。名前はHitPointにしました。
作成したスクリプトを敵と味方のキャラクターにアタッチしました。
using UnityEngine;
public class HitPoint : MonoBehaviour
{
public int hp;
public void Damage(int damage)
{
hp -= damage;
if (hp <= 0)
{
Destroy(this.gameObject);
}
}
}
キャラクターのinspector画面からHPを設定しました。

右クリック→MakeTrangitionで歩くモーションと攻撃モーションを矢印で繋ぎます。

Paraetersタブの+ボタンを押して、Attackのboolを作成します。

矢印を選択してCounditionsを設定して、
AttackがTrueになったら攻撃モーションに切り替えるように、
Attackがfalseになったら歩くモーションに切り替えるようにしました。
hasexitTimeのチェックを外してtrunsitionsDurarationsを0に変更しました。

Animator anim;
void Start()
{
anim = GetComponent<Animator>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
//敵にぶつかったら移動停止
if (collision.gameObject.tag == "Enemy" && type == TYPE.PLAYER
||collision.gameObject.tag == "Player" && type == TYPE.ENEMY)
{
isMove= false;
//攻撃アニメーションに切り替える
anim.SetBool("Attack",true);
//ダメージ計算
HitPoint hitPoint = collision.GetComponent<HitPoint>();
StartCoroutine(AttackAction(hitPoint));
}
}
private void OnTriggerExit2D(Collider2D collision)
{
//敵とぶつからなくなったら歩き出す
isMove = true;
anim.SetBool("Attack", false);
}
IEnumerator AttackAction(HitPoint hitPoint)
{
//ダメージ処理
while (hitPoint.hp > 0)
{
yield return new WaitForSeconds(1);
hitPoint.Damage(1);
}
}
キャラクター同士がぶつかると戦うようになりました。