Chapter 51無料公開

歩く敵の当たり判定を作成する

baba_s
baba_s
2021.08.08に更新

前項では歩く敵の移動処理を作成しました。

本項ではプレイヤーが歩く敵に当たったらやられるようにしていきます。

針の当たり判定の修正

現在は、プレイヤーがやられる処理を針のスクリプトに記述しています。このやられる処理を、まずはプレイヤーのスクリプトに移動させます。

Project ウィンドウで「Assets/@Project/Scripts」フォルダを右クリックして「Create > C# Script」を選び、

作成したスクリプトに「Player」と名前をつけてコードエディタで開きます。

Player.cs
using UnityEngine;
using UnityEngine.SceneManagement;

// プレイヤーを制御するスクリプト
public class Player : MonoBehaviour
{
    // プレイヤーのやられアニメーションのプレハブ
    public GameObject m_playerHitPrefab;

    // プレイヤーがやられた時に呼び出す関数
    public void Dead()
    {
        // プレイヤーを非表示にする
        // Destroy 関数でプレイヤーを削除してしまうと
        // OnRetry 関数が呼び出されなくなるため
        // SetActive 関数で非表示にする
        gameObject.SetActive( false );

        // シーンに存在する CameraShaker スクリプトを検索する
        var cameraShake = FindObjectOfType<CameraShaker>();

        // CameraShaker を使用してカメラを揺らす
        cameraShake.Shake();

        // 2 秒後にリトライする
        Invoke( "OnRetry", 2 );

        // プレイヤーのやられアニメーションのオブジェクトを生成する
        Instantiate
        (
            m_playerHitPrefab,
            transform.position,
            Quaternion.identity
        );
    }

    // リトライする時に呼び出される関数
    private void OnRetry()
    {
        // 現在のシーンを読み込み直してリトライする
        SceneManager.LoadScene( SceneManager.GetActiveScene().buildIndex );
    }
}

「Player」スクリプトをコードエディタで開いたら上記のコードを入力して保存します。

Unity エディタに戻り「Player」スクリプトを「Basic Player Controller」オブジェクトにドラッグします。

そして、Hierarchy ウィンドウで「Basic Player Controller」オブジェクトを選択した状態で

Project ウィンドウの「PlayerHit」プレハブを Inspector ウィンドウの「Player Hit Prefab」の項目にドラッグします。
これでプレイヤーがやられる処理を「Player」スクリプトに実装できたので、「Spike」スクリプトに記述しているプレイヤーがやられる処理を修正していきます。

Project ウィンドウから「Spike」スクリプトをコードエディタで開き、

Spike.cs
using UnityEngine;

// 針を制御するスクリプト
public class Spike : MonoBehaviour
{
    // 他のオブジェクトと当たった時に呼び出される関数
    private void OnTriggerEnter2D( Collider2D other )
    {
        // 名前に「Player」が含まれるオブジェクトと当たったら
        if ( other.name.Contains( "Player" ) )
        {
            // プレイヤーから Player スクリプトを取得する
            var player = other.GetComponent<Player>();

            // プレイヤーがやられた時に呼び出す関数を実行する
            player.Dead();
        }
    }
}

「Spike」スクリプトをこのように書き換えて保存します。これで、プレイヤーがやられる処理を「Spike」スクリプトから「Player」スクリプトに移動することができました。プレイヤーと針の当たり判定を変更したため、念のためにプレイヤーと針の当たり判定が正常に動作するか確認しておきます。

Unity エディタに戻り Project ウィンドウから「Spike」プレハブを Hierarchy ウィンドウにドラッグして

針オブジェクトを適当な位置に配置したら

Unity を再生してプレイヤーを操作し、プレイヤーが針に当たるとやられることを確認します。確認できたら Unity の再生を停止します。

確認ができたので、Hierarchy ウィンドウに配置した「Spike」オブジェクトを選択した状態で「Delete」キーを押して削除しておきます。

敵の当たり判定の作成

プレイヤーがやられる処理を「Player」スクリプトに移動できたので、次は敵を制御するスクリプトにプレイヤーがやられる処理を追加していきます。

Project ウィンドウから「Enemy」スクリプトをコードエディタで開き、

Enemy.cs
// 他のオブジェクトと当たった時に呼び出される関数
private void OnTriggerEnter2D( Collider2D other )
{
    // 名前に「Player」が含まれるオブジェクトと当たったら
    if ( other.name.Contains( "Player" ) )
    {
        // プレイヤーから Player スクリプトを取得する
        var player = other.GetComponent<Player>();

        // プレイヤーがやられた時に呼び出す関数を実行する
        player.Dead();
    }
}

「Enemy」スクリプトの「Enemy」クラス内の末尾に上記のコードを入力して保存します。

これで Unity エディタに戻り Unity を再生してプレイヤーを操作すると、プレイヤーが敵に当たるとやられるようになったことが確認できます。確認できたら Unity の再生を停止します。

Unity メニューの「File > Save」を押すか、Ctrl + S を押して、ここまでの作業内容を保存しておきます。