LoginSignup
19
19

More than 5 years have passed since last update.

Unityで適当に誘導ミサイル作ってみた

Last updated at Posted at 2015-05-13

位置関係によってはうまく追尾できないなど問題はあります
(前方にあるうちはそこそこいける?)。
でも適当なコードで意外とそれっぽく動いて面白いです。

四方に設置した噴射器のパワーを制御して方向を変えるというモデル。
本物がどうなってるかは知りません( ˘ω˘ )
謎力で回転させるよりは説得力がある感じかな?

オブジェクトには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);
    }
}

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19