6. 飞行建设系统
2026/4/14大约 4 分钟
飞行建设系统
飞行建设是让飞行模拟器从"单次体验"变成"长线游戏"的关键。玩家从一个飞行员起步,通过完成飞行任务赚取资金,购买更多飞机,开通更多航线,最终建设成一个航空帝国。本章实现这套经营建设系统。
本章你将学到
- 航空公司经营系统:资金、飞机、航线
- 机场建设:扩建跑道、机库、候机楼
- 航线管理:开通、暂停、优化航线
- 飞行任务系统:货运、客运、包机任务
- 声誉系统:准点率、服务质量影响收入
系统架构
核心数据结构
GDScript
## 飞机数据
class_name AircraftData
var aircraft_id: String
var model_name: String ## 型号名称(如 "Cessna 172")
var purchase_price: float ## 购买价格
var operating_cost_per_hour: float ## 每小时运营成本
var passenger_capacity: int ## 载客量(0表示货机)
var cargo_capacity: float ## 货运量(千克)
var max_range: float ## 最大航程(千米)
var cruise_speed: float ## 巡航速度(千米/小时)
var condition: float = 1.0 ## 飞机状况(0~1,影响故障率)
var total_flight_hours: float = 0.0 ## 总飞行小时数
## 计算一次飞行的运营成本
func calculate_flight_cost(distance_km: float) -> float:
var flight_hours := distance_km / cruise_speed
return operating_cost_per_hour * flight_hoursC
public class AircraftData
{
public string AircraftId;
public string ModelName;
public float PurchasePrice;
public float OperatingCostPerHour;
public int PassengerCapacity;
public float CargoCapacity;
public float MaxRange;
public float CruiseSpeed;
public float Condition = 1f;
public float TotalFlightHours = 0f;
public float CalculateFlightCost(float distanceKm)
{
float flightHours = distanceKm / CruiseSpeed;
return OperatingCostPerHour * flightHours;
}
}
public class RouteData
{
public string RouteId;
public string OriginAirport;
public string DestinationAirport;
public float DistanceKm;
public int DemandPassengers;
public float DemandCargo;
public float TicketPrice;
public float CargoRate;
public bool IsActive = false;
public float CalculateRevenue(AircraftData aircraft)
{
float passengerRevenue = Mathf.Min(aircraft.PassengerCapacity, DemandPassengers) * TicketPrice;
float cargoRevenue = Mathf.Min(aircraft.CargoCapacity, DemandCargo) * CargoRate;
return passengerRevenue + cargoRevenue;
}
}航空公司管理器
GDScript
extends Node
## 航空公司管理器 - 核心经营逻辑
class_name AirlineManager
var company_name: String = "我的航空"
var balance: float = 500000.0 ## 初始资金(50万)
var reputation: float = 0.5 ## 声誉(0~1)
var owned_aircraft: Array[AircraftData] = []
var active_routes: Array[RouteData] = []
var available_routes: Array[RouteData] = [] ## 可开通但未开通的航线
signal balance_changed(new_balance: float)
signal aircraft_purchased(aircraft: AircraftData)
signal route_opened(route: RouteData)
## 购买飞机
func purchase_aircraft(aircraft_data: AircraftData) -> bool:
if balance < aircraft_data.purchase_price:
return false ## 资金不足
balance -= aircraft_data.purchase_price
owned_aircraft.append(aircraft_data)
emit_signal("balance_changed", balance)
emit_signal("aircraft_purchased", aircraft_data)
return true
## 开通航线
func open_route(route: RouteData, assigned_aircraft: AircraftData) -> bool:
if not owned_aircraft.has(assigned_aircraft):
return false ## 没有这架飞机
if route.distance_km > assigned_aircraft.max_range:
return false ## 航程不够
route.is_active = true
active_routes.append(route)
emit_signal("route_opened", route)
return true
## 完成一次飞行后结算
func settle_flight(route: RouteData, aircraft: AircraftData, on_time: bool) -> void:
var revenue := route.calculate_revenue(aircraft)
var cost := aircraft.calculate_flight_cost(route.distance_km)
## 准点奖励/延误惩罚
if on_time:
revenue *= 1.1
reputation = minf(reputation + 0.01, 1.0)
else:
revenue *= 0.8
reputation = maxf(reputation - 0.02, 0.0)
## 声誉影响收入(声誉越高,旅客越愿意选择你)
revenue *= (0.5 + reputation * 0.5)
balance += revenue - cost
aircraft.total_flight_hours += route.distance_km / aircraft.cruise_speed
aircraft.condition -= 0.001 ## 飞行会磨损飞机
emit_signal("balance_changed", balance)C
using Godot;
using System.Collections.Generic;
public partial class AirlineManager : Node
{
public string CompanyName = "我的航空";
public float Balance { get; private set; } = 500000f;
public float Reputation { get; private set; } = 0.5f;
public List<AircraftData> OwnedAircraft { get; } = new();
public List<RouteData> ActiveRoutes { get; } = new();
[Signal] public delegate void BalanceChangedEventHandler(float newBalance);
[Signal] public delegate void AircraftPurchasedEventHandler();
[Signal] public delegate void RouteOpenedEventHandler();
public bool PurchaseAircraft(AircraftData aircraft)
{
if (Balance < aircraft.PurchasePrice) return false;
Balance -= aircraft.PurchasePrice;
OwnedAircraft.Add(aircraft);
EmitSignal(SignalName.BalanceChanged, Balance);
return true;
}
public bool OpenRoute(RouteData route, AircraftData aircraft)
{
if (!OwnedAircraft.Contains(aircraft)) return false;
if (route.DistanceKm > aircraft.MaxRange) return false;
route.IsActive = true;
ActiveRoutes.Add(route);
EmitSignal(SignalName.RouteOpened);
return true;
}
public void SettleFlight(RouteData route, AircraftData aircraft, bool onTime)
{
float revenue = route.CalculateRevenue(aircraft);
float cost = aircraft.CalculateFlightCost(route.DistanceKm);
if (onTime) { revenue *= 1.1f; Reputation = Mathf.Min(Reputation + 0.01f, 1f); }
else { revenue *= 0.8f; Reputation = Mathf.Max(Reputation - 0.02f, 0f); }
revenue *= 0.5f + Reputation * 0.5f;
Balance += revenue - cost;
aircraft.TotalFlightHours += route.DistanceKm / aircraft.CruiseSpeed;
aircraft.Condition -= 0.001f;
EmitSignal(SignalName.BalanceChanged, Balance);
}
}机场建设
玩家可以建设和升级自己的机场:
| 建设项目 | 费用 | 效果 |
|---|---|---|
| 延长跑道 | 200万 | 可以起降更大的飞机 |
| 新建机库 | 50万 | 可以停放更多飞机 |
| 扩建候机楼 | 100万 | 提升旅客容量,增加声誉 |
| 加油站升级 | 30万 | 降低燃油成本5% |
| 维修车间 | 80万 | 降低飞机维护成本20% |
| 雷达系统 | 150万 | 解锁恶劣天气飞行任务 |
飞机机队成长路线
下一步
飞行建设系统完成后,制作 驾驶舱仪表盘。
