Posted at

Rigidbody2DでLOS追跡

More than 3 years have passed since last update.

GameAIの勉強がてらUnityを使って敵を追跡するアルゴリズムを実装してみた。

LOS追跡、Line-of-Sighは的に対して最短距離で追い込むようなものです。

仕組みは非常に簡単でプレイヤーとのVectorの差分を計算し、その方向に力を加えるだけです。

実際のコードはこんな感じ。

using UnityEngine;

using System.Collections;

public class LosEnemyControlScript : MonoBehaviour {
//追跡対象
public GameObject objTarget;

//今までいた位置を保持
public Vector2 prev;

//初期化処理
void Start () {
prev = transform.position;
}

void Update () {
Move();
}

//移動関数
void Move(){
//ユーザの場所を特定
Vector2 Predetor = objTarget.transform.position;

float x = Predetor.x;
float y = Predetor.y;
//追跡方向の決定
Vector2 direction = new Vector2(x - transform.position.x, y - transform.position.y).normalized;
//ターゲット方向に力を加える
GetComponent<Rigidbody2D> ().velocity = (direction * 4);

//本体の向きを調整
Vector2 Position = transform.position;
Vector2 diff = Position - prev;
if (diff.magnitude > 0.01) {
float angle = Mathf.Atan2 (diff.y, diff.x) * Mathf.Rad2Deg - 90;
transform.rotation = Quaternion.AngleAxis (angle, Vector3.forward);
}
//次回角度計算のために現在位置を保持
prev = Position;
}
}

これを動かすとこんな感じになります。

LOS追跡

かわいらしいですね♪