设为首页收藏本站

红警DIY论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8203|回复: 2

【代码篇】红警3DIY---动态创建单位和守护单位

[复制链接]
发表于 2010-11-23 16:05:32 | 显示全部楼层 |阅读模式
本帖最后由 牧星 于 2011-6-26 23:58 编辑

动态创建单位和守护单位

1.动态创建单位

动态创建单位就是OCL单位,即ObjectCreationList,OCL单位对应于include/ObjectCreationList.xml
OCL单位很常见(比如坦克杀手埋伏,苏联载具死亡后跳出的恐怖机器人,娜塔莎召唤的轰炸机,等等)
了解OCL单位,可以使我们在游戏中动态的制造出一些单位,对于制作新的技能和效果,是比较有用的。
下面以坦克杀手埋伏为例说明一下

  1. <ObjectCreationList
  2. id="OCL_Japan_Abmbush">
  3. (1)<CreateObject
  4. Options="IGNORE_ALL_OBJECTS CREATE_AT_TARGET"   IGNORE_ALL_OBJECTS:忽略其他单位 CREATE_AT_TARGET:在技能释放点创建单位
  5. Disposition="ON_GROUND_ALIGNED"      如何分布 ON_GROUND_ALIGNED:在地面上 (不大懂具体意思)
  6. StartingBusyTime="10s"  指坦克杀手从出现到能动的时间            
  7. DisabledWhileBusy="true"  这个就是指坦克杀手在刚出现时不能动,和前一个相符,改为false,就不用等待。
  8. Count="1"   数量:创建几个这样的单位
  9. TempModelC  指坦克杀手在出现时的姿势动作(钻出洞)
  10. TempModelC>  该动作持续10秒(就是从洞里钻出来)
  11. <Offset  坐标偏移量
  12. x="40"
  13. y="0"
  14. z="0" />
  15. <CreateObject>JapanAntiVehicleInfantry</CreateObject>   创建的是何种单位,在这里当然是JapanAntiVehicleInfantry(坦克杀手在SDK中的名字),可以改为别的。
  16. (1)</CreateObject>

  17. (2)<CreateObject
  18. Options="IGNORE_ALL_OBJECTS CREATE_AT_TARGET"
  19. Disposition="ON_GROUND_ALIGNED"
  20. StartingBusyTime="10s"
  21. DisabledWhileBusy="true"
  22. Count="1"
  23. TempModelC
  24. TempModelC>
  25. <Offset 坐标偏移量(跟上一个不同,因为这是另一个位置)
  26. x="12"
  27. y="38"
  28. z="0" />
  29. <CreateObject>JapanAntiVehicleInfantry</CreateObject>
  30. (2)</CreateObject>
  31. 。。。。。。。。下面重复的部分比较多,就不贴了               
  32. </ObjectCreationList>
复制代码

可以看到,(1)。。(1)和(2)。。(2)之间的部分基本相同,而且省略的部分也基本相同,共有5段<CreateObject>。。</CreateObject>,为什么有5段基本重复的创建单位代码,大家应该能够猜到了,因为坦克杀手埋伏会产生五个不同位置的坦克杀手,所以有5段的创建代码,仔细地观察,发现在<Offset>那里是不同的,offset是指坐标偏移,是指以技能释放点为坐标原点的坐标,正因为5段代码的偏移坐标不同,所以产生的坦克杀手的位置不同,以技能释放点为中心均匀分布,z坐标指的是垂直的高度,在这里当然是0(在地面嘛)。
结合修改单位数量和单位类型,大家完全可以把坦克杀手埋伏改成任何复合类型的召唤单位技能。

下面的是质子加农炮的攻击代码,大家知道,质子加农炮的攻击是抛射出5发质子炮弹,这5发质子炮弹,其实也是OCL单位。相应的,你可以看到<FlingObject〉(抛射物体)代码有5段,就是对应这
5发,可以添加几段这样的代码来增加加农炮的炮弹数。


  1. <!-- creates 5 projectiles for the particle cannon -->
  2.     <ObjectCreationList
  3.                 id="OCL_ParticleCannonProjectiles">
  4.     <FlingObject
  5.                         CreateObject="ParticleCannonProjectile"  创建何种单位,在这里就是ParticleCannonProjectile,质子炮弹,当然,可以试着把它修改成别的单位(没试过)
  6.                         Count="1"   数量
  7.                         Speed="100"  速度
  8.                         Height="0.0" 高度
  9.       InitialDelay="0.0s"  延迟
  10.       UsePrimaryObjectForOffsets="true"> 确定使用偏移。
  11.       <Offset          偏移            
  12.               z="500"/>  垂直高度
  13.   下面这三个应该调整的是落点的分布,因为未试过,因此不下结论。   
  14.     <DistanceFromTarget   
  15.               Low="75"     
  16.               High="75"/>
  17.       <AngleAroundTarget   
  18.               Low="0"
  19.               High="0"/>
  20.       <DistanceAtTarget   
  21.               Low="50"
  22.               High="50"/>
  23.     </FlingObject>
  24. 。。。。。。后面的雷同,就不贴了
复制代码


下面这段是娜塔莎召唤轰炸机的代码,轰炸机也是OCL单位,修改下面的数据,可以影响轰炸机的出现时间和视觉效果,苏联的毒素轰炸机也是如此,并且通过复制代码,可以增加飞机数量。当然,轰炸机的弹药要在weapon.xml中修改。


  1. <ObjectCreationList
  2.                 id="OCL_SovietBombingRun">
  3.                 <arabolicCurve
  4.                         CreateObject="Soviet_BombingRun"    创建何种单位
  5.                         Options="TRACK_TARGET_OBJECT"      跟踪目标(游戏中在娜塔莎锁定完毕后,轰炸机会跟踪轰炸目标)
  6.                         InitialDelay="3.5s"       出现延迟
  7.                         ApproachTime="1.5s"       接近时间
  8.                         StartDistanceFromTarget="500.0"     出现位置距目标的距离
  9.                         EndDistanceFromTarget="750.0"       消失的位置距目标的距离   
  10.                         CruiseHeight="500.0"               巡航高度
  11.                         AttackHeight="150.0"/>              攻击时高度(俯冲式的)
  12.         </ObjectCreationList>

复制代码

还有一种动态创建单位的方法,就是利用一种特殊的武器,OCL创建武器(或者说是弹药),其实前面也有的是这样做的,
在这里,顺便说明一下苏联的机器人复仇这个特殊能力的生效机制。首先,我们随便找一个苏联的载具,都可以发现这样一段代码(我是在铁锤中找的):

  1. <xi:include
  2. href="DATA:Includes/SovietTerrorDroneSpawnUpgradePlayerPower.xml" />
复制代码

根据XML的语法,基本就是在这个位置,将Includes/SovietTerrorDroneSpawnUpgradePlayerPower.xml文件的内容加入,而该文件的内容则是:


  1. <FireWeaponWhenDead xmlns="uri:ea.com:eala:asset" 这一句话的字面意思就把他的作用机制道明了:在死亡时开火,开什么火呢,就是开OCL单位制造武器。
  2.         id="ModuleTag_TerrorDroneEggsSpawn"   
  3.         InitiallyActive="true"            是否初始化激活
  4.         DeathWeapon="TerrorDroneEggsPlayerPowerWeapon">   在嗝屁时,用什么武器开火,可以看到,是TerrorDroneEggsPlayerPowerWeapon,这个很关键。
  5.           <DieMuxData
  6.                 DeathTypes="ALL"
  7.                 DeathTypesForbidden="KNOCKBACK"/>
  8.         <WeaponFireProbability
  9.                 DeathType="ALL"
  10.                 ChancePercentage="20" /> 多大几率蹦出机器人
  11. </FireWeaponWhenDead>
复制代码

这个机制我没有试过是否别的单位是否可用,但推论应该可用,超级反应堆可能也会有这样的机制,只不过是在死亡时开火的武器不同罢了,大家可以利用这个死亡触发器做出很多技能来,比如死亡后产生种种不同效果,自爆车什么的。

然后,在weapon.xml中找到TerrorDroneEggsPlayerPowerWeapon的代码,在这里解释一下这个武器,它的开火效果和别的武器不同,开火效果是在开火单位处创建一个指定单位。


  1. <WeaponTemplate
  2. id="TerrorDroneEggsPlayerPowerWeapon"
  3. Flags="NOT_ATTRACTED_BY_MAGNETS"
  4. Weap>
  5. <Nuggets>
  6. <WeaponOCLNugget  指定弹药的类型,这里是OCLNugget类型,说明开火的效果是制造OCL单位,很重要!!!弹药的类型是一个很具有可塑性的变量,通过替换不同武器的nugget类型,可以实现不同的效果(比如EMP,眩晕,清空驾驶员)。
  7. Weap> 这里是,开火会制造出何种单位,是OCL_SovietTerrorDroneEggs。(应该可以改变,但应该仅限于OCL单位列表中的单位,其实在OCL_SovietTerrorDroneEggs中也可以改)
  8. <RequiredUpgrade>Upgrade_SovietTerrorDroneEggs</RequiredUpgrade> 需要升级什么才能生效,Upgrade_SovietTerrorDroneEggs就是指苏联的机器人报复升级。
  9. </WeaponOCLNugget>
  10. </Nuggets>
  11. </WeaponTemplate>
复制代码


那么就在ObjectCreationList.xml中找OCL_SovietTerrorDroneEggs吧。



  1. <ObjectCreationList
  2. id="OCL_SovietTerrorDroneEggs">
  3. <CreateObject
  4. Options="ISSUE_MOVE_AFTER_CREATION DO_NOT_COPY_SHADERS DO_NOT_COPY_SCALE" 选项,基本无关,可以不管  
  5. Disposition="ON_GROUND_ALIGNED"   分布
  6. TempModelC   出现时的动作,展开中,其实就是一个跳出来的动作
  7. TempModelC> 跳出来得动作持续2s
  8. <CreateObject>SovietScoutVehicle</CreateObject>  !!!!重要 创建何种单位,改这个就可以实现,打一枪,出一个你想要的单位了。
  9. </CreateObject>
  10. </ObjectCreationList>
复制代码


下面,具体应用一下这个工具吧,我们就修改维和步兵吧,让他打一枪,出一个恐怖机器人(当然,也可以是别的,这里方便起见),首先复制weapon.xml文件到你的mod的data文件夹,去掉只读属性,打开,拉到维和步兵的武器模板那里,


  1. <WeaponTemplate
  2. id="AlliedAntiInfantryInfantryShotgun"
  3.                 。。。。。。。。。无关内容省略
  4. <Nuggets>---改过的
  5. <WeaponOCLNugget
  6. Weap>
  7. </WeaponOCLNugget>
  8. </Nuggets>---改过的
  9. </WeaponTemplate>
复制代码


将其<Nuggets>中的内容改为TerrorDroneEggsPlayerPowerWeapon中的<Nuggets>的内容,没有复制<RequiredUpgrade>Upgrade_SovietTerrorDroneEggs</RequiredUpgrade>的原因大家都很清楚,我可不想要升了机器人复仇后才能生效。然后,保存,把weapon.xml添加到Mod.xml中,编译,你就可以使用打一枪跑出一个恐怖机器人的维和步兵了!(因为原来的弹药被替换,因此不再有攻击力,当然,没准可以通过附加nugget来重新获得攻击力,我没试过,还有,恐怖机器人会从维和步兵的位置蹦出,而不是开火的位置,这是因为机器人复仇者个技能中,机器人就是从坦克(开火者)中蹦出来的,也许可以修改,但我没有深入),当然,你会觉得这样的修改很无聊(有屁用呀),但这只是一个例子,在有创意的人手中,可以实现很好的效果。

2.守护单位

相信有不少人对红色可卡因这个mod中的飞行的将军战列舰有印象,他使用了大量的天狗战机作为护卫单位,护卫单位和航母舰载机不同,后者平时是在航母中的,而护卫单位,其实就是维修机器人类型的,一直悬浮在单位的旁边,像维修机器人一样,只不过维修机器人没有攻击力罢了。
下面我们还是以维和步兵为例,演示一下怎样为他加上三架双刃护卫。
大家应该还记得怎样为一个单位加上维修机器人吧,把以下代码复制在其<Behaviors>......</Behaviors>段中


  1. <AssignSlavesTargetObjectSpecialPower
  2.                                 id="ModuleTag_SpecialPowerRepairVehicle"
  3.                                 SpecialPowerTemplate="SpecialPower_TargetedRepairVehicle" />
  4.                         <SpawnBehavior
  5.                                 id="ModuleTag_SpawnRepairDrones"
  6.                                 SpawnNumberData="3" 有几个
  7.                                 InitialBurst="3"  一开始有几个
  8.                                 SpawnReplaceDelayData="10s"
  9.                                 SpawnedRequireSpawner="true"
  10.                                 KillSpawns
  11.                                 SpawnInsideBuilding="true"
  12.                                 KillSpawns
  13.                 Spawn>
  14.                                 <Die
  15.                                         DeathTypes="ALL" />
  16.                                 <SpawnTemplate>SovietAntiGroundAircraft</SpawnTemplate>  以何种单位作为维修机器人(护卫单位),这里是我改过的SovietAntiGroundAircraft双刃。
  17.                         </SpawnBehavior>
复制代码

这样,维和步兵就有三个维修机器人了。下面就把<SpawnTemplate>XXXXXXXXXX</SpawnTemplate>中的单位改为双刃吧,即<SpawnTemplate>SovietAntiGroundAircraft</SpawnTemplate>。
到这里,如果你进入游戏,会发现,在制造了维和步兵后,的确会有三架双刃陪嫁,但是双刃不会跟随维和步兵,而只是呆在那里,并且,双刃也可以被选择,完全就像制造了三架双刃一样,这不是我们要的效果,不过利用这个你也可以做出一些有意思的现象,比如尤里的克隆技术,制造一个出两个,就可以用这种思路实现,当然,要考虑的东西也有很多,比如要去掉护卫单位对父单位的生死捆绑,地上跑的单位似乎不能作为护卫单位。
那么,如何实现护卫单位的跟随呢,在这里就可以调用维修机器人的跟随源码了,打开RA3 MOD SDK\SageXml\Soviet\Units\SovietRepairDrone.xml,找到:


  1. <SlavedUpdate
  2. id="ModuleTag_SlavedUpdate"
  3. LeashRange="=$SOVIET_REPAIR_DRONE_LEASH_DISTANCE"    束缚距离,=$SOVIET_REPAIR_DRONE_LEASH_DISTANCE可以改为自己想要的数值
  4. GuardMaxRange="=$SOVIET_REPAIR_DRONE_LEASH_DISTANCE" 最大护卫距离 =$SOVIET_REPAIR_DRONE_LEASH_DISTANCE可以改为自己想要的数值
  5. GuardWanderRange="50"   护卫漫游距离,就是指护卫平时没事时环绕你的距离
  6. AttackRange="0"        攻击距离,可以改为自己想要的距离,我没改,但双刃也会攻击。
  7. UseSlaverAsControlForEvaObjectSightedEvents="false" />
  8. 复制RA3 MOD SDK\SageXml\Soviet\Units\SovietAntiGroundAircraft.xml到你的mod的data文件夹中,去只读,把上面的内容加到
  9. <Behaviors>......</Behaviors>段中,别忘了改改参数。
  10. 好了,这个加完了,就剩最后补充的一步了,把护卫双刃的属性变一下,变为我们不能选择的,我直接在这里用了舰载机的属性。
  11. 将双刃的kindof属性设为了
  12. KindOf="CAN_CAST_REFLECTIONS CAN_ATTACK AIRCRAFT VEHICLE PASS_EXPERIENCE_TO_PRODUCER NO_COLLIDE SKIP_IDLE_WHEN_CAPTURED LINE_OF_SIGHT_IGNORES_BUILDINGS"
  13. PASS_EXPERIENCE_TO_PRODUCER是指单位将经验传给主人,LINE_OF_SIGHT_IGNORES_BUILDINGS可以勾掉,意思是攻击时忽略建筑。

复制代码

将SovietAntiGroundAircraft.xml加到你的Mod.xml中,保存编译,就可以使用双刃护卫的维和步兵了,对了,用s键可以停止护卫单位的攻击。

向作者感谢

评分

参与人数 1威严 +1 收起 理由
正气凌然 + 1

查看全部评分

发表于 2010-11-23 19:07:05 | 显示全部楼层
非常支持木星……这么辛苦还把一些教程贴出来。
慢慢,要把原来的教程整理下了,抽个时间,让大家一起来整理整理。
发表于 2011-10-13 09:18:27 这篇帖子是使用手机发表的! | 显示全部楼层
很有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|手机版|管理员邮箱|红警DIY官方论坛    

GMT+8, 2017-8-19 09:53 , Processed in 0.055784 second(s), 20 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表