Navigation Mesh を使って NPC をゴールまで歩かせる

提供: socialakiba wiki
移動: 案内検索

nav mesh の設定

Navimesh01.png

NPC (non-playable character, non-player character。単に agent、mob、bot などとも言う) が歩き回れる範囲を自動的に計算してくれるのが navigation mesh。

navigation (inspector の右端) を開いて、適当に object 選択して bake すると作られる。


Navimesh02.png

坂の傾斜は 45度まで登れるとか。

段差は 0.4m まで登れるとか。


Navimesh03.png

navigation static にチェックを入れると、navigation area で walkable を選べる。


nav mesh agent の設定

Navimesh04.png

inspector で npc(この例では jimiko17) に navigation -> nav mesh agent コンポーネントを追加する。

speed は動き回る速さ。

moveto.cs というスクリプトを追加する。

inspector でプレイヤーのタグを untagged から player に変更しておいてね。

npc は最初は止まっている(idle2 というアニメーションを再生する)。

npc にプレイヤーが触れると動きだす(同時に walk(1) というアニメーションに切り替える)。


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

public class MoveTo : MonoBehaviour {

    // public な変数は inspector で上書きできる
    public Transform goal;
    public Transform lookat;

    private NavMeshAgent npc;
    private Animator anim;
    private bool isWalking;

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

        // lookat は pro でしか使えないらしい
        anim.SetLookAtWeight(1f, 0f, 1f, 0f, 0.5f);
        anim.SetLookAtPosition(lookat.position);

        npc = GetComponent<NavMeshAgent>();

        isWalking = false;
    }

    void Update()
    {
    }

    void OnCollisionEnter(Collision col)
    {
        // 止まっているところにプレイヤーが乗った
        if (!isWalking && col.gameObject.CompareTag("Player"))
        {
            // 歩き出す
            npc.destination = goal.position;
            anim.SetBool("isWalking", true);
            isWalking = true;
        }
    }
}

animator の設定

Navimesh06.png

まず、isWalking という Bool の parameter を作っておいてね。

entry から idle2 へ。


Navimesh05.png

has exit time にチェックが入ってるとはまります(idle から walk にすぐに切り替わらずに地面をすべる)


歩く速さの調整

Navimesh07.png
Navimesh08.png

animator の motion の speed と nav mesh agent の speed で適当に調節するのが賢い(blender側では適当な長さ速さで作っておく)。