Unity C#で敵キャラから発射された弾が、ターゲット(オブジェクトB)の位置を追尾するようにしたい場合、MoveTowardsを使用することが一般的です。しかし、ターゲットBが移動している場合、弾は最初の位置に向かってしか移動しないという問題に直面することがあります。この記事では、この問題の原因と解決方法を詳しく解説します。
問題の理解:MoveTowardsの基本動作
UnityのMoveTowards関数は、オブジェクトがターゲットに向かって指定したスピードで移動するために使用されます。通常、MoveTowardsは指定されたターゲット(オブジェクトB)の位置を基準に移動します。しかし、ターゲットが移動する場合、MoveTowardsはターゲットの最初の位置にしか向かわず、その後の移動を追従しないという問題が発生します。
この問題は、MoveTowardsの関数がターゲットの位置を固定の一度だけ計算するために起こります。そのため、ターゲットが動いている場合でも、弾はターゲットの最初の位置に向かって進んでしまうのです。
解決方法:ターゲットのリアルタイム位置を追従する
この問題を解決するためには、ターゲットBのリアルタイム位置を毎フレームで取得し、その位置をMoveTowardsに渡す必要があります。これを行うことで、弾はターゲットの移動に追従し続けます。
具体的には、ターゲットBの位置を毎フレームで取得し、MoveTowardsに渡すことで弾がターゲットの現在位置に向かって移動し続けるようになります。以下にそのコード例を示します。
void Update() {
Vector3 targetPosition = target.position; // ターゲットの位置
transform.position = Vector3.MoveTowards(transform.position, targetPosition, bulletSpeed * Time.deltaTime); // 弾を移動させる
}
このコードでは、毎フレームターゲットの位置を更新して、それを基に弾が移動するようにしています。
弾の発射と追尾のためのコード改善
さらに、弾がターゲットに向かって移動する際に弾速を調整したい場合、弾の発射位置やスピードを変更することも可能です。弾の速度や方向をリアルタイムで制御するために、移動処理をUpdate()関数内で行います。
次に、弾が発射される際にその弾速や方向を設定するコードを例示します。
public class Bullet : MonoBehaviour {
public Transform target; // 目標ターゲット
public float bulletSpeed = 5f; // 弾のスピード
void Update() {
if(target != null) {
Vector3 targetPosition = target.position; // ターゲットの位置
transform.position = Vector3.MoveTowards(transform.position, targetPosition, bulletSpeed * Time.deltaTime); // 弾を移動させる
}
}
}
このコードでは、弾がターゲットを追いながら、指定した速度で移動し続けます。弾速は「bulletSpeed」で設定されており、Time.deltaTimeを掛けることで、フレームレートに依存しない一定の速さで移動します。
まとめ:ターゲットの動きに追従する弾の実装
ターゲット(オブジェクトB)が移動する場合、弾が最初の位置に向かってしか移動しない問題は、ターゲットのリアルタイム位置を追従しないことが原因です。これを解決するためには、毎フレームターゲットの位置を取得して、弾がその位置を追尾するようにMoveTowardsを設定する必要があります。
上記のコードを参考に、ターゲットの動きに追従する弾を実装することで、敵キャラから発射される弾をターゲットに向かって正しく移動させることができます。


コメント