コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity 入門】全方位シューティングを作る 第17回 宝石の当たり判定の追加と移動ロジックの修正

目次

前回のチュートリアル

はじめに

前回は、敵を倒したら宝石を落とすようにしていきます
今回は、プレイヤーと宝石の当たり判定を作成していきます

また、敵を倒して散らばった宝石を、
プレイヤーが気持ち良く回収できるようにするために、
プレイヤーが宝石に近づいたら、
宝石が自動でプレイヤーに引き寄せられるようにしていきます

宝石のスクリプトの修正

まずは、宝石が自動でプレイヤーに引き寄せられるようにするコードと、
プレイヤーと宝石が当たったら、宝石を消すコードを作成していきます

「Gem」スクリプトをコードエディタで開き、
変数の定義に下記のコードを追加します

// プレイヤーを追尾する時の加速度、数値が大きいほどすぐ加速する
public float m_followAccel = 0.01f;

private bool m_isFollow; // プレイヤーを追尾するモードに入った場合 true
private float m_followSpeed; // プレイヤーを追尾する速さ

さらに、Update 関数の先頭に下記のコードを記述します

// プレイヤーの現在地を取得する
var playerPos = Player.m_instance.transform.localPosition;

// プレイヤーと宝石の距離を計算する
var distance = Vector3.Distance( playerPos, transform.localPosition );

// プレイヤーと宝石の距離が近づいた場合
if ( distance < Player.m_instance.m_magnetDistance )
{
    // プレイヤーを追尾するモードに入る
    m_isFollow = true;
}

// プレイヤーを追尾するモードに入っている場合かつ
// プレイヤーがまだ死亡していない場合
if ( m_isFollow && Player.m_instance.gameObject.activeSelf )
{
    // プレイヤーの現在位置へ向かうベクトルを作成する
    var direction = playerPos - transform.localPosition;
    direction.Normalize();

    // 宝石をプレイヤーが存在する方向に移動する
    transform.localPosition += direction * m_followSpeed;

    // 加速しながら近づく
    m_followSpeed += m_followAccel;
    return;
}

そして、Init 関数の下に下記のコードを記述します

// 他のオブジェクトと衝突した時に呼び出される関数
private void OnTriggerEnter2D( Collider2D collision )
{
    // 衝突したオブジェクトがプレイヤーではない場合は無視する
    if ( !collision.name.Contains( "Player" ) ) return;

    // 宝石を削除する
    Destroy( gameObject );
}

これで、宝石が自動でプレイヤーに引き寄せられるようにするコードと、
プレイヤーと宝石が当たったら、宝石を消すコードの作成が完了しました

プレイヤーのスクリプトの修正

次に、プレイヤーがどのくらい宝石に近づいたら、
宝石がプレイヤーに引き寄せられるようになるかを
設定できるようにしていきます

「Player」スクリプトをコードエディタで開き、
変数の定義に下記のコードを追加します

public float m_magnetDistance; // 宝石を引きつける距離

宝石に当たり判定の機能を追加

スクリプトの修正が完了したので、
Unity エディタで宝石に当たり判定の機能を追加していきます

Ctrl キーを押しながらすべての宝石のプレハブをクリックして選択した状態にしたら
「Add Component」ボタンを押して、

入力欄に「BoxCollider2D」と入力して、表示された「Box Collider 2D」を選択します

そして、「Is Trigger」をチェックします

続けて「Add Component」ボタンを押して、

入力欄に「Rigidbody2D」と入力して、表示された「Rigidbody 2D」を選択します

そして、「Body Type」を「Kinematic」に変更します

これで、宝石に当たり判定の機能を追加できました

プレイヤーのパラメータの調整

最後に、プレイヤーがどのくらい宝石に近づいたら、
宝石がプレイヤーに引き寄せられるようになるかを設定していきます

「Player」オブジェクトを選択して、
「Magnet Distance」(宝石を引きつける距離)に「2」を入力します

これで Unity を再生すると、敵が落とした宝石にプレイヤーが近づくと、
宝石が少しずつプレイヤーに吸い寄せられていき、
宝石がプレイヤーにぶつかると、宝石が消えるようになったことが確認できます

次回は、プレイヤーのレベルアップを作成していきます

次のチュートリアル

チュートリアル一覧