DCS World mod独立航电编程

Written By CorsairCat
Email to contactus@corsaircat.com if you have question
Specail Thanks to @Nero
这是一份开发独立舱内航电的文档(非官方)
这份东西不是翻译稿,全部是基于我对代码和mod的理解
当前版本0.3.0,暂时还没写完
遵循 CC BY-NC-SA 4.0 协议

前言

写这份东西是因为我发现中文版本的mod制作说明存在缺失,同时我对于国内的mod制作环境感到失望。
这份东西算是一个给后来的DCS World mod开发者的小礼物。

在开始之前

首先请各位在看这份之前对于mod有基本的理解(会套官方的航电,比如FC3)。所以在这里我不会讨论包含建模和如何套壳,如何改SFM气动的话题。这里我主要会讲如何制作一个脱离官方模组的完全独立的航电系统(具体可以参考社区的A4-E模组)。
注意:很多SDK是不对非第三方开发的,作为mod开发者,只能使用DCS的Lua脚本引擎提供的很有限的功能。但就目前已知的基本上可以实现绝大多数航电控制。但是注意以下两个内容为完全无法控制:无线电通信和闭路光学观瞄

牢记以下内容


一、 总览·加载逻辑

1. entry.lua

首先加载时候是走entry.lua文件,其中注意下面这行

    make_flyable('YourPlaneName', current_mod_path..'/Cockpit/Scripts/', FM, current_mod_path..'/comm.lua')

其中包含四个参数,第一个是飞机名称,第二个是座舱的加载文件夹,第三个是默认调用的飞行模拟模型,最后一个是基础的通信模型

2. device_init.lua

a. MainPanel 仪表台

    MainPanel = {"ccMainPanel",LockOn_Options.script_path.."mainpanel_init.lua"}

b. Creators 航电设备

    creators  = {}
    creators[devices.ELECTRIC_SYSTEM] ={"avSimpleElectricSystem",LockOn_Options.script_path.."Systems/electric_system.lua"}
 主要设备类型

c. Indicators 显示屏设备

indicators = {}
indicators[#indicators + 1] = {"ccIndicator", LockOn_Options.script_path.."MFD/Indicator/init.lua",nil,{{"main_screen_center","main_screen_down","main_screen_right"}}}

3. mainpanel.lua

a. 座舱内模型

    shape_name          = "Cockpit-EDM-File-Name"
    is_EDM              = true
    new_model_format    = true

b. 座舱内动画声明

    Canopy                  = CreateGauge()
    Canopy.arg_number       = 1
    Canopy.input            = {0,1}
    Canopy.output           = {0,1}
    Canopy.parameter_name   = "Canopy_Anima"

4. clickable.lua 可点击描述


二、 总览·动画渲染

注意,所有动画都需要arg based animation 支持,此处不做详细论述
特别注意,由于内外有两份座舱,外部模型中的arg114动画为使外部舱内消失

1. 舱外动画

a. 关于在自主驾驶时如何反馈到外部动画以及获取外部动画位置

第一个参数为动画arg号,第二个值为设置到的状态

2. 舱内动画(不含屏幕)

a. 关于舱内动画注册

    Canopy                  = CreateGauge("parameter")
    Canopy.arg_number       = 1
    Canopy.input            = {0,1}
    Canopy.output           = {0,1}
    Canopy.parameter_name   = "Canopy"

b. 如何绘制动画

    a = get_param_handle("LandingGearLevel") 
    a:set(value)
    a:get() 

c. 注册中的input和output


三、总览·获取飞行器外部参数


四、航电设备·关于avLuaDevice

1. 这里从一个标准device的脚本开始

    -- 获取脚本本身设备
    local Device = GetSelf()

    -- 刷新函数间隔设置
    local update_time_step = 0.02
    make_default_activity(update_time_step)

    function post_initialize()
        --默认初始化函数
    end

    Device:listen_command(KeyCommand)

    function SetCommand(command,value)
        --对listen_command的处理函数
    end

    function update()
        --内置刷新函数
    end

2. 关于初始化的问题

    local birth = LockOn_Options.init_conditions.birth_place
    if birth=="GROUND_HOT" then
        --地面热车
    elseif birth=="AIR_HOT" then
        --空中出生
    elseif birth=="GROUND_COLD" then
        --地面冷舱
    end

五、航电设备·关于avSimpleElectricSystem

1. 概述

2. 设备内置函数

注意,这部分内容来源于一个较早的mod样例

    local Device = GetSelf() 
    Device:Device_Function()

a. 电力系统内置初始化函数

    左发发电机(单引擎请只启用这个)
    AC_Generator_1_on(true/false)

    右发发电机
    AC_Generator_2_on(true/false)

    电池组(推荐启用)
    DC_Battery_on(true/false)

b. 电力系统内置监测函数

    交流总线
    get_AC_Bus_1_voltage() -- 左发运转正常且启用左发电机时返回115
    get_AC_Bus_2_voltage() -- 右发运转正常且启用右发电机时返回115

    直流总线
    get_DC_Bus_1_voltage() -- 左发总线有115或电池开关打开时返回28
    get_DC_Bus_2_voltage() -- 右发总线有115或电池开关打开时返回28

c. 注意事项

指令名称 指令编号
iCommandPowerOnOff 315
iCommandGroundPowerDC 704
iCommandGroundPowerDC_Cover 705
iCommandPowerBattery1 706
iCommandPowerBattery1_Cover 707
iCommandPowerBattery2 708
iCommandPowerBattery2_Cover 709
iCommandGroundPowerAC 710
iCommandPowerGeneratorLeft 711
iCommandPowerGeneratorRight 712
iCommandElectricalPowerInverter 713
iCommandAPUGeneratorPower 1071
iCommandBatteryPower 1073
iCommandElectricalPowerInverterSTBY 1074
iCommandElectricalPowerInverterOFF 1075
iCommandElectricalPowerInverterTEST 1076

d. 关于iCommand指令


六、航电设备·关于avSimpleWeaponSystem

1. 概述

2. 内置函数

函数 作用
drop_chaff() 抛洒箔条
drop_flare() 抛洒红外干扰弹
emergency_jettison() 紧急抛离(效果未验证)
emergency_jettison_rack() 紧急抛离挂架(效果未验证)
get_chaff_count() 获取箔条数量
get_ECM_status() 获取ECM干扰器状态(未实验)
get_flare_count() 获取干扰弹数量
get_station_info() 获取挂架信息(返回为一张表)
get_target_range() 获取目标距离
get_target_span() 获取目标宽度
get_weapon_count() 获取挂架上武器数量(部分武器为单挂架多个)
launch_station() 发射武器(需要先选中挂架)
select_station() 选中挂架()
set_ECM_status() 设置ECM干扰器状态
set_target_range() 设置目标距离
set_target_span() 设置目标宽度

3. 关于武器发射

4. 获取挂载信息

5. 关于红外导弹

    -- 获取锁定状态
    -- 是否锁定
    local ir_missile_lock_status = get_param_handle("WS_IR_MISSILE_LOCK")
    -- 锁定的目标的高程和方向
    local ir_missile_target_az = get_param_handle("WS_IR_MISSILE_TARGET_AZIMUTH")
    local ir_missile_target_el = get_param_handle("WS_IR_MISSILE_TARGET_ELEVATION")

    -- 设置搜索方向
    -- 方位角
    local ir_missile_desire_az = get_param_handle("WS_IR_MISSILE_SEEKER_DESIRED_AZIMUTH")
    -- 高程
    local ir_missile_desire_el = get_param_handle("WS_IR_MISSILE_SEEKER_DESIRED_ELEVATION")

附录