第二章     建立一个新单位

 

首先我以建立一个新单位——灰熊坦克为例,来讲解SAGE基本代码的结构和相互调用规律。之所以要以灰熊为例,主要是因为这个单位没有什么特殊功能,基本上可以复制原版的现成代码,所以比较容易讲解清楚。

1、   建立单位代码

比较特别的是,SAGEObject.ini比较自由,你可以将灰熊的定义代码写在已有的那些Object.ini里,例如AmericaVehicle.ini,也可以单独建立一个全新的GrizzlyTank.ini来单独储存灰熊定义代码。理论上我比较推荐后者,因为这样方便今后迅速找到这个单位并修改其代码和功能,避免了TS里在RULES里翻来覆去地查找一个东西的烦琐。在编写代码的过程中特别要注意End,很多新手最容易犯的错误就是漏掉End,导致游戏无法正确识别函数而报错。

 

; 灰熊坦克

Object   MTNK

 

  ;============视觉、图像部分===========

  SelectPortrait          = HEAD122_MTNK                                        选取该单位时界面上显示的大头像

  ButtonImage             = ICON64_MTNK                                      生产该单位时旋转时钟图标的图像

 

  UpgradeCameo1           = Upgrade_SyntheticalFuel                    该单位具有的可升级科技项目图标,最多有5个,依次排列在单位大头像的右侧和下侧共5个格子里

 

  Draw = W3DTankDraw ModuleTag_01                                                 模型绘制模块

    OkToChangeModelColor  = Yes                                                      是否将模型里凡是以HouseColor%02d命名的模型快转换成所属色

 

    DefaultConditionState                                                                       默认状态时的模型规则,通常可以理解为初生状态

      Model               = MTNK                                                     调用哪个W3D来显示其图像,需要自己用3DMAX来画这个模型,今后再讲如何画W3D模型

      Turret              = Turret                                                       炮塔对应名称为“Turret”的模型块或骨骼点

      WeaponFireFXBone    = PRIMARY Muzzle                                主武器炮口特效产生位置对应名称为“Muzzle%02d”的模型块或骨骼点

      WeaponRecoilBone    = PRIMARY Barrel                                   主武器炮管滑膛部分对应名称为“Barrel%02d”的模型块或骨骼点

      WeaponMuzzleFlash   = PRIMARY Muzzle                                 主武器炮口闪光产生位置对应名称为“Muzzle%02d”的模型块或骨骼点

      WeaponLaunchBone    = PRIMARY Muzzle                               主武器开火点位置对应名称为“Muzzle%02d”的模型块或骨骼点

    End

 

    ConditionState = REALLYDAMAGED                                                破损状态时的模型规则,由于已经写了默认状态,因此其他状态里凡是和默认状态相同的规则可以略掉不写,

      Model               = MTNK_D                                                游戏平台会自动从默认状态里提取规则配给这个状态使用

    End

 

    ConditionState = RUBBLE                                                                 尸体/残骸状态时的模型规则,同样可以简略

      Model               = MTNK_D

    End

 

    TrackMarks            = EXTnkTrack.tga                                      坦克在地面上开过后将留下什么样的履带印迹贴图

  End

 

;--------------------------------------------------------------------------------------------------

 

 

  ;============基本属性定义部分===========

  DisplayName             = VECHILE:MTNK                                     鼠标悬停到该单位上时,显示的单位名称,需要CSF翻译

  Side                    = GDI                                                         无实际作用,仅仅为WB分类成列时作为依据,参数可以随便乱写

  EditorSorting           = VEHICLE                                                   同上,作为WB的又一个分类成列依据,但参数不能随便乱写

  TransportSlotCount      = 3                                                               被装载时需要占用的空间量

  VisionRange             = 90                                                           视野范围,只有进入了该单位视野范围的敌人才会引起该单位主动开火

  ShroudClearingRange     = 90                                                          能揭开黑雾和灰雾的范围

  MaxSimultaneousOfType   = 16                                                         最大名额上限,即任何一方,该单位最多只能同时拥有16个,类似TS的人口限制

  MaxSimultaneousLinkKey  = MTNK                                                    使用哪个人口空间,可以随意设置参数,通常只在特别要求该单位和别的单位共享同一个人口空间时才使用

  BuildCost               = 700                                                          造价,这个不用多说

  BuildTime               = 7                                                              生产时间,单位为秒

  ExperienceValue         = 70  140  210  280                               被敌人杀死后送给敌人多少经验值,当自己为新兵、老兵、精英、王牌时分别送出70140210280

  ExperienceRequired      = 0   210  420  630                               需要积累多少经验值才能达到对应级别,新兵级需要0点,老兵级需要210,精英级需要420,王牌级需要630

  IsTrainable             = Yes                                                            是否可以训练,仅当参数为Yes时,ExperienceRequired语句才有意义

  CrusherLevel            = 2                                                             碾压级别,通常坦克都填2,表示自己属于2级碾压者,可碾压小于2级的被碾压者

  CrushableLevel          = 2                                                              被碾压级别,通常坦克都填2,表示自己属于2级被碾压者,凡是碾压级别大于2的碾压者都能碾压它

  CommandSet              = GeneralUnitCommandSet                    建造栏/操作栏界面使用哪一套布局,GeneralUnitCommandSet需要在CommandSet.ini里进行编写

 

  WeaponSet                                                                                          武器系统,类似模型绘制模块,可以利用Conditions来让单位在不同条件下使用不同的武器

    Conditions            = None

    Weapon                = PRIMARY GrizzlyGun                           主武器为哪个武器,GrizzlyGun需要在Weapon.ini里进行编写

  End

 

  ArmorSet                                                                                              护甲系统,和武器系统差不多的设置原理

    Conditions            = None

    Armor                 = TankArmor                                              使用哪个护甲类型,护甲设置比较复杂,所以我们暂时借用一个现成的护甲,今后再着重讲解特殊护甲的之作

    DamageFX              = TankDamageFX                                    被攻击时产生什么样的受损特效(感觉是个没啥意义的花瓶功能,是把游戏变卡的重要途径)

  End

 

  Prerequisites                                                                                        建造前提系统,可以用物体作为建造前提(不光是建筑,也可以是坦克、士兵、将军技能等)

    Object                = GAWEAP                                                 可以做成与、或逻辑,但尚不知道能不能做出非逻辑

  End

;--------------------------------------------------------------------------------------------------

 

  ;============单位语音、音效定义部分===========

  VoiceSelect             = GrizzlyTankSelect                                     选取时的汇报音

  VoiceMove               = GrizzlyTankMove                                   移动时的汇报音

  VoiceGuard              = GrizzlyTankMove                                    自由警戒时的汇报音

  VoiceAttack             = GrizzlyTankAttack                                     攻击时的汇报音

  SoundMoveLoop           = GrizzlyTankMoveLoop                         正常移动时发出的车辆运行音效,可做成循环音效,大概就是TS里坦克启动时会发出的发动机轰鸣声

  SoundMoveLoopDamaged    = GrizzlyTankMoveLoop                      受损后移动时发出的车辆运行音效

 

  UnitSpecificSounds                                                                              特殊语音及音效

    VoiceCreate           = NoSound                                                 建造完毕后的汇报音,让我想起了基洛夫经典的“Kirov Reporting”

    TurretMoveStart       = NoSound                                                  炮塔开始旋转时的音效,SAGE特有的功能,不过没啥意思

    TurretMoveLoop        = TurretMoveLoop                                    炮塔持续旋转时的音效

    VoiceCrush            = NoSound                                                碾压别人时发出的音效

    VoiceEnter            = GrizzlyTankMove                                     装载时的汇报音

  End

;--------------------------------------------------------------------------------------------------

 

 

  ;============基本属性定义部分===========

  RadarPriority = UNIT                                                                            雷达里的标记类型,不同的标记有不同的优先权(没搞懂啥意思,难道优先权越高就越先被显示不成?)

  KindOf = PRELOAD SELECTABLE CAN_ATTACK ATTACK_NEEDS_LINE_OF_SIGHT CAN_CAST_REFLECTIONS VEHICLE INFANTRY SCORE

                                                                                                               属性标签,这是SAGE里的一大重点,放到后面来讲,先吊个胃口

 

  Body = ActiveBody ModuleTag_02                                                       生命值模块,定义了生命值上限、初生时的生命值以及被封冻武器封锁的准备时间和持续时间

    MaxHealth               = 300                                                     生命值上限

    InitialHealth           = 300                                                           初生时的生命值,又一个没啥意思的语句,一般都设置得和上限相同,除非你有特别邪恶的目的

    SubdualDamageCap        = 310                                                  被封冻武器封锁的准备时间,其实不叫时间,应该说封冻武器必须“打”够这么多点“血”才能封冻住它

    SubdualDamageHealRate   = 500                                                   下面这两句没测试出啥意思,一般都填成50050

    SubdualDamageHealAmount = 50

  End

;--------------------------------------------------------------------------------------------------

 

  ;============功能模块定义部分===========

  Behavior = AIUpdateInterface ModuleTag_03                                      智能模块,决定该单位在不受玩家人工控制时能自主干些什么事

    Turret                                                                                                炮塔智能定义

      TurretTurnRate = 120                                                                    自动或手动攻击时炮塔的旋转速度,单位为度每秒

      ControlledWeaponSlots = PRIMARY                                             手动攻击时发射哪个武器,如果同时并排上PRIMARYSECONDARYTERTIARY则表示多种武器同时开火

    End

    AutoAcquireEnemiesWhenIdle = Yes                                                空闲时是否自动迎击敌人,当然前提是敌人必须进入它的视野范围

  End

 

  Behavior = PhysicsBehavior ModuleTag_04                                         物理特性模块,定义了单位的一些物理引擎上能够表现出来的属性

    Mass = 40.0                                                                                      重量,功能不太明显但非常重要的一个语句,今后会详细说明其作用

  End

 

  Behavior = DestroyDie ModuleTag_07                                                 死亡方式模块 - 消失式死亡,即被杀后将本体的模型删除,安静得什么特效都没有

    DeathTypes = NONE +CRUSHED +SPLATTED                                当被带有这些DeathTypes类型的武器杀死时引发这种死亡方式,NONE表示无,加号表示“逻辑或”

  End

 

  Behavior = FXListDie ModuleTag_08                                                   死亡方式模块 - 特效式死亡,即被杀后引发一项FXList来产生诸如爆炸烟雾的特效

    DeathTypes = NONE +CRUSHED +SPLATTED                                不同的死亡方式模块可以具有相同的死亡方式,这样的结果是,同时引发两种死亡方式,产生叠加效果

    DeathFX = FX_CarCrush                                                                  引发哪一个的FXList

  End

 

  Behavior = CreateObjectDie ModuleTag_09                                         死亡方式模块 - OCL式死亡,即被杀后在原地刷出一系列物体,可以刷碎片甚至另一个活单位(刷活单位今后再讲)

    DeathTypes = NONE +CRUSHED +SPLATTED                               

    CreationList = OCL_CrusaderTank_CrushEffect                              根据哪个OCL项目的内容来刷物体

  End

 

  Behavior = CreateCrateDie ModuleTag_10                                          死亡方式模块 爆箱子式死亡,即被杀后在原地爆出一个垃圾箱,这跟OCL式死亡表现相似,但实际上有区别

    CrateData = SalvageCrateData                                                          根据哪个垃圾箱规律来爆箱

  End

 

  Behavior = SlowDeathBehavior ModuleTag_11                                    延迟死亡模块,使该单位被杀后延迟一段时间再死,利用这段时间来做“死亡过程”的动作

    DeathTypes = ALL -CRUSHED –SPLATTED                                     ALL表示所有死亡类型,减号表示“逻辑非”

    ProbabilityModifier = 25                                                                    引发几率,单位为百分数,最大为100,即表示100%

    DestructionDelay = 2000                                                                  延迟死亡时间,单位为毫秒,2000毫秒=2

    DestructionDelayVariance = 1000                                                     延迟时间的随机偏差为1000毫秒,使得实际的延迟时间从1秒到3秒之间随机出现

    OCL = FINAL    OCL_MTNKDebris                                                死亡动作完成后刷出什么东西来,作用和CreateObjectDie相同,但主要用来刷残骸,你也可以做点邪恶的构思

    FX  = FINAL    FX_BattleMasterExplosionOneFinal                      死亡动作完成后引发什么FX特效,作用和FXListDie相同

  End

 

  Behavior = TransitionDamageFX ModuleTag_12                                  受损后的冒烟效果,以及从正常状态变成破损状态的破裂特效

    ReallyDamagedParticleSystem1 = Bone:Smoke RandomBone:Yes PSys:SmokeSmallContinuous01       可定义冒烟点对应W3D里哪些关节点,以及定义烟雾为哪个粒子系统

    ReallyDamagedFXList1 = Loc: X:0 Y:0 Z:0 FXList:FX_BattleMasterDamageTransition                             破裂特效的产生位置,及定义使用哪个FXList作为破裂特效

  End

 

  Behavior = FlammableUpdate ModuleTag_13                                       被火焰类武器攻击后的持续扣血控制模块

    AflameDuration = 5000                                                                     持续扣血的维持时间,单位为毫秒,5000毫秒=5

    AflameDamageAmount = 3                                                                每次扣除多少生命值

    AflameDamageDelay = 500                                                               相邻两次扣除生命值之间的间隔时间,可推算出整个模块为持续5秒、扣血10次,共扣除30

  End

 

  Behavior = LocomotorSetUpgrade ModuleTag_14                               运动系统升级模块

    TriggeredBy = Upgrade_SyntheticalFuel                                          当获得了Upgrade_SyntheticalFuel后,该单位的运动系统将发生更换

  End                                                                                                      Upgrade_SyntheticalFuel需要在Upgrade.ini里进行编写

 

  Locomotor = SET_NORMAL               GrizzlyTankLocomotor          初始/默认状态下的运动系统

  Locomotor = SET_NORMAL_UPGRADED  GrizzlyTankSFLocomotor       升级运动系统后更换为哪个运动系统,这两个运动系统需要在Locomoto.ini里进行编写

  ; 特别需要注意的是,Locomotor语句必须写在所有功能模块之后,否则很容易引起报错

;--------------------------------------------------------------------------------------------------

 

  ;============形体体积及阴影定义===========

  Geometry = BOX                                                                                  形体类型为长方体

  GeometryMajorRadius = 15.0                                                               半长度(从物体中心到头或尾的距离,即长方体长度的一半)

  GeometryMinorRadius = 10.0                                                              半宽度(从物体中心到左侧或右侧的距离,即长方体宽度度的一半)

  GeometryHeight = 13                                                                           全高度(从物体底部到顶部的距离)

  GeometryIsSmall = Yes                                                                        是否为小型形体,没搞懂有啥特殊作用

  Shadow = SHADOW_VOLUME                                                            阴影类型为3DMAX里最基础、最粗劣的表现形式——“体积阴影”,但最节省显卡

  ShadowSizeX = 45                                                                               阴影尺寸,单位为像素,似乎是个没有实际作用的垃圾语句

;--------------------------------------------------------------------------------------------------

 

End

 

到这里,一个新单位的代码才刚刚具备雏形,因为我们还需要给它做很多相关的系统功能,例如武器系统、护甲系统、运动系统、操作栏界面、升级项目等。

 

2、   建立建造栏/操作界面

SAGE除公用界面外,每一个物体都具有一个独立的建造栏/操作界面,例如ZH里这个界面上有14个按钮名额,CNC34个。你可以将一些特定的按钮放到你所想要的位置上去,形成一套界面:

首先我们必须要清楚,一个单位需要什么样的界面布局,换句话说,就是指这个单位的界面上需要有些哪些按钮,各是什么功能,所以我们需要首先策划好界面布局。以这里的灰熊为例,由于它没有什么特别的功能,因此只需要具备3个基本的动作按钮就足够了,分别为“范围警戒”、“移动攻击”、“停止”。由于这3个按钮是原版就有的基本按钮,因此暂时不专门讲解按钮的做法,今后会着重讲解。

界面布局的14个按钮位置分别如下:

 

1

3

5

7

9

11

13

2

4

6

8

10

12

14

 

CommandSet GeneralUnitCommandSet

 12 = Command_AttackMove                                                                  移动攻击按钮,它的摆放位置在第12号空位上

 13 = Command_Guard                                                                           范围警戒按钮,它的摆放位置在第13号空位上

 14 = Command_Stop                                                                              停止按钮,它的摆放位置在第14号空位上

End

 

3、   建立武器系统

TS类似,武器系统也包括伤害值、打击范围、伤害类型(TS里称为弹头比率)、误差范围、射程、攻速、炮口动画等信息,而SAGETS的基础上还增加了一些新的功能,并把以前的某些宏观功能替换成了微观功能。打开Weapon.ini,在最后面添加这个武器:

 

Weapon   GrizzlyGun                                                                          和刚才定义单位代码一样,武器系统的段首字同样需要定义函数类型和函数名

  PrimaryDamage           = 105.0                                                     直接伤害值,SAGE还有一个SecondaryDamageSecondaryDamageRadius,表示辅助伤害值及其范围

  PrimaryDamageRadius     = 5.0                                                         直接打击范围

  ScatterRadiusVsInfantry    = 10.0                                                      对付步兵时的误差上限,当攻击距离越远时,误差越明显,达到极限射程时误差也达到极限值10

  AttackRange              = 150.0                                                    射程上限

  MinimumAttackRange      = 20.0                                                      射程下限

  MinTargetPitch            = -15                                                        能锁定到目标的最大下俯角度,通常是站在山上打山下时需要考虑,超出角度范围则不能开火

  MaxTargetPitch            = 15                                                         能锁定到目标的最大上仰角度,通常是站在山下打山上时需要考虑,超出角度范围则不能开火

  DamageType              = ARMOR_PIERCING                             伤害类型,跟TS的弹头比率作用差不多,但原理正好相反,这个也是SAGE的难点之一,今后再讲

  DeathType                = NORMAL                                              死亡类型,需要根据被杀单位的死亡方式来决定被这个武器杀死后将产生什么效果或死亡动作

  WeaponSpeed             = 800                                                     射弹体的出膛初速度

  WeaponRecoil             = 5                                                          后坐力大小,SAGE的特色,每开一炮都能使车身向后晃动以模拟后坐力效果

  ProjectileObject            = NormalShell                                         射弹体,前面说,SAGE把射弹体也视为Object,因此你甚至可以将一个活单位发射出去(仿人间大炮?)

  FireFX                    = WeaponFX_GenericTankGunNoTracerSmall            炮口特效

  ProjectileDetonationFX      = WeaponFX_GenericTankShellDetonation                射弹体引爆时的特效,作用类似于TS的弹头爆炸动画

FireSound                 = GrizzlyTankFiring                                                     开炮时的声音

  RadiusDamageAffects      = ALLIES ENEMIES NEUTRALS             该武器的伤害范围对什么目标有效,ALLIES=本方或盟友,ENEMIES=敌人,NEUTRALS=中立者

  DelayBetweenShots        = 2000                                                    开炮间隔时间,类似于TSROF

  ClipSize                   = 0                                                          一个弹夹里的弹药总数,SAGE的特殊功能,可以模拟换弹夹效果,0表示无穷大,即不需要换弹夹

  ClipReloadTime            = 0                                                          换弹夹时间,通常之作枪械武器时才用,可模拟出CS里换弹夹的动作,0表示瞬间换弹夹

  ProjectileCollidesWith       = STRUCTURES WALLS                      射弹体会撞到什么东西,STRUCTURES=建筑、WALLS=围墙,这里的参数是类型标签

End

 

接下来还要继续为这个武器制作一个射弹体,即NormalShell,特效和语音暂时不做也没关系,我们可以暂时留空(随便写一个参数,游戏不会报错的),或临时借用原版现有的来用,今后再添加或替换也不迟。制作射弹体的方法和前面制作灰熊坦克的过程基本相似,因为它们都属于Object,你也可以专门为它建立一个INI来存放这段代码。

 

Object NormalShell

 

  ;============视觉、图像部分===========

  Draw = W3DModelDraw ModuleTag_01

    ConditionState = NONE                                                                    作用相当于DefaultConditionState

      Model = NormalShell

    End

  End

;--------------------------------------------------------------------------------------------------

 

  ;============基本属性定义部分===========

  DisplayName       = OBJECT:TankShell

  EditorSorting       = SYSTEM

  VisionRange        = 0.0                                                                 射弹体通常不应该具有视野范围及探路范围,所以弄成0      

 

ArmorSet

    Armor           = ProjectileArmor                                                 射弹体也可以被某种武器杀死,这是SAGE的特色,同时也是TS想都不敢想的特色

  End

 

;--------------------------------------------------------------------------------------------------

 

  ;============功能模块定义部分===========

  KindOf = PROJECTILE                                                                        被贴上了PROJECTILE(射弹体)标签的物体,以任何方式死亡都不会报告Unit Lost

  Body = ActiveBody ModuleTag_02

    MaxHealth       = 100.0                                                                如同前面所说,射弹体是可以被杀死的,所以需要给它设置生命值

    InitialHealth      = 100.0

  End

 

  Behavior = DestroyDie ModuleTag_03                                                 没有DeathType语句,则该死亡方式默认为DeathType=ALL,即任何方式死亡都将导致这个模块指定的结果

  End

   

  Behavior = DumbProjectileBehavior ModuleTag_04                             贝赛尔曲线弹道逻辑,可以设置特殊的参数,使抛物线变成直线,这也是TS想都不敢想的平射炮

    FirstHeight = 0                                                                                  曲线上第一点的高度

    SecondHeight = 0                                                                             曲线上第二点的高度,由两个点可以控制一条贝赛尔曲线,两个点高度都为0则形成平射炮

    FirstPercentIndent = 33%                                                                 第一点的位置

    SecondPercentIndent = 66%                                                            第二点的位置,0%表示炮口,100%表示落点,中间值则介于炮口到落点之间的弹道上

    OrientToFlightPath  = Yes                                                                使射弹体朝向飞行轨迹,没测试过填No会导致什么结果,难道射弹体会乱飞?

    FlightPathAdjustDistPerSecond = 300                                              每秒种调整飞行轨迹多少像素,可以使飞行轨迹比较平滑

  End

 

  Behavior = PhysicsBehavior ModuleTag_05

    Mass = 0.01                                                                                      射弹体的重力一般设置为0.01,即“非常轻”

  End

 

  Scale = 0.95                                                                                         模型缩放比率为W3D原形的95%

  Geometry = Sphere                                                                              形体类型为球体

  GeometryIsSmall = Yes                                                                       

  GeometryMajorRadius = 1.0                                                                 球体只一个尺寸参数,即半径

;--------------------------------------------------------------------------------------------------

 

End

 

4、   建立升级项目

前面提到,灰熊坦克有一个切换运动系统的升级项目,因此现在我们需要在Upgrade.ini里来编写这个升级项目的代码:

 

Upgrade Upgrade_SyntheticalFuel

  DisplayName        = UPGRADE:SyntheticalFuel                             升级提示信息时屏幕上出现的文字,需要CSF翻译

  BuildTime           = 60                                                                   升级准备时间为60秒,其实可以把升级理解为“建造”,因此这个时间相当于建造时间

  BuildCost           = 3000                                                               确认此项升级需要花费的费用

  ButtonImage         = ICON64_SyntheticalFuel                               正在升级时,旋转时钟图标上的图像,关于图标图像的之作今后再仔细讲解

  ResearchSound      = NoSound                                                       确认此升级时的汇报音,暂时留空,今后再修改

End

 

5、   建立运动系统

通常来说,一个可移动的单位有一套运动系统就足够了,而这里的灰熊由于可以通过升级来替换运动系统,因此我们需要给它做两套运动系统,一套为初生的,另一套为升级之后的,打开Locomotor.ini写入以下这些内容:

 

Locomotor GrizzlyTankLocomotor                                                      初生时使用的运动系统

  Surfaces              = GROUND                                                    可进入的地形为,平地

  Speed                 = 45                                                              正常时跑速为每秒45像素

  SpeedDamaged          = 22                                                           破损时跑速为每秒22像素

  TurnRate              = 50                                                               正常时车身转向速度为每秒50度(注意,车身转向速度和炮塔转向速度不再是同一个概念,切记不要混淆)

  TurnRateDamaged       = 25                                                            破损时车身转向速度为每秒25

  Acceleration          = 40                                                                 正常时起步加速度为40像素每平方秒

  AccelerationDamaged   = 20                                                              破损时起步加速度为20像素每平方秒

  Braking               = 40                                                                刹车时加速度(减速速度)为40像素每平方秒

  MinTurnSpeed          = 0                                                               最小转向速度为0,不知道有啥特别的含义,一般都设置为0

  ZAxisBehavior         = NO_Z_MOTIVE_FORCE                            Z轴特性为“无纵方向动力”,因为是坦克,所以要保持贴地不能跑飞起来

  Appearance            = TREADS                                                    运动表现为“履带式”,凡是用这种方式的单位,可在视觉、图像部分设置履带贴图的滚动效果

  AccelerationPitchLimit = 5                                                                    突然加速时,最大前后倾覆角度为5度,模拟车辆加速或减速时的头/尾下压效果

  PitchStiffness = 0.05                                                                            下压效果坚硬程度,属于物理引擎的表象,带有点NFS8的味道,暂时先不要随意乱动

  RollStiffness = 0.025                                                                            侧身倾斜效果的坚硬程度,同上

  PitchDamping = 0.8                                                                              下压阻尼强度,使产生下压效果时不必一步到位,而是逐步震荡衰减知道最后稳定下来

  RollDamping = 0.3                                                                                侧倾阻尼强度,同上

  ForwardAccelerationPitchFactor = 0.5                                                  前向加速下压比率,同样带有强烈的NFS8味道,没测试出有什么特别的效果

  LateralAccelerationRollFactor = 0.33                                                    侧向加速倾斜比率,同上

End

 

Locomotor GrizzlyTankSFLocomotor                                                  升级之后切换成这套运动系统,对比前后两套可看出仅仅是跑速增加了而已,其他没变

  Surfaces              = GROUND                                                    因此这个切换运动系统的升级实际上可以理解为“跑速加快”

  Speed                 = 56

  SpeedDamaged          = 28

  TurnRate              = 50

  TurnRateDamaged       = 25

  Acceleration          = 40

  AccelerationDamaged   = 20

  Braking               = 40

  MinTurnSpeed          = 0

  ZAxisBehavior         = NO_Z_MOTIVE_FORCE

  Appearance            = TREADS

  AccelerationPitchLimit = 5

  PitchStiffness = 0.05

  RollStiffness = 0.025

  PitchDamping = 0.8

  RollDamping = 0.3

  ForwardAccelerationPitchFactor = 0.5

  LateralAccelerationRollFactor = 0.33

End

 

到此为止,一个完整的单位就算是建立完毕,除了一些相对麻烦切暂时不易讲解的语句,我们暂时借用了原版的参数外,其他必须要新做的代码都有这么几大篇,可见在SAGE上建立一个新单位是多么的复杂,希望MODER好好体会这5大步骤的内容。

或许性急的MODER在做好一个新单位后立刻就要到游戏里去测试这个单位的效果了,但是他们迫不及待地打开了游戏,却发现找不到任何一个地方可以生产这个新单位,于是在QQ上乱叫,“为什么我做的新单位不能被建造啊?”没办法,我只好让他们回过头去看第一章关于TSSAGE的第一条差别——建造方式了。不用我再多废口舌了吧,不知道原因的自己翻回去看。

 

6、   让新单位可以被建造出来

为了迅速说明问题的所在,我们来做个实验,让美国重工来生产灰熊坦克,首先我们要给美国重工的建造栏/操作界面添加一个新的建造键,用这个建造键来生产灰熊坦克,首先打开CommandButton.ini来编写这个新按钮的定义:

 

CommandButton Command_CreateMTNK                                          函数名可自己随意设置,只要能被CommandSet.ini正确调用即可,如果调用失败会导致致命报错

  Command               = UNIT_BUILD                                           按钮动作为“生产物体”

  Object                  = MTNK                                                      生产哪个物体,参数就是我们刚才定义的灰熊坦克MTNK,如果参数不正确,这个按钮将是灰色且不能点击

  TextLabel               = CONTROLBAR:CreateMTNK                   鼠标悬停到按钮上时就地显示的说明字段,需要CSF翻译

  ButtonImage            = ICON64_MTNK                                        按钮图标

  ButtonBorderType       = BUILD                                                      外框颜色类型为“生产类”,在原版里为蓝色

  DescriptLabel           = CONTROLBAR:ToolTipCreateMTNK        鼠标悬停到按钮上时,左下方信息框里显示的解说字段,需要CSF翻译

End

 

然后要在美国重工的界面布局里将这个按钮布置进去,特别注意,一个物体的界面上最多只能有14个按钮,假如原版已经占满了,我们就没地方可布置,那么就只能将原有的按钮去掉,将其位置空闲出来给这个按钮使用,打开CommandSet.ini,查找到AmericaWarFactoryCommandSet,其内容如下:

 

CommandSet AmericaWarFactoryCommandSet

  1  = Command_ConstructAmericaTankCrusader

  2  = Command_ConstructAmericaVehicleTomahawk

  3  = Command_ConstructAmericaVehicleHumvee

  4  = Command_ConstructAmericaVehicleMedic

  5  = Command_ConstructAmericaVehiclePaladin

  6  = Command_ConstructAmericaVehicleSentryDrone

  7  = Command_ConstructAmericaVehicleAvenger

  8  = Command_ConstructAmericaVehicleMicrowave

  9  = Command_UpgradeAmericaSentryDroneGun

  11 = Command_UpgradeAmericaTOWMissile

  13 = Command_SetRallyPoint

  14 = Command_Sell

End

 

仔细观察可见,原版已经布置好了13个按钮,唯独10号位置上尚没有被任何按钮占据,因此我们正好可以把建造灰熊坦克这个按钮布置到10号位置上去,修改后的内容如下:

 

CommandSet AmericaWarFactoryCommandSet

  1  = Command_ConstructAmericaTankCrusader

  2  = Command_ConstructAmericaVehicleTomahawk

  3  = Command_ConstructAmericaVehicleHumvee

  4  = Command_ConstructAmericaVehicleMedic

  5  = Command_ConstructAmericaVehiclePaladin

  6  = Command_ConstructAmericaVehicleSentryDrone

  7  = Command_ConstructAmericaVehicleAvenger

  8  = Command_ConstructAmericaVehicleMicrowave

  9  = Command_UpgradeAmericaSentryDroneGun

10 = Command_CreateMTNK                                                            将刚才我们制作的那个按钮的函数名调用进来,切记必须和CommandButton.ini里设置的函数名一致

  11 = Command_UpgradeAmericaTOWMissile                                      否则的话,游戏将发生致命报错,根本无法运行

  13 = Command_SetRallyPoint

  14 = Command_Sell

End

 

完成了这一系列设置之后,我们稍微修改一下灰熊的建造前提,以便使它在原版里能够被建造,即把Prerequisites(建造前提)里的GAWEAP更换为AmericaWarFactory,再到游戏里去测试,就能发现,美国重工可以生产这个单位了,将它建造出来看看,他的一系列功能是否都能达到你梦想中的要求。

关于某些人在之作代码之后报错,我教你们一个办法,用地图编辑器WorldBuilder(月光宝盒)可以帮助你查错,启动月光宝盒后,它将自动进行查错,并将凡是有错的地方汇报给你,位置可以精确到一个确切的行上,如果你的英语水平达到了国家4级,你肯定能看懂它都说了些什么内容。当然,用月光宝盒查错,更多的时候查出来的只是一些不痛不痒,可有可无的小缺陷,这些缺陷可能是调用声音失败、调用图像失败等,并不影响游戏的运行,唯独只有出现了Run Time Error致命错误的地方才说明是这个地方导致了游戏的致命错误。