今回は2Dゲームでプレイヤーに向かって移動してくる敵(自機狙い)の敵を作る方法について書いていきます。
※Rigidbody2Dを使用した方法になります。
自機狙いの敵の実装方法
Rigidbody2Dを使用した実装方法で、「AddForce」を使うパターンと「velocity」を使うパターンを紹介します。
①AddForceを使う方法
スクリプト
AddForceを使ったサンプルです。
using UnityEngine;
public class EnemyMove : MonoBehaviour
{
private Rigidbody2D rb2d;
public GameObject player;
public float speed;
public float limit;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
// 「対象の座標 - 自分の座標」で目的方向を出す
Vector3 pos = player.transform.position - transform.position;
// 正規化したものに移動速度をかけてAddForce
rb2d.AddForce(pos.normalized * speed);
// 制限速度を超えたら減速する
if (rb2d.velocity.magnitude > limit)
{
rb2d.velocity = new Vector2(rb2d.velocity.x / 1.1f, rb2d.velocity.y / 1.1f);
}
}
}
加速しすぎてしまうのを防ぐため、velocityを変えて減速するようにしています。
※「1.1f」の数字を大きくするともっと強く速度を落とせますが、大きくし過ぎるとガクガクして不自然な感じになります。
実行するとこんな感じになります。(四角:プレイヤー、三角:敵)
スクリプトは赤い三角のオブジェクトにアタッチしています。
フワフワとついてくる感じなのでホーミングミサイルとかの動きに使えそうです(*’ω’*)
②velocityを使う方法
スクリプト
velocityを使ったサンプルです。
using UnityEngine;
public class EnemyMove : MonoBehaviour
{
private Rigidbody2D rb2d;
public GameObject player;
public float speed;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
// 「対象の座標 - 自分の座標」で目的方向を出す
Vector3 pos = player.transform.position - transform.position;
// x、yに移動速度をかける
rb2d.velocity = new Vector2(pos.x * speed, pos.y * speed);
}
}
目的方向を出す部分はAddForceの時と同じですね。
その後は移動速度をかけたものをvelocityに入れるだけです。
実行するとこんな感じになります。
プレイヤーの場所へ突っ込んできます。
もう少しスピードの調整が必要ですが、自機に体当たりしてくるタイプの敵の動きで使えそうです。
おまけ:プレイヤーの方向を向くようにする
敵の向いている方向を分かりやすくしてみました。
以下を追加して向きを変更してあげるとできます。
transform.rotation = Quaternion.FromToRotation(Vector3.up, pos);
コメント