最近寒かったのでコタツを設置、早速居眠りして変な汗をかきました…
コタツは心地良いですが風邪をひかないように要注意ですね!
今日はホーミングミサイルの実装方法について説明したいと思います。
といっても考え方は非常にシンプルです
といった感じです。
C#(Unity上)で実装したソースはこちらになります
using UnityEngine;
using System.Collections;
public class Bullet : MonoBehaviour
{
private GameObject _target = null; // ロックオンしたターゲット
private float _speed = 6.0f; // 1秒間に進む距離
private float _rotSpeed = 180.0f; // 1秒間に回転する角度
public GameObject Target
{
set { _target = value; }
get { return _target; }
}
// Update is called once per frame
void Update()
{
if (_target == null)
{
return;
}
// ターゲットまでの角度を取得
Vector3 vecTarget = _target.transform.position - transform.position; // ターゲットへのベクトル
Vector3 vecForward = transform.TransformDirection(Vector3.forward); // 弾の正面ベクトル
float angleDiff = Vector3.Angle(vecForward, vecTarget); // ターゲットまでの角度
float angleAdd = (_rotSpeed * Time.deltaTime); // 回転角
Quaternion rotTarget = Quaternion.LookRotation(vecTarget); // ターゲットへ向けるクォータニオン
if (angleDiff <= angleAdd)
{
// ターゲットが回転角以内なら完全にターゲットの方を向く
transform.rotation = rotTarget;
}
else
{
// ターゲットが回転角の外なら、指定角度だけターゲットに向ける
float t = (angleAdd / angleDiff);
transform.rotation = Quaternion.Slerp(transform.rotation, rotTarget, t);
}
// 前進
transform.position += transform.TransformDirection(Vector3.forward) * _speed * Time.deltaTime;
}
}
このソースで肝になるのは、指定角度だけ向けるところでしょうか。
ターゲットまでの残り角度を求め、指定角度が残り角度の何%か(t=0.0f〜1.0f)を求めます。
何%かを計算したら、Quaternion.Slerp() で現在の向きからターゲット方向への補間を行い、
最終的な向きを求めています
簡単ではありますが、Web上で実行出来るものをアップしました。
画面クリックで弾を発射するだけのプログラムです。
(※実行には別途 Unity WebPlayer のインストールが必要になりますのでご注意下さい。)
角度を扱うにはクォータニオン
とても便利なので是非覚えていって下さい

