タイトル: Aircraft
SEOタイトル: Unity Standard Assets の Aircraft(航空機)プレハブと現代の代替アセット
| この記事の要点 |
|
Aircraft プレハブとは
Unity の Standard Assets という公式サンプル集には、Vehicles カテゴリの中に Aircraft(航空機)のサンプルが含まれていました。具体的には以下のフォルダ構造で提供されていました。
Standard Assets/
├─ Vehicles/
│ ├─ Aircraft/
│ │ ├─ Prefabs/
│ │ │ └─ AircraftJet.prefab
│ │ ├─ Scripts/
│ │ │ ├─ AeroplaneController.cs
│ │ │ ├─ AeroplaneAudio.cs
│ │ │ └─ AeroplaneUserControl4Axis.cs
│ │ ├─ Models/
│ │ └─ Sounds/
│ └─ Car/
└─ ...
このプレハブは Rigidbody ベースのジェット機モデルで、キーボードで操縦できる小規模なサンプルゲームとして付属していました。
Aircraft の機能
| 機能 | 挙動 / 実装 |
|---|---|
| 4 軸操作 | Pitch(前後傾き)/ Yaw(旋回)/ Roll(左右傾き)/ Throttle(スロットル) |
| 揚力モデル | 速度に応じた揚力ベクトルを Rigidbody.AddForce で印加 |
| 抗力 (Drag) | 速度の二乗に比例する空気抵抗 |
| 失速 (Stall) | 低速+高仰角で揚力激減 |
| オーディオ | エンジン音のピッチ / 音量をスロットル / 速度で変調 |
| カメラ | SmoothFollow / FreeLookCam で機体追従 |
Standard Assets 廃止の経緯
Unity Technologies は2019 年 3 月の Unity 2019.3 以降、Standard Assets を公式エンジン同梱から外しました。
- 長年メンテナンスされず、新しい URP / HDRP に対応していなかった
- サンプルとしての役目は Unity Learn や Asset Store の公式パッケージへ移行
- 2021 年以降の Asset Store からも Standard Assets パッケージは削除済み
古いプロジェクトをアップグレードする際に NamespaceConflict / missing reference が大量発生する原因にもなっていたため、撤去は妥当な判断と言えます。
現代の代替手段
1. Vehicle Physics Pro (有料)
地上車両がメインですが、Aerodynamics 機能で航空機・ヘリも扱えます。CarX 系のリアルな物理が必要なときに。
2. Aircraft Physics (Asset Store)
翼面 / 舵面 / エンジンを Component として配置する設計で、リアリスティックな飛行モデルを比較的手軽に組めます。フライトシミュレータ寄り。
3. SimplePlanePhysics / Arcade Flying
アーケード寄りで、ゲーム的な軽快な操縦感を求める場合に。揚力をシンプルに「速度に比例して上向き」とだけ計算するなど割り切った実装が多いです。
4. 公式 Visual Effect / Sample プロジェクト
Unity 公式の Karting Microgame や Tanks! サンプルが Vehicles 代替の学習用として配布されています。航空機専用のサンプルは現状ありませんが、構造の参考になります。
自前で実装する場合の最小コード
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class SimpleAircraft : MonoBehaviour
{
[Header("Engine")]
public float maxThrust = 5000f;
public float throttle;
[Header("Aerodynamics")]
public float liftCoefficient = 0.5f;
public float dragCoefficient = 0.05f;
public float wingArea = 16f;
public float airDensity = 1.225f;
[Header("Control")]
public float pitchTorque = 200f;
public float rollTorque = 200f;
public float yawTorque = 100f;
Rigidbody rb;
void Awake() { rb = GetComponent(); }
void Update()
{
throttle = Mathf.Clamp01(throttle + Input.GetAxis("Vertical") * Time.deltaTime);
}
void FixedUpdate()
{
// 1. 推力(機首方向)
rb.AddForce(transform.forward * maxThrust * throttle);
// 2. 揚力(速度に比例する成分を上向きに)
float speed = rb.linearVelocity.magnitude;
float lift = 0.5f * airDensity * speed * speed * wingArea * liftCoefficient;
rb.AddForce(transform.up * lift);
// 3. 抗力(速度反対方向)
Vector3 drag = -rb.linearVelocity.normalized * (0.5f * airDensity * speed * speed * wingArea * dragCoefficient);
rb.AddForce(drag);
// 4. 操作トルク
float pitch = -Input.GetAxis("Mouse Y");
float roll = -Input.GetAxis("Horizontal");
float yaw = Input.GetAxis("Mouse X");
rb.AddRelativeTorque(new Vector3(pitch * pitchTorque, yaw * yawTorque, roll * rollTorque));
}
}
上記はリアル志向ではなくゲーム的な近似ですが、出発点としては機能します。失速や横滑り、誘導抵抗まで再現するならアセットを使うか、Aerospace 系の論文を参照してください。
Wheel Collider と着陸装置
航空機の着陸装置は車と同じく Wheel Collider で組めます。ジェット機の主脚 2 + 前脚 1 / 後脚 1 の構成にすると、滑走路の上を転がる動作・着陸時のバウンドも自然になります。
マルチプレイ対応
- Mirror / Netcode for GameObjects で位置同期
- Rigidbody の 動きを Authority 側だけが計算 → 他クライアントには補間するのが基本
- レイテンシ補償のためクライアント側予測とサーバ側照合の二重実装が必要
- フライトシム系は地形がデカいので、World Streaming も併用
FAQ
Q: 古いプロジェクトから Standard Assets の AircraftJet をコピーすればまだ使えますか?
A: 動かすことは可能ですが、Built-in Render Pipeline 前提のシェーダで URP / HDRP に持ち込むとピンクになります。マテリアルを差し替えれば動きますが、新規プロジェクトでは別アセットの利用を推奨します。
Q: 旋回中に勝手に高度が下がるのを防ぎたい
A: バンク角に応じて Pitch を自動補正(コーディネーテッドターン)するか、揚力に「重力相殺項」を加える調整が必要です。リアル機の操縦操作(バンクと同時にピッチアップ)を再現する形が一般的です。
Q: ヘリコプターも実装できますか?
A: 同様に Rigidbody + ForceAtPosition で「ローター中心からの揚力」を与えれば近似できます。ヘリ専用アセット(Heli Physics 等)を使うほうが楽です。