スマホとPCの画像

前回の記事でプレイヤーの操作はある程度できました。

今回は自動で追いかけてくるコンピュータを作りたいと思います。

コンピュータのインポート

まずはコンピュータのインポートです。

今回も仮ですが、フリーの3Dキャラクターを使用します。

プレイヤーと区別するためにロボットにします。

アセットのインポート方法は以前の記事の「キャラクターを登場させる」の項目が参考になるかと思います。

もしインポートの仕方がわからない方はこちらから。

コンピュータとなるロボットをインポート

コンピュータの向きを変更しておきます。

インスペクタウィンドウの「Transform > Rotation > Y」を180にします。

これで向き合う形となりました。

ロボットとUnity-chanが向かい合うように設定

コンピュータに追いかけられるように設定する

コンピュータを自動で動かすために「NavMesh」という便利な機能があります。

かなり簡単にできたので今回はこれを使います。

NavMeshの設定方法

動ける範囲を設定する
動かすキャラクターを設定する
目的地を設定する

動ける範囲を設定する

まずはロボットが動ける範囲を設定します。

メニューの「Window > AI > Navigation」をクリックします。

Navigationウィンドウが表示されたことを確認します。

ヒエラルキーウィンドウから地面に該当するCubeを選択します。

オブジェクトをStaticに設定します。

「Navigation > Bake > Bake」をクリックします。

動ける範囲が青色に表示されるようになります。

動かすキャラクターを設定する

次は動かすキャラクターを設定します。

今回はロボットを動かします。

ヒエラルキーウィンドウから「Robot Kyle」を選択します。

インスペクタウィンドウの「Add Component」から「Nav Mesh Agent」を追加します。

目的地を設定する

ヒエラルキーウィンドウから「Robot Kyle」を選択します。

「Add Component」を選択し、「New Script」を追加します。

名称は任意です。

本記事では警官側の動作として「CopsAction」としました。

次に、追いかける対象を判別するため、Unity-chanにタグを設定します。

ヒエラルキーウィンドウから「unitychan」を選択します。

インスペクタウィンドウの「Tag > Add Tag…」を選択します。

「Tags > + > New Tag Name」をRobbers(泥棒)として、Saveをクリックします。

もう一度ヒエラルキーウィンドウから「unitychan」を選択し、TagにRobbersを設定します。

最後に追いかける処理を実装します。

ヒエラルキーウィンドウから「Robot Kyle」を選択します。

インスペクタウィンドウの「Cops Action」スクリプトをダブルクリックしてVisualStudioを起動します。

スクリプトを記述していきます。

using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using UnityEngine;
using UnityEngine.AI;

/// <summary>
/// 警官の動作処理一覧
/// </summary>
public class CopsAction : MonoBehaviour
{
    #region 定数
    /// <summary>
    /// 泥棒キャラを識別するためのタグ名称
    /// </summary>
    private const string TAG_NAME_ROBBERS = "Robbers";
    #endregion

    #region メンバ変数
    /// <summary>
    /// 警官
    /// </summary>
    NavMeshAgent m_agent = null;
    #endregion

    #region イベント
    /// <summary>
    /// 起動イベント
    /// </summary>
    void Start()
    {
        // 警官キャラを取得する
        m_agent = GetComponent<NavMeshAgent>();
    }

    /// <summary>
    /// フレーム更新イベント
    /// </summary>
    void Update()
    {
        // 警官キャラがいなければ何もしない
        if (m_agent == null) return;
        // 泥棒キャラの位置(見つからなければ現在地が返ってくる)
        m_agent.destination = getRobbersPos();
    }
    #endregion

    #region プライベートメソッド
    /// <summary>
    /// 泥棒キャラを探す
    /// </summary>
    /// <returns>目的地</returns>
    /// <remarks>
    /// 泥棒キャラが見つからなければ現在地を返す
    /// ToDo:常に泥棒の位置がわかるのはゲーム的にまずいので探索範囲設定が必要
    /// </remarks>
    private UnityEngine.Vector3 getRobbersPos()
    {
        // 目的地
        UnityEngine.Vector3 targetPos = transform.position;
        // [Robbers]タグを持つオブジェクトを探す
        GameObject robbers = GameObject.FindWithTag(TAG_NAME_ROBBERS);
        // 見つかれば座標を取得する
        if (robbers != null)
        {
            // 目的地を更新する
            targetPos = robbers.transform.position;
        }
        return targetPos;
    }
    #endregion
}

動作を確認する

以上で設定は終わりです。

動作を確認します。

おわりに

無事ロボットが動くようになりました。

ただ、アニメーションがないのは違和感がありますね。

キャラクターは追々見直すのでひとまずはこのまま行こうと思います。

少しずつゲームができてきている気がしてモチベーションが上がってきました。

そろそろiPhoneでの動作確認をしていく準備をします。

Unity-chanライセンス画像

この作品はユニティちゃんライセンス条項の元に提供されています