【Unity2d】モンスターをプレイヤーに近づかせる処理

Unity2D

Unity2D ARPG

こんにちは。なおキーヌです。

ブログ毎日更新は349日目になります。

攻撃のアニメーションと判定が出来たので今度はモンスターをプレイヤーに近づけてみましょう。

仕組み的には簡単で毎フレームプレイヤーの座標に近づく処理を書けばいいだけです。

プレイヤーに近づけさせるためには

恐らくこれはUnity教本とかによく記載されているのではないでしょうか?

単純に処理を考えるとプレイヤーのワールド座標に、
モンスターのワールド座標を近づけさせるような計算式にすればいいと考えられます。

試しにシンプルに実装してみましょう。

本来は移動用スクリプトを経由させたいですが一旦どんなもんかみたいので
ゴブリンに装着してるノックバックしてるスクリプトのUpdateに置いてみます。

「SmallEnemyCollision」スクリプトを以下のようにします。

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

public class SmallEnemyCollision : MonoBehaviour
{
    private Rigidbody2D rb;
    private GameObject player;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        player =  GameObject.FindGameObjectsWithTag("Player")[0];
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 pv = player.transform.position;
        Vector3 ev = transform.position;

        float p_vX = pv.x - ev.x;
        float p_vY = pv.y - ev.y;

        float vx = 0f;
        float vy = 0f;

        float sp = 10f;

        // 減算した結果がマイナスであればXは減算処理
        if ( p_vX < 0 ) {
            vx = -sp;
        } else {
            vx = sp;
        }

        // 減算した結果がマイナスであればYは減算処理
        if ( p_vY < 0 ) {
            vy = -sp;
        } else {
            vy = sp;
        }

        transform.Translate(vx/50, vy/50, 0);

    }

    private void OnTriggerEnter2D(Collider2D other) {
        _ObjectStateWeapon weapon = other.GetComponent<_ObjectStateWeapon>();
        rb.AddForce(weapon.force);
    }
}

これでモンスターがプレイヤーを追いかけてきます。

色々と問題はありますが一旦はこれでいいでしょう。

まずはプレイヤーとモンスターの座標を取得し、プレイヤーを軸に減算させます。

この計算はプレイヤーとの距離を0にしようとしているので永久的に追尾してきます。

もっとスリムにコードを書けるかもしれませんが理解しやすいかなと思います。

モンスターによって動きを変えるためには

現状はそれぞれのスクリプトに動きを実装していますが、最終的にはタイプを持たせて
そのタイプに応じた移動処理をMoveスクリプトから呼び出すという仕組みにしようと思います。

そうすると処理が1つにまとまってメンテナンスしやすいですからね。

目標めがけて直進してくるタイプだけだと面白くないですよね。

例えばスライムとかだとそのままスライドして移動してきたら違和感しかありません。

スライムの移動って這いずって移動か、ジャンプしての移動って言うのがよく見られます。

後者だとポップな感じがしますよね。

ドラクエとか可愛らしいタイプのスライムに似合います。

一方這いずってくるタイプの移動だと恐怖を演出できます。

いわゆる可愛くない本来のスライムに似合います。

後は直進しか出来ないタイプのモンスターとか面白いですね。

移動スクリプトの課題

現状AIが組み込まれていない為、壁があるとそこでとまってしまいます。

いわゆる経路探索とかその辺の仕組みを組み込んだり壁を認識できるようにしてあげなければいけません。

これは結構骨の折れる作業なので後にじっくりと実装します。

後は状態によって停止したりとか色々制御をする仕組みも必要ですね。

最後に一定以上近づいたら攻撃に切り替えなければいけません。

攻撃については後程実装していきます。

次回は体験版に出てくるモンスターをきめてしまおうと思います。

コードは無いですが計画を確認しながら進むのも大切です。

それでは。