位置関係によってはうまく追尾できないなど問題はあります
(前方にあるうちはそこそこいける?)。
でも適当なコードで意外とそれっぽく動いて面白いです。
四方に設置した噴射器のパワーを制御して方向を変えるというモデル。
本物がどうなってるかは知りません( ˘ω˘ )
謎力で回転させるよりは説得力がある感じかな?
オブジェクトにはRigidbodyをアタッチ、半径0.5程度の物体を前提としてあります。
targetにはシーンに配置した適当なオブジェクトを設定してください。
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class MissileControl : MonoBehaviour {
public GameObject target;
Rigidbody _rigidbody;
Vector3 _upEngine = Vector3.up*0.5f;
Vector3 _downEngine = Vector3.down*0.5f;
Vector3 _leftEngine = Vector3.left*0.5f;
Vector3 _rightEngine = Vector3.right*0.5f;
public float enginePower = 10.0f;
// Use this for initialization
void Start () {
_rigidbody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
Vector3 dif = target.transform.position - transform.position;
Vector3 difLocal = transform.InverseTransformVector(dif);
float upPower;
float downPower;
float leftPower;
float rightPower;
float difX = difLocal.x;
if( difX > 0 )
{
leftPower = 1.1f;
rightPower = 0.9f;
}
else if( difX < 0 )
{
leftPower = 0.9f;
rightPower = 1.1f;
}
else
{
leftPower = rightPower = 1.0f;
}
float difY = difLocal.y;
if( difY > 0 )
{
upPower = 0.9f;
downPower = 1.1f;
}
else if( difY < 0 )
{
upPower = 1.1f;
downPower = 0.9f;
}
else
{
upPower = downPower = 1.0f;
}
Vector3 forward = transform.forward;
_rigidbody.AddForceAtPosition(enginePower * upPower * forward, transform.TransformPoint( _upEngine ), ForceMode.Force);
_rigidbody.AddForceAtPosition(enginePower * downPower * forward, transform.TransformPoint( _downEngine ), ForceMode.Force);
_rigidbody.AddForceAtPosition(enginePower * leftPower * forward, transform.TransformPoint( _leftEngine ), ForceMode.Force);
_rigidbody.AddForceAtPosition(enginePower * rightPower * forward, transform.TransformPoint( _rightEngine ), ForceMode.Force);
}
}