もふもふ技術部

IT技術系mofmofメディア

Unityで追いかけてくるゾンビを実装する

最近めっきりUnityにハマっています。今日はゾンビに追いかけられる恐怖体験を実装してみたいと思います。

前回のタイトル画面をコピーするところから始めます。

Unityで画面遷移する - ゾンビの部屋にタイトル画面を実装

UnityチュートリアルSurvial Shooter Creating Enemy #1を参考にやっていきます。

ゾンビ側の設定

前回のタイトル画面とは別に作りたいのでシーンをコピーしておきます。やり方は簡単なので割愛。こんな感じでゾンビが配置された状態からスタートです。

stage

どのゾンビでもいいので、Add Componentしていきます。

Rigidbodyは、ConstraintsFreeze PositionのYのみチェック、Freeze RotationのXとZにチェックを入れて転がったりしないようにします。

Capsule ColiderCenterX:0, Y:1, Z:0にする。

Sphere ColiderIs Triggerをチェック、CenterX:0, Y:1, Z:0にする。

Nav Mesh Agentは、Speed:0.2, Radius:0.3, Height: 1.8に変更。このNav Mesh Agentというのでフィールドを学習して移動できる範囲を決めることが出来ます。詳しくはあんまり分かっていないけど。

zombie

プレイヤーの配置

以前、Unityで3Dオレの部屋を作って歩き回るでやったとおりにPlayerを配置し、同様に、Main CameraオブジェクトにFollowPlayerスクリプトを設定して、それぞれのRotationで向きを揃える。今回はY:90にしている。

Window -> AI -> Navigationを開く。

Bakeを開いて、Agent Radius:0.75, Agent Height: 1.9, Step Height:0.38を設定する。それぞれの数値はゾンビの大きさに合わせるっぽいがまだあんまり理解してない。

Bakeボタンを押す。これで学習してくれるっぽい?

navigation

続いて、NavMeshを使ってプレイヤーを追いかけるスクリプトを書きます。ゾンビにNew ScriptAdd Componentします。

EnemyMovement.cs

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

public class EnemyMovement : MonoBehaviour
{
    Transform player;
    UnityEngine.AI.NavMeshAgent nav;

    void Awake()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        nav = GetComponent<UnityEngine.AI.NavMeshAgent>();
    }

    void Update()
    {
        nav.SetDestination(player.position);
    }
}

最後に全てのゾンビさんに反映させるためにPrefabApply Allします。

たったこれだけ。簡単!!

こんな感じで3体のゾンビさんが追いかけてきます。

chase

残り

Nav Mesh Agentを設定するとなぜかゾンビさんが少しだけ浮遊してしまいます。Navigation -> BakeStep Heightあたりを疑っているんですがまだ未解決。

あと、ゾンビさん登場時にidelアニメーションが入っているのですが、問答無用にプレイヤーを追跡してくるので、起動時に歩いていないのに空中を滑るように移動してくる点も未解決。