12.

Unity 飛行機の加速・減速スクリプト|Update / Rigidbody / 空力抵抗

編集
この記事の要点
  • Unity で飛行機の加速・減速を実装するスクリプト例
  • 前提: 飛行機オブジェクト (Asset Store からインポート) にスクリプトを付与
  • 実装: Update 内で毎フレーム速度に加算、スペースキー押下で減速
  • 速度上限・空力抵抗を入れると挙動が自然になる
  • 物理ベースで作るなら Rigidbody.AddForce + Drag (空気抵抗) の組み合わせが推奨

概要

Unity (C#) で飛行機の加速・減速をスクリプトで実装する例です。Asset Store の飛行機モデルにこのスクリプトを付与すれば、ボタンで加速、スペースキーで減速する基本動作が作れます。

シンプルな実装(Transform.Translate)

飛行機を自動で前進させ、スペースキーで減速する基本形:

using UnityEngine;

public class MyAircraftController : MonoBehaviour {
    public float maxSpeed = 50f;       // 最高速度
    public float acceleration = 5f;    // 加速度 (units/sec^2)
    public float deceleration = 10f;   // 減速度
    public float drag = 0.5f;          // 空気抵抗(速度に比例した減速)

    private float currentSpeed = 0f;

    void Update() {
        // スペースキーで減速、それ以外は加速
        if (Input.GetKey(KeyCode.Space)) {
            currentSpeed -= deceleration * Time.deltaTime;
        } else {
            currentSpeed += acceleration * Time.deltaTime;
        }

        // 空気抵抗(速度の二乗に比例する物理モデル)
        currentSpeed -= currentSpeed * drag * Time.deltaTime;

        // 速度上限・下限
        currentSpeed = Mathf.Clamp(currentSpeed, 0f, maxSpeed);

        // 前方に移動
        transform.Translate(Vector3.forward * currentSpeed * Time.deltaTime);
    }
}

Rigidbody を使った物理ベース版

当たり判定や重力・ジョイントを使いたいなら Rigidbody 推奨:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class PhysicsAircraftController : MonoBehaviour {
    public float thrust = 1000f;       // エンジン推力 (N)
    public float brakeForce = 500f;
    public float maxSpeed = 50f;

    private Rigidbody rb;

    void Start() {
        rb = GetComponent();
        rb.drag = 0.1f;                // 空気抵抗 (Unity 物理エンジン管理)
        rb.angularDrag = 0.5f;
    }

    void FixedUpdate() {
        // スペースで減速、それ以外で推進
        if (Input.GetKey(KeyCode.Space)) {
            // 進行方向と逆向きに力をかける
            rb.AddForce(-rb.velocity.normalized * brakeForce);
        } else {
            // 機首方向(forward)に推力
            if (rb.velocity.magnitude < maxSpeed) {
                rb.AddForce(transform.forward * thrust);
            }
        }
    }
}

UI に速度を表示

HUD に現在速度を表示するなら TextMeshPro / uGUI Text を使います:

using UnityEngine;
using TMPro;

public class SpeedDisplay : MonoBehaviour {
    public Rigidbody aircraft;
    public TextMeshProUGUI speedText;

    void Update() {
        // m/s → km/h
        float kmh = aircraft.velocity.magnitude * 3.6f;
        speedText.text = $"{kmh:F0} km/h";
    }
}

ピッチ / ロール / ヨー(おまけ)

飛行機らしい操作には機体回転も必要です:

void Update() {
    // ピッチ (上下) - W / S
    float pitch = Input.GetAxis("Vertical") * 30f * Time.deltaTime;
    // ロール (横傾き) - A / D
    float roll = -Input.GetAxis("Horizontal") * 30f * Time.deltaTime;
    // ヨー (機首方向) - Q / E
    float yaw = 0f;
    if (Input.GetKey(KeyCode.Q)) yaw = -15f * Time.deltaTime;
    if (Input.GetKey(KeyCode.E)) yaw = 15f * Time.deltaTime;

    // ローカル軸基準で回転
    transform.Rotate(pitch, yaw, roll);
}

調整ポイント

パラメータ目安意味
maxSpeed30〜100 units/s最高速度。大きいほど高速だが操縦が難しい
acceleration5〜20加速の鋭さ。プロペラ機なら小さめ、戦闘機なら大きめ
drag0.1〜1.0空気抵抗。大きいと急減速
thrust (Rigidbody)500〜5000 N機体質量と相談(小型機なら 1000 N 程度)
Rigidbody.mass50〜10000 kg機体質量。セスナ ~1000kg、戦闘機 ~10000kg

よくあるハマりどころ

  • 機体が傾いていると意図しない方向に進む: Vector3.forward(ワールド座標)と transform.forward(ローカル)を使い分ける
  • 地面に潜り込む: Rigidbody の Use Gravity が ON のままで推力不足 → 重力 OFF か揚力を別途実装
  • 速度が無限に上がる: Mathf.Clamp か Rigidbody の velocity.magnitude 制限を入れる
  • FixedUpdate と Update の使い分け: 物理は FixedUpdate、入力 / 表示は Update が原則
  • 機首がいつまでも傾いたまま: Quaternion 補間で水平に戻すロジックを追加(auto-trim)
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. スクリプトの作成と実行
  2. C# のクラス一覧
  3. シーンの移動方法
  4. オブジェクトの移動・回転
  5. キーボードの入力値を受け取る
  6. オブジェクトの取得とコンポーネントの取得
  7. 衝突時の処理
  8. Webページを開く
  9. コンポーネントの取得
  10. 処理を一定時間待つ
  11. コンソールへのログ出力方法
  12. 飛行機の加速と減速
  13. ジェットエンジンのエフェクトとオーディオ