MRが楽しい

MRやVRについて学習したことを書き残す

NavMeshを使ってキャラクタとおいかけっこをする

本日は Unity の技術調査枠です。
以前 NavMesh を使って特定のポイントから特定のポイントまでキャラクタを移動させました。
・SpatialMappingのデータにNavMeshを適用する その2
 http://bluebirdofoz.hatenablog.com/entry/2017/08/10/023942

今回はこの技術をおいかけっこアプリに取り込むべく、カメラを追跡し続けるようにカスタマイズしてみます。
その2で利用したプロジェクトを開きます。
f:id:bluebirdofoz:20170902230403j:plain

修正方法としては、以前、一度目にクリックした個所から二度目にクリックした個所へ移動していたのを。
二度目のクリック箇所をカメラ位置にロジックを差し替えます。
更に、カメラは移動し続けるので、Update で常に追跡位置を変更します。
MoveToClickPoint.cs スクリプトのOnInputClicked関数とUpdate関数を以下の通り修正しました。
・MoveToClickPoint.cs

public class MoveToClickPoint : MonoBehaviour, IInputClickHandler
{
    public NavMeshAgent Agent;
    LineRenderer lineRenderer;

    bool traceFlag = false;

    void Start()
    {
        InputManager.Instance.PushFallbackInputHandler(gameObject);
        Agent.gameObject.SetActive(false);
        lineRenderer = gameObject.GetComponent<LineRenderer>();
        lineRenderer.positionCount = 0;
    }

    public void OnInputClicked(InputClickedEventData eventData)
    {
        if (GazeManager.Instance.IsGazingAtObject)
        {
            var hitInfo = GazeManager.Instance.HitInfo;
            if (!Agent.gameObject.activeSelf)
            {
                Agent.gameObject.SetActive(true);
                Agent.transform.position = hitInfo.point;

                Agent.destination = Camera.main.transform.position;

                // パスの計算
                var path = new NavMeshPath();
                NavMesh.CalculatePath(Agent.transform.position, Agent.destination, NavMesh.AllAreas, path);
                var positions = path.corners;

                // ルートの描画
                lineRenderer.widthMultiplier = 0.1f;
                lineRenderer.positionCount = positions.Length;
                for (int i = 0; i < positions.Length; i++)
                {
                    Debug.Log("point " + i + "=" + positions[i]);
                    lineRenderer.SetPosition(i, positions[i]);
                }

                // 追跡フラグON
                traceFlag = true;
            }
            else
            {
            }
        }
    }

    void Update()
    {
        if (Input.anyKeyDown)
        {
            Debug.Log("click LOG");
            if (GazeManager.Instance.IsGazingAtObject)
            {
                var hitInfo = GazeManager.Instance.HitInfo;
                if (!Agent.gameObject.activeSelf)
                {
                    Agent.gameObject.SetActive(true);
                    Agent.transform.position = hitInfo.point;

                    Agent.destination = Camera.main.transform.position;

                    // パスの計算
                    var path = new NavMeshPath();
                    NavMesh.CalculatePath(Agent.transform.position, Agent.destination, NavMesh.AllAreas, path);
                    var positions = path.corners;

                    // ルートの描画
                    lineRenderer.widthMultiplier = 0.1f;
                    lineRenderer.positionCount = positions.Length;
                    for (int i = 0; i < positions.Length; i++)
                    {
                        Debug.Log("point " + i + "=" + positions[i]);
                        lineRenderer.SetPosition(i, positions[i]);
                    }

                    // 追跡フラグON
                    traceFlag = true;
                }
            }
        }
        if (traceFlag == true)
        {
            Agent.destination = Camera.main.transform.position;

            // パスの計算
            var path = new NavMeshPath();
            NavMesh.CalculatePath(Agent.transform.position, Agent.destination, NavMesh.AllAreas, path);
            var positions = path.corners;

            // ルートの描画
            lineRenderer.widthMultiplier = 0.1f;
            lineRenderer.positionCount = positions.Length;
            for (int i = 0; i < positions.Length; i++)
            {
                Debug.Log("point " + i + "=" + positions[i]);
                lineRenderer.SetPosition(i, positions[i]);
            }
        }
    }
}

結果……。
f:id:bluebirdofoz:20170902230416j:plain
ちゃんと動きました。

カメラを移動しても、経路探索をやりなおして追跡し続けます。
f:id:bluebirdofoz:20170902230425j:plain

後はこれを(何とか上手く設計を見直して)おいかけっこアプリに反映するだけです。