中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
楼主: FFUR2007SLX2_5

[教程] 《武装突袭3》脚本编写高级教程【255楼,武装突袭3——疯狂的戴夫和他的重量】

    [复制链接]
 楼主| 发表于 2013-10-16 17:21:29 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-16 17:29 编辑

132楼,武装突袭3——FSM全教程(二)



对于大多数国内玩家而言,发布过FSM脚本的玩家几乎为0,考虑到这一情况我想对于FSM还是从0开始。有些人几乎FSM长什么样都不知道,别担心,这里有全自动化一条龙服务,只要跟着教程一步步来保证你顺利拿下FSM!

首先我们更新一下我们的装备!看看你们用的PBO解包器,如果版本有旧的话更新一下,这里我用的是Elitness3 11.0.5。点击下载:

别问我Elitness是干什么的,这是拆弹器,接下来我们还得有解码器,FSM editor,如果你没有解码器就急冲冲的打开任务包一探究竟随后发现FSM文件通过txt打开成这样:

  1. /*%FSM<COMPILE "C:\BIS\FSMEditor\scriptedFSM.cfg, Showcase Combined Arms Mission Flow">*/
  2. /*%FSM<HEAD>*/
  3. /*
  4. item0[] = {"insertion_E3",2,250,30.000000,-120.000000,120.000000,-70.000000,0.000000,"insertion" \n "E3"};
  5. item1[] = {"insertion_finish",4,218,-40.000000,-50.000000,50.000000,0.000000,0.000000,"insertion finished"};
  6. item2[] = {"start_assault",2,250,-40.000000,20.000000,50.000000,70.000000,0.000000,"start assault"};
  7. item3[] = {"not_server",4,218,-30.000000,-470.000000,60.000000,-420.000000,1.000000,"not server"};
  8. item4[] = {"exit",1,250,-30.000000,-540.000000,60.000000,-490.000000,0.000000,"exit"};
  9. item5[] = {"area_seized",4,218,-40.000000,90.000000,50.000000,140.000000,0.000000,"area" \n "seized"};
  10. item6[] = {"start_extraction",2,250,-40.000000,300.000000,50.000000,350.000000,0.000000,"start extraction"};
  11. item7[] = {"extraction_finis",4,218,-150.000000,380.000000,-60.000000,430.000000,0.000000,"extraction finished"};
  12. item8[] = {"END1_OR_END7",1,250,-150.000000,590.000000,-60.000000,640.000000,0.000000,"END1" \n "OR" \n "END7"};
  13. item9[] = {"extraction_unava",4,218,70.000000,380.000000,160.000000,430.000000,2.000000,"extraction" \n "unavailable"};
  14. item10[] = {"END3",1,250,70.000000,450.000000,160.000000,500.000000,0.000000,"END3"};
  15. item11[] = {"reinforcements",2,250,-40.000000,160.000000,50.000000,210.000000,0.000000,"reinforcements"};
  16. item12[] = {"reinforcements_e",4,218,-40.000000,230.000000,50.000000,280.000000,0.000000,"reinforcements" \n "eliminated"};
  17. item13[] = {"init",0,250,-30.000000,-400.000000,60.000000,-350.000000,0.000000,"init"};
  18. item14[] = {"E3",4,218,30.000000,-190.000000,120.000000,-140.000000,1.000000,"E3"};
  19. item15[] = {"timeout_reached",4,218,-40.000000,380.000000,50.000000,430.000000,1.000000,"timeout" \n "reached"};
  20. item16[] = {"dialog_from_pilo",2,250,-40.000000,450.000000,50.000000,500.000000,0.000000,"dialog from" \n "pilot"};
  21. item17[] = {"delay",4,218,-40.000000,520.000000,50.000000,570.000000,0.000000,"delay"};
  22. item18[] = {"END2",1,250,-40.000000,590.000000,50.000000,640.000000,0.000000,"END2"};
  23. item19[] = {"retreat",4,218,70.000000,160.000000,160.000000,210.000000,1.000000,"retreat"};
  24. 后面N行省略。
复制代码


那你可以买块豆腐回来了……

这不是给人看的,现在得问FSM编辑器在哪儿下载?有些人说我在这个页面找到了FSM编辑器:http://community.bistudio.com/wiki/ArmA:_Community_Tools

这里有两个:



那我想说的是准备好毛巾洗洗睡吧,咱们别参活进去了。(看到community你应该就明白我什么意思了)官方的FSM编辑器在哪里?在这里:http://community.bistudio.com/wiki/BI_Tools_2.5 这才是我们需要的官方编辑器。



FSM editor其实在BI TOOLS中全齐了,只不过我们当初在安装的时候没注意,现在回到你的BI Tools文件夹内看看有没有她:



没有的话再安装一遍,完成后我们就有“炸弹解码器”了。

我们看一下内部结构:



我擦,好恶心的图标,好奇BI为什么好这口?

接着回到刚才任务中非人类眼睛所能直视的FSM中去,我们在打开方式中选择FSM editor。看一下:



哇!那是神马?电路表吗?这丫的是串联电路还是并联电路呢……

我们还可以用鼠标把里面五颜六色的块块给点出来发现里面丫的躲着一坨代码……



一阵眩晕之后我们登上时光机回到了当初登上这条贼船的地方……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
 楼主| 发表于 2013-10-16 17:30:21 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-17 14:31 编辑

133楼,武装突袭3——FSM全教程(三)



让我们回到梦想开始的地方,重新打开FSM。



里面什么都没有只有一个小红框。
点击上方菜单栏中FsmAttributes > FsmName



输入:MyFirstFSM,点击OK,这就是我们第一个FSM脚本的名字了。
随后继续FsmAttributes > Compile Config



我们点击Browse进入到你下载FSM的根目录,比如说ArmA3Tools > Fsm editor Personal Edition > 选择scripted fsm然后确定,这就是我们FSM脚本的编译文件。



接着我们把我们的文件保存一下,保存的时候注意选择Compiled FSM做为格式来保存,这样游戏和FSM编辑器就都能读取。



保存好后我们回到船上,看看这小红帽长啥样。红色圆边的这个State(我们暂时把它叫做状态)为初始状态,它是宇宙爆炸开始的地方,我们可以双击它在上面填记号(这是不是比sqf或sqs的斜杠评论好得多了?)比如我们叫它My First FSM,这里的记号不会影响脚本的执行,只是给玩家看的。



我们先来写一个脚本吧。(虽然之前说过FSM不是用来写脚本的,但它可以做成脚本,而且还相当酷!)我们先写一个叫做“招手的士兵”FSM脚本。(里面会用到的函数我就不另外开讲了,这些函数我会全部穿插进去讲解)
我们点入My First FSM,在右边的init中输入:



这里我们当成普通的SQF来写,没区别。随后我们用左边的工具栏的小箭头(Draw line)拖拽出一个condition(条件),点击它然后按住My First FSM往下拖。



拖出来的黄色菱形是条件,我们取名nothing happened



我们在nothing happened的右面condition栏中写上 true



由于条件只负责检查,我们这里什么都不用检查,直接默认通过,那么直接写true就可以了。(后面还有很多内容,我们慢慢说)
对于这种走形式的条件,BI一般都喜欢把它们涂成绿色,那么我们也把它涂成绿色吧。我们右键可以设置颜色:



接着我们再用箭头按住nothing happened往下拖一个状态,取名release。注意,这里引擎会自动进行排列,条件》状态》条件》状态。状态不能连状态,条件不能连条件。



当然,虽然我们可以这么做但是其实对于true condition我们还有更简单的方法。我们可以直接右键nothing happened选择true condition,这样不仅init不必写了,颜色也不必再改动了。



现在的问题是这些个图案手动排列歪歪扭扭的,如何才能像BI那样整齐排列呢?
我们打开文件file > 页面设置Page Setup



将enable Grid和Show Grid给勾上随后save再ok即可。
随后我们就可以整齐的对齐这些图案。
接着我们在release中写入:
_guy dowatch _player;
_guy Globalchat "I'm ready";

告诉我们这家伙已经准备好了。
我们再往下拖一个条件,这次不是true condition了,我们在代码里写上cursorTarget == _guy,条件名称aiming?



继续拖一个hand Up,里面写上_guy playMove "Acts_PercMstpSlowWrflDnon_handup1c"; private ["_time"]; _time = time;
继续拖一个wait,里面写上time - _time > 2



接着我们要回到release去,为了让FSM漂亮点,我向大家介绍一下knee,膝盖?这次我们还是按住wait往上托,但记住同时按住ctrl,这样我们就可以拖出一个knee。
随后再把knee链接到release。



干净,漂亮,这一篇章我先不解释各种细节,我把它们放到下一章,保存好后大家回到任务体验一下。放两个家伙运行FSM。_nul = [player,aP] execFSM "My_First_FSM.fsm"; 有木有一个家伙一看见你瞧见他了就兴高采烈的朝你举手?



庆祝一下自己吧,我们已经会写第一个FSM脚本了!这里是我们的第一个FSM,现成示范在此可点击下载:

请切换至138楼继续教程,武装突袭3——FSM全教程(四)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x

点评

开始下方的判断条件无存在意义,直接删除就是。  发表于 2014-3-1 22:07
发表于 2013-10-16 18:04:10 | 显示全部楼层
就在等这个了!感谢版主啊!~~~
发表于 2013-10-16 20:06:50 | 显示全部楼层
我来学习了
发表于 2013-10-16 20:57:44 | 显示全部楼层

HAOZHU,好久不见,有空来玩。。。。
发表于 2013-10-17 13:30:30 | 显示全部楼层
function的确是王道

fsm我觉得写沙盒和动态任务很好,当然是以我浅显的理解来看
 楼主| 发表于 2013-10-17 14:24:04 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-19 23:00 编辑

138楼,武装突袭3——FSM全教程(四)



在这一讲中我将开始对FSM的构成进行详细的介绍,或许有些枯燥,但既然是高级篇这段绝对不能跳过。

在我们的第一个FSM中我们已经可以完成脚本的功能了,或许经过我们自己的研究已经大致略知一二了。所以赶紧乘热打铁,把FSM琢磨透澈。

看着我们的第一个FSM,相比于sqf感觉这种脚本的编写过程似乎有趣许多,因为它是可视性的,而且我们也不必为各种循环而烦恼,只要将需要循环的部分往指定的状态链接起来就大功告成,与此同时我们的思考方式也开始与SQF不同了,对脚本结构的思考更加线性化,而不像以前非常抽象化。当我们看到FSM的好处时,这在另一点也证明了为何BI放弃了使用sqs,sqf编写任务框架而转为使用FSM了!

在正式讲解FSM之前我们先看看有多少关于FSM的命令?commandFSM, completedFSM, execFSM, getFSMVariable, setFSMVariable和doFSM。首先我们从最为基础的execFSM来看。FSM中共有三种状态的空间,一是state(状态),二是condition(条件),三是knee(链接点)

在state(状态)中共有InitCode(初始代码块)与PreCondition(预条件块)两个空间块供玩家输入代码。

我们先来看InitCode(初始代码块)——在初始代码块中的所有代码只会执行一次,也就是说在FSM中它会榨干你的CPU以最快的速度把InitCode中的所有代码都执行一遍,在其中所有的语法只能是sqf语法。不过有一点我们必须记住,由于FSM是非常高效的脚本,所以在她的体内根本就不允许有拖延的情况出现,也就是说别想在FSM中直接执行像waitUntil,sleep这种带有延迟功能的代码,这也是她与sqf的区别。对于一些sleep或waitUntil用习惯的朋友来说可能上来会不适应,没有sleep让我的脚本怎么写嘛!当然我们可以将习惯慢慢的改回来。

现在的问题来了,如果我要用sleep和waitUntil怎么办?



这样写是肯定不行的,那怎么办?有两种,看你准备怎么样去计算这个sleep的时间。(我们再平时写sqf也会遇到类似问题,到底是将延迟时间归到sqf的总延迟时间还是将其独立出去不影响脚本的总时间?)FSM的处理方法也一样,如果是准备将其纳入FSM的运行总时间的话我们就把它拆分开来,如果不准备将其纳入总运算时间我们则要另立门户。

拆分的方法有两种,我们必须要配合条件使用:



它们的各自写法如下

  1. a: private ["_time"]; _time = time;
  2. b: time - _time > 1
  3. c: hint "c"
复制代码


第二种写法:

  1. a: private ["_time"]; _time = time;
  2. b: time > _time + 1
  3. c: hint "c"
复制代码


以此类推,如果有多个sleep,那我们就要不断的将FSM进行拆分,10个sleep对应就会有10个条件与10个状态,看上去似乎很麻烦,定义时间+计算时间达到延迟的效果还不如直接一个sleep来的爽快。这从另一个角度也反映出FSM不是为纯粹的脚本而诞生的。

如果我们不想把这个sleep计算入FSM的总时间呢,那就用spawn另立门户。



这就意味着在spawn语块中的代码已经另立门户与FSM不相干了,所以在spawn语块中的所有语法便脱离FSM限制重回sqf语法,而对于这个state则没有影响,FSM照旧一气呵成没有等待。刚上手FSM我们很容易把它当成脚本来写,这也没有问题,不过在FSM的单个状态中得注意了,千万不要滔滔不停的写下去,当你的代码超过几百行后FSM的可视化菜单就会罢工,这是目前的一个bug。(当然我之前也提过代码不要写超过百行)

现在状态中的延时问题解决了,那再让我们看看状态中的循环问题。



像这种就直接game over了。

在FSM中支持所有种类的循环唯独除了WaitUntil,虽然FSM的状态中可以直接使用for, forEach, while, OnEachFrame。但是这些循环的语块中依旧受到FSM的限制,是无法使用sleep等延迟的,也就是说直接用在FSM中的循环必须一次性求值,否则就spawn另立门户。



接着让我们来看看exitWith,这个代码可不可以直接退出FSM不再运行接下去的条件?答案是不可以的,想要退出FSM,要么不设链接循环,要么直接将状态设为End State(结束状态)



最后是关于switch。



遇到这种情况该怎么办?同样我们要另立门户:



当然尽管FSM很快,但在FSM中能优化尽量还是优化代码。

那么接下来有人可能会问能不能对switch进行拆分?像这样?



虽然这样理论上可行,但是如果我们的switch后面依旧有一大串东西需要执行那就可能涉及到FSM的双线同时操作,如下:



这里我必须和大家澄清一点,FSM绝对不支持双线或多线同时操作,她不是WCG APM超300的高手,她只支持单线操作,换言之,FSM就真的是电路,她只会朝电阻小的地方走,而不像流水会分流。这里我顺便把condition的优先项给说一下吧,既然线路只会朝一个方向走,那当她面临选择时究竟是如何选择的呢?



首先无论condition的内条件到底如何,state首先检查的是优先项,优先项的数字越大,她就从最大的这个开始判断,这就是为什么如果在一群条件中选择时要把true condition的优先项放在最后,否则一切顺序在其后面的条件都将无意义。

那么或许会有人问如果所有判断的条件完全相同,优先项完全相同,那引擎该如何选择呢?这里引擎会直接选择最后一个被创建起来的条件,也就是最后那个判断。

请切换至155楼继续教程,武装突袭3——FSM全教程(五)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
发表于 2013-10-17 14:43:37 | 显示全部楼层
火心 发表于 2013-10-16 20:57
HAOZHU,好久不见,有空来玩。。。。

目前没空玩阿,过一两个月。
发表于 2013-10-17 17:28:27 | 显示全部楼层
好帖子值得顶
发表于 2013-10-17 20:28:23 | 显示全部楼层
谢谢分享哦~~~~~~
发表于 2013-10-17 21:55:14 | 显示全部楼层
楼主辛苦
发表于 2013-10-18 10:06:03 | 显示全部楼层
啥事FSM,新手。。。不过武装突袭箭头玩了很久。
发表于 2013-10-18 11:02:14 | 显示全部楼层
{:soso_e176:}学习学习
发表于 2013-10-18 20:58:09 | 显示全部楼层
发表于 2013-10-18 20:58:14 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-4-29 11:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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