Developer

【Unity実践】#19 敵キャラクターの作成①【ランゲーム】
2022.01.05
Lv2

【Unity実践】#19 敵キャラクターの作成①【ランゲーム】

今回の内容

今回は道中に配置する敵キャラクターを作成していきます。
プレイヤーが敵キャラクターに触れたらゲームオーバーとなるような仕様とします。

※初めての方はこちらから
【第1回記事】導入とサンプルの紹介

アセットのインポート

以下のアセットをインポートしてください。

JKT_ART > mon_00 > Mon_00 を Stage1シーンに配置します。
名前を Bomb に変更して、Assets > Prefabs フォルダにオリジナルプレハブとして保存しましょう。

(関連記事)
プレハブの使い方①(作成・複製)

敵キャラクターの初期設定

Hierarchyビューで Bomb を選択して、Position、Rotation を変更します。
Sphere Colliderコンポーネントを追加して、Center と Radius を調整します。
Is Trigger にチェックを入れます。

一旦プレハブを上書きしておきます。

プレイヤーが停止する処理

プレイヤーが敵キャラクターに触れた時などに、プレイヤーが停止し操作ができなくなるような処理を追加します。
PlayerScript に以下を追加してください。


~ 省略 ~

public class PlayerScript : MonoBehaviour
{

  ~ 省略 ~

    void Update()
    {
        // クリア時の処理
        if (GameManager.status == GameManager.GAME_STATUS.Clear)
        {
            Vector3 dir = (goalPos - transform.position).normalized;
            transform.position += dir * speed * Time.deltaTime;

            if ((goalPos - transform.position).magnitude < 0.5f)
            {
                transform.position = goalPos;
                transform.rotation = Quaternion.Euler(0, 180, 0);
                anim.SetBool("IsRunning", false);
                anim.SetTrigger("Goal");

                enabled = false;
            }
            return;
        }

        // プレイ以外なら無効にする
        if (GameManager.status != GameManager.GAME_STATUS.Play)
        {
            anim.SetBool("IsRunning", false);
            return;
        }

        ~ 省略 ~
    }

  ~ 省略 ~

}

Update内に追加した処理により、ゲームステータスが「Play」以外の場合にはスワイプ操作等ができなくなります。

敵キャラクターのスクリプトを作成

敵キャラクターのスクリプトを作成していきます。
まずはプレイヤーに触れたタイミングで以下の処理を実行するようにします。

・敵キャラクターがプレイヤーの方向を向くように
・プレイヤーが敵キャラクターの方向を向くように
・敵キャラクターの爆発アニメーションを再生

新規スクリプトを作成して名前を「BombScript」とし、以下を記述してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BombScript : MonoBehaviour
{
    Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {

    }

    private void OnTriggerEnter(Collider other)
    {
        if (GameManagerScript.status != GameManagerScript.GAME_STATUS.Play)
        {
            return;
        }

        if (other.CompareTag("Player"))
        {
            transform.LookAt(other.gameObject.transform);
            other.gameObject.transform.LookAt(transform);
            anim.SetBool("walk", false);
            anim.SetTrigger("attack01");

            GameManagerScript.status = GameManagerScript.GAME_STATUS.Pause;
        }
    }
}

21~24行は、ゲームステータスが「Play」以外の時に、接触処理が無効となるようにしています。
これは、一度でもゲームオーバーになったりクリアした後に爆発処理が実行されないようにするためです。

アニメーターの「walk」と「attack01」は、インポートしたアセットに最初から設定されているパラメータです。
「walk」を false にしているのは、次回実装する移動のアニメを停止するためです。
attack01 により、爆発のアニメーションが再生されるようになっています。

BombScript を Bomb にアタッチします。(プレハブも忘れずに更新します。)
シーンを再生して、プレイヤーと接触時に爆発エフェクトが再生されること、
およびそれ以降プレイヤーの操作ができない事を確認しましょう。

プレイヤー関連の処理

プレイヤーが敵キャラクター(爆発エフェクト)に触れた際のアニメーションを実装します。
以下のアニメーションを Animations フォルダに複製します。
・Assets > UnityChan > Animations > unitychan_DAMAGED01 > DAMAGED01

複製した DAMAGED01 をダブルクリックして Animationビューを開きます。
2:00以降のキーを選択して削除します。(およそ2:00以降であれば正確でなくてもかまいません。)

DAMAGED01は標準で以下の様に、倒れて起き上がるまでのアニメーションです。

今回は倒れて終了としたかったので、起き上がる動きに対応しているキーを削除しました。

次にアニメーターコントローラー側を実装していきます。
PlayerAnimController に Trigger型のパラメータ「Damaged」を追加しておきます。

以下の2つのアニメーションを PlayerAnimController に追加し、下図の遷移とします。
・Assets > UnityChan > Animations > unitychan_DAMAGED00 > DAMAGED00
・Assets > Animations > DAMAGED01 (先ほど調整したアニメーション)

Any State → DAMAGED00 の遷移条件に「Damaged」を設定します。

アニメーターコントローラー側の実装は一旦完了です。
プレイヤーがダメージを受けた時に呼び出される処理を作成します。
PlayerScript に 以下の通り TakeDamage メソッドを追加してください。


~ 省略 ~

public class PlayerScript : MonoBehaviour
{

  ~ 省略 ~

    public void Clear(Vector3 pos)
    {
        ~ 省略 ~
    }

    public void TakeDamage()
    {
        animator.SetTrigger("Damaged");
        GameManagerScript.status = GameManagerScript.GAME_STATUS.GameOver;
    }
}

TakeDamageメソッドが実行されると、先ほど作成したアニメーションが再生されます。
ゲームステータスはこの段階で「GameOver」となり、次回以降作成するゲームオーバー画面を表示するトリガーとなります。

爆発エフェクト関連の処理

爆発エフェクトに以下の処理を実装します。

・爆発エフェクトがプレイヤーに触れると、TakeDamageメソッドを呼び出す
・アクティブ時に爆発の効果音を再生

Hierarchyビューで Bomb > bomb を選択し、Sphere Colliderコンポーネントを追加します。

Sphere Collider の Is Trigger にチェックを入れます。

新規スクリプトを作成して、名前を「BombEffectScript」とします。
以下を記述してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BombEffectScript : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            other.GetComponent<PlayerScript>().TakeDamage();
        }
    }
}

Bomb > bomb にアタッチしておきます。

爆発用の効果音はお好みのものを用意してください。
ここでは、コチラのサイトの「ゲーム向け爆発5」を使用しました。
効果音素材の名前を bomb など分かりやすいものにして、Audiosフォルダにインポートします。

インポートしたら、Bomb > bomb にドラッグ&ドロップで設定します。
最終的に bomb のコンポーネントは以下の様になります。

ここまでできたらプレハブ側も更新して、シーンを再生してみましょう。
爆発エフェクトが発生後に、プレイヤーが倒れるようになっていれば成功です。
(効果音は手元で確認してください。)

おわりに

長くなってきたので今回はここまでです。
次回はこの続きで、敵キャラクターが往復運動する処理を実装します!

 

 
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次

© Unity Technologies Japan/UCL