読者です 読者をやめる 読者になる 読者になる

遊べるゲームを作りたい

作りたいです。

Unityで自作ゲームを作る NavMeshAgentでランダム移動

f:id:hogemarunosuke:20170414094105p:plain

遊び方

WASDキーで移動。マウスで視点移動。
左クリックで射撃。右クリックでロックオン。左シフトでダッシュ(前進中のみ)。
左ダブルクリック後、押しっぱなしでチャージ、離してチャージショット。
スペースキーでジャンプ。ジャンプ中にもう一度スペースで2段ジャンプ。
Qキーでポーズ。ポーズすることでマウスカーソルを表示することができます。

待機モード中の敵にランダム移動を追加しました。

ランダム移動

NavMeshAgentをアタッチしたオブジェクトは、destinationに座標をセットすればそこへ向かって移動してくれますが、実際にNavMeshが生成されている場所でないと(実際に移動できる場所でないと)全くの無反応です。

なので、ランダム座標を決めたあと、そこから真下にRaycastを飛ばしてNavMeshとぶつかる座標を取得します。

public Vector3 GetRandomPos()
{
    // 一定間隔でランダム座標を更新する
    updateRandomPosTimer += Time.deltaTime;
    if (updateRandomPosTimer > updateRandomPosInterval)
    {
        // ランダム座標
        float randomPosX = Random.Range(-randomMoveDistance, randomMoveDistance);
        float randomPosY = Random.Range(0, randomMoveDistance);
        float randomPosZ = Random.Range(-randomMoveDistance, randomMoveDistance);

        // NavMesh上の座標を取得
        int layerMask = (1 << LayerMask.NameToLayer("Terrain")); // "Terrain"レイヤー以外を無視
        var hits = Physics.RaycastAll((this.originPos + new Vector3(randomPosX, randomPosY, randomPosZ)), Vector3.down, 1000, layerMask);
        foreach (var hit in hits)
        {
            if (hit.collider.CompareTag("Terrain"))
            {
                this.randomPos = hit.point;
                break;
            }
        }

        updateRandomPosTimer = 0;
    }

    return this.randomPos;
}

これで一応ランダムっぽい動きにはなります。ただちょっと移動が直線的すぎるというか、メリハリが利きすぎるというか、なんというか単調かも。

マ●オ64のク●ボーとかものすごい滑らかにフィールドを徘徊して、マリ●を見つけると加速度を溜めつつ突進してきますが、ああいうのを作りたいな…