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

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
查看: 45365|回复: 283

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

    [复制链接]
发表于 2013-10-2 22:22:01 | 显示全部楼层 |阅读模式
本帖最后由 FFUR2007SLX2_5 于 2014-6-26 16:27 编辑

《武装突袭3》脚本编写教程(高级进阶篇)


作者:ffur2007slx2_5




阅读本篇时请使用右上角“直达电梯”快速跳转至所需楼层。

如有不足之处,欢迎您的指证。

本帖子中包含更多资源

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

x

点评

期待版主的多人任务教程,造福多人任务编写爱好者!  发表于 2013-11-20 21:27
我建议你写一套英文的放上bis wiki =) 写的太好了, 深入浅出,不分享对不起arma  发表于 2013-10-14 09:38
 楼主| 发表于 2013-10-19 18:49:26 | 显示全部楼层
a8325811 发表于 2013-10-19 16:11
版大你好,看了你的文章以後,想要釐清幾件事!

我們常用的,像是[dowatch, getpos, BIS_fnc_codePerform ...

Hi a8325811

而腳本就是大量調用這些函數來達成自己要的目的,這個叫做腳本。


是的,脚本和函数是不一样的,脚本功能比函数大得多。

我们写脚本有两种写法,一种是不是用函数的,还有种是使用函数的。

不使用函数写脚本会慢,错误率高;使用函数写脚本很快,错误率低。

有些时候可能会有人觉得没必要区分函数或脚本,全部叫脚本就得了。不过脚本重执行,重实实在在,看得见摸得着的。而函数重求值,重计算。

你說私用變量離開自己的語塊就會沒有作用,這邊指的語塊是否就是不同的sqf檔或觸發器?


是的,不仅仅在不同的sqf中,即使是在同一个sqf中,同一个私用变量在不同的scope(句块空间)中也是无法相互识别的,必须进行传递。触发器不一样,触发器本身无法直接识别私用变量,只能识别local var局部变量。

還有就是要用到私用變量的時候,雖然在前面加個底線_這樣引擎就會自動識別為私用變量,但是不是最好還是寫得工整點,在最開頭用private ["_my"];這樣來進行宣告比較好?


是的,私用变量我们全部要private私用声明。

我以前的習慣,當要用到一個新的局部變量的時候,我都會直接打出我要的名字(前面不用底線),但是否要像私用變量,使用類似像{private ["_my"];}這樣的語法來宣告要用的局部變量嗎?
還是直接打出我要的局部變量跟他等於甚麼就可以了?


local var局部变量直接就能用,它在其所在的服务器(你的电脑)的任务任何地方均可直接传递或识别。

我常常會用到這種task1done的局部變量,用它來跟所有有關的觸發器做相關動作。
後來我也會使用publicVariable "task1done";來確保所有客戶端都同步。

後來有次我碰到一個問題,我設定了一個關閉發電廠發電的按鈕,當其中一個玩家按下去,他自己有反應,但其他的玩家卻沒有見到該有的效果,我是否要再按鈕的那個腳本中,多寫一個局部變量,並使用publicVariable來推送局部變量到所有客戶端,確保不管任何一個玩家去按按鈕,都可以讓所有人都有達到該有的效果?


是的,PublicVariable后所有客户端的task1done都会被激活,不然的话其他人的战况就无法互相同步。

点评

感謝您~!  发表于 2013-10-19 22:00
 楼主| 发表于 2014-2-10 21:31:28 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2014-2-14 20:14 编辑

210楼,武装突袭3——kbAddTopic,kbTell和EULA简介



从ARMA2开始BI的程序员引进了全新的对话系统——BIKB (Bohemia Interactive Knowledge Base)
其实这就是ARMA2和ARMA3的战役制作者Zipper5和工作室的一群配音演员为之忙碌的一套系统。在ARMA3的三章战役中我们可以发现大量的bikb文件,如果你不知道bikb的作用,那就out了,赶紧补补课吧!

我不想像BI开发者Jezuro解释的那么学术化,简单的概括来说,bikb对话系统可以完全替代到cfg sound去定义语音,我们完全不必写一套繁琐的对话逻辑FSM系统+sleep或延迟去侦测对方有没有把话说完再开口的时差判断,bikb+fsm+sqf完全就可以轻松搞定,构建你一套自己的对话将不再困难!bikb不仅可以用于AI与AI之间的随机对话,当然也可以玩家与AI,玩家与玩家之间的对话。

ARMA2开始后所有的任务或战役的对话全部由bikb+fsm+sqf的组合完成了,譬如我们所熟知的OA Alice System(BI资深设计师Miroky的得意之作)虽然这些对话非常简单,也只有短短的几句。但是只要学会了这套工作机制,想必你完全有能力制作一个大型的对话MOD,这块领域BI forum很少有人涉足。

这里有两个语音素材是接下来我们准备要用的:和,(我们把它们放在sound里面),使用bikb省去了在description.ext或h文件中去定义的步骤,识别的任务全部交给bikb来做,在我们的conversation.bikb中需要这样的定义,我先不想将其复杂化,因为在class Arguments中是可以使用变量来控制文字显示的,所以可以做到随场景的动态对话。这里先暂时不予考虑,在下一篇中我再做详解:

  1. class Sentences
  2. {

  3.     class hallo_01
  4.     {
  5.         text = "Hello Bret.";
  6.         speech[] = {"\Sound\ffur01.ogg"};
  7.         class Arguments {};
  8.         
  9.     };

  10.     class hallo_02
  11.     {
  12.         text = "Oh, hello Jemaine.";
  13.         speech[] = {"\Sound\ffur02.ogg"};
  14.         class Arguments {};
  15.         
  16.     }
  17. };
  18. class Arguments{};
  19. class Special{};
  20. startWithVocal[] = {hour};
  21. startWithConsonant[] = {europe, university};
复制代码


最后四行是程序写死的,我们必须要加上去,当然它们也有其各自的意义,暂时不解释。我们现在要做的就是记住每一个项,应为接下来的代码,fsm和sqf控制需要用到4个特殊局部变量,这些变量与我们的bikb绑定,相当于EH的传递变量。

定义好bikb后游戏是无法直接识别它的,与description.ext不同,我们可以在任何地点任何时间让游戏识别此bikb,直接通过kbAddTopic即可,它将bikb赋予执行对象同时在游戏中声明文件以供识别。没有被赋予bikb的对象则不可以使用语音文件。这里共有5个可用代码:kbRemoveTopic, kbHasTopic, kbTell,kbWasSaid和kbAddTopic.我将在随后的控制中介绍他们。

在任意脚本中我们给对象添加语音:

  1. Obj kbaddtopic [topicName, fileName.bikb, (fileName.fsm, (eventHandler))]
复制代码


topicName为任意字符串;
filename.bikb就是你要用的bikb文件名,注意路径;
下面两个可以省略但这里必须要用齐,否则你就无法做出随机对话的效果
filename.fsm这是用来控制AI回答的FSM文件,我们已知FSM两大功能是ARMA3的人工智能控制和任务框架,今天的第三个功能就是bikb的控制,如果对象是玩家则默认无效。
Eventhandler是汇编的sqf文件,用来控制玩家回答的文件。

这里解释一下为什么要两个不同的文件区别对待AI与玩家呢?首先,我们必须区别对待AI和玩家因为在MP模式下playable单位既可以是玩家也可以是AI,所以我们需要两个控制文件。第二,为什么AI一定得用FSM而玩家用sqf控制呢?因为fsm是布尔值控制行为的,AI就是靠布尔值堆出来的,所以必须fsm,而玩家不需要,我们有思考,有选择,所以只需要sqf列出选项即可。

现在假设在SP模式下玩家与一AI对话,我们给他们赋予相应的bikb和控制文件:

  1. player kbaddtopic ["Test","conversation.bikb","",{call compile preprocessFileLineNumbers "conversation.sqf"}];
  2. man kbaddtopic ["Test","conversation.bikb","conversation.fsm"];
复制代码


现在是不会对话的,因为我们还没写控制文件,先看玩家的sqf控制文件:conversation.sqf

  1. BIS_convMenu = [];
  2. switch (_sentenceId) do
  3. {
  4.         case "hallo_01":
  5.         {
  6.           _this kbTell [_from, _topic,"hallo_01"];
  7.     };
  8.     case "hallo_02":
  9.         {
  10.     BIS_convMenu = BIS_convMenu + [["hallo_01", _topic, "hallo_01", []]];
  11.     BIS_convMenu = BIS_convMenu + [["hallo_02", _topic, "hallo_02", []]];
  12.         };
  13. };
  14. BIS_convMenu
复制代码


玩家的控制文件的框架是这样的,其中的
_this: 代表被问话的人
_from: 问话者
_sentenceId: 字符串,就是在bikb中要说哪些话的项目名
_topic: 这个bikb的名称
和一个局部变量BIS_convMenu,这五个是不能变的,是程序设定的。

这是玩家的一个控制文件,就是当玩家被问话时根据问话者口述,玩家有权利选择自己的回答方式,当问话者说hallo_01时玩家也说hallo_01,当被问到hallo_02时玩家可以回答hallo_01或hallo_02。
BIS_convMenu是临时可回答库,它负责收集玩家可以说的回答。
搞清楚框架后,添油加醋就看你的了。

现在我们再来看看AI的conversation.fsm控制文件。比sqf要简单许多,少了一个全局变量,只有四个特殊私用变量_this,_from,_sentenceID,和_topic,意义和sqf完全一样:



大家可以在这里下载:

和sqf一样,这也是一个被动侦测的控制文件,为了简化理解我没有赋予AI思考的能力,其实我们完全可以做到。
万事俱备只欠东风,我们拥有了最基本的bikb+fsm+sqf系统,但进入游戏却没人说话,因为这两个控制文件都是被动侦测型的,所以我们先要让一个人主动开口说话:
先让AI和我们打声招呼:

  1. man kbtell [player,"test","hallo_02"];
复制代码


好了,他和我们说话了,等他讲完该轮到我们了,见证成就的时刻吧!



接下来我们就可以根据这种机制不断添加对话分支,再一次的进入奇妙的ARMA!

回头仔细想想bikb的方便度不言而喻,首先解决了一大难题就是cfgsound对语音时间无法把控的问题,第二是对话的连续性和全自动性,第三是方便的fsm,sqf可拓展性。比起纯脚本测试的复杂对话系统,写法上优化明显!最重要的是,思路清晰!

kbRemoveTopic用来移除topic, kbHasTopic则是布尔判断,最后一个是kbwasSaid.
这一般可以用作过场固定对话:

  1. miles kbAddTopic ["briefing", "kb\briefing.bikb", ""];
  2. shaftoe kbAddTopic ["briefing", "kb\briefing.bikb", ""];

  3. shaftoe kbTell [miles, "briefing", "shaftoe_briefing_H_1"];
  4. waitUntil {shaftoe kbWasSaid [miles, "briefing", "shaftoe_briefing_H_1", 3]};

  5. miles kbTell [shaftoe, "briefing", "shaftoe_briefing_M_1"];
  6. waitUntil {miles kbWasSaid [shaftoe, "briefing", "shaftoe_briefing_M_1", 3]};
复制代码


两个人可以直接你一句我一言,waitUntil代替sleep。

关于bikb的题外话,我们知道BIS_fnc_JukeBox是通过获取CfgMusic中Duration的时长定义来工作的,bikb使用类似于此的C++功能可以直接获取ogg文件时长,同时附加了控制文件的位置,应该是cfgsound的整合升级版。

下一篇我们将来谈谈distanceSqr,linearConversion和drawIcon3D。

211楼继续教程,《武装突袭3》——distanceSqr,linearConversion和drawIcon3D



本帖子中包含更多资源

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

x
 楼主| 发表于 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-2 22:23:48 | 显示全部楼层
前言


大家好,很高兴可以通过VME再次与大家分享一些脚本编写方面的经验。在此之前我曾经发表过《武装突袭2新手导读》(初级篇)http://www.chinavme.com/thread-12097-1-1.html
以及《武装突袭2 F7模组使用教程》http://www.chinavme.com/thread-14819-1-1.html 和部分武装突袭2函数的简单介绍 http://www.chinavme.com/forum.php?mod=viewthread&tid=19682
显然,自从武装突袭3诞生后一些老的教程似乎已经过时了。虽然新手导读和函数教程依旧适用于武装突袭3,不过随着武装突袭3 DevBranch编辑器界面的不断升级和函数库的不断更新,旧版的《模组使用教程》明显已经不能用了,想要玩转武装突袭3将逐渐成为一门技术活儿。因此我们亟需综合性的信息进行整合分享。
   
或许有人会问为什么就直接就高级教程,难道没有中级教程?或者是有必要分那么详细吗?我已经学会了sqf脚本,而且只要有不懂的就去搜索biwiki,日积月累自然就能玩装武装突袭3,这种教程已经是无所谓了,有存在的必要吗?亦或是初次上手武装突袭3就学习高级教程不会有困难吗?确实,就目前武装突袭3的圈子来看,新玩家与资深玩家有相当大的差距,新玩家对游戏孜孜不倦的提问,资深玩家即使知道也不愿意给重复的问题进行解答了。有些问题甚至不是一言两语就能够解决的。

既然如此,那么这篇高级教程究竟有没有存在的意义?我想答案是肯定的,玩武装突袭肯定会有这么一个过程:通过单人任务,战役体验游戏特性;随后通过多人游戏使自己成为资深玩家;通过对ArmAholic各种多样的MOD和任务体验开始逐步巩固武装突袭3在心中的地位;接着我们会开始关注波米的各种更新;直到发布自己的第一个任务,第一个脚本,直到自己的第一个MOD,从此我们便开始踏入了开发者的行列。当然这并不容易,我们既可以是全能的开发者,也可以是专攻型的。我们通过学习胡皓(AlexXP)翻译的《SQF脚本入门经典(第二版)》,《Mr Murry脚本ARMA编辑教程》,《Fockers Arma3 Scripting Guide》后基本上就学会了武装突袭3的脚本编写。不过若是真想写好我们就会发现我们还有太多的东西值得去学习,如果把这些经典教程都看作是基础篇,那么我相信这篇高级进阶篇就有其存在的意义。

对于刚接触武装突袭3的朋友也不必担心,我将以最为易懂的方式编写,只要一步一步的进行操作,相信你们会体验到武装突袭3真正的魅力!

这篇教程我将与大家共同分享最新最全的编写技术,这里我将按章节进行划分,每隔几天有空我就会发一篇章节,同时旧章节也会不断更新,如有错误或不足之处欢迎大家指证。
 楼主| 发表于 2013-10-2 22:25:59 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2014-8-13 22:17 编辑

目录


4楼:让我们先来整理一下自己的“装备”。

5楼:sqf基础教程学习

6楼:正篇开始【SupportInfo】武装突袭3代码DevBranch同步

7楼:武装突袭3之惰性求值(引言)

55楼:惰性求值

56楼:武装突袭3 - 神奇的变量

64楼:武装突袭3 – 变量与namespace

65楼:全局变量【服务器变量传递与addPublicVariableEventHandler】

66楼:武装突袭3 – 老友重逢之数组篇

80楼:武装突袭3 – 字母大小写区分

99楼:武装突袭3 – 循环全解析(一)

100楼:武装突袭3 – 循环全解析(二)

101楼:武装突袭3 – 循环全解析(三)

108楼:武装突袭3代码结构 – 语块(花园,房子和卧室)

120楼:武装突袭3——代码优化篇

121楼:武装突袭3——FSM全教程(一)

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

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

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

157楼:武装突袭3——FSM全教程(五)

171楼:武装突袭3——FSM全教程(六)

209楼:武装突袭3——代码优化追加篇

210楼:武装突袭3——kbAddtopic,kbTell和EULA简介

211楼:武装突袭3——distanceSqr,linearConversion和drawIcon3D

213楼:武装突袭3——addStackedEventHandler

214楼:武装突袭3——宙斯的visiblePosition

217楼:武装突袭3——《武装突袭3》——MP教程及废弃代码

218楼:武装突袭3——《武装突袭3》——MP教程及废弃代码追加

220楼:武装突袭3——《武装突袭3》——MP教程及废弃代码追加2

227楼:武装突袭3——《武装突袭3》——MP教程及废弃代码追加3

228楼:武装突袭3——《武装突袭3》——MP教程4及服务器设置

230楼:武装突袭3——《武装突袭3》——再见MP

233楼,武装突袭3——Intersect,MEH及其他

242楼,武装突袭3——刷军营与selectbestplaces

245楼,武装突袭3——handledamage与cfg函数

247楼,武装突袭3——方位角与倾转角

255楼,《武装突袭3——疯狂的戴夫和他的重量》

#260 ArmA3 15 Years' Anniversary

......未完待续
 楼主| 发表于 2013-10-2 22:30:05 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2014-2-10 14:19 编辑

让我们先来整理一下自己的“装备”

首先欢迎大家进入高级进阶篇教程,武装突袭3共支持sqs,sqf和fsm格式的脚本文件。由于sqs已经淘汰,另外fsm不是用来做函数的,所以开篇我们从sqf讲起。写脚本我们必须得有最好的“装备”。直接就用txt写是赤膊上阵,用第三方的软件譬如squint sqf editor固然不错不过词库更新似乎跟不上DevBranch的速度。这里当然推荐notePad ++ (基础篇,资深玩家可以跳过此章节)



1、        这里我们从 http://notepad-plus-plus.org/  notepad ++官网下载最新的版本
2、        安装完成后我们打开notePad ++ 的字文件夹 MyComputer -> C:\ -> Users -> YourUsername -> AppData -> Roaming -> Notepad++ folder
3、        随后我们下载最新版的武装突袭3词汇库 userDefineLang.zip 下载
4、        解压缩zip文件将userDefineLang.xml放到上述文件夹
5、        重新加载notePad ++到Language选择KKs ArmA SQF,好了接下来你所有的语法都高亮了。

      


接下来我们如何更新notePad++的词汇库呢?进入notePad ++选择language > Define your language > user language选择kks arma sqf。好了,下面的小方框里我们就可以不断更新命令了。



本帖子中包含更多资源

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

x
 楼主| 发表于 2013-10-2 22:32:43 | 显示全部楼层
sqf基础教程学习

既然是高级渐进,基础教程我便在此一笔带过。资深玩家可以跳过此段,新玩家倘若想继续学习,首先必须要学习以下两篇教程:
Sqf经典教程第二版(AlexXP翻译)
http://wiki.chinavme.com/%E6%AD% ... 8%E7%BB%8F%E5%85%B8



Mr Murry脚本编辑教程中文版
http://www.chinavme.com/forum.php?mod=viewthread&tid=18238

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-10-2 22:35:23 | 显示全部楼层
正篇开始【SupportInfo】武装突袭3代码DevBranch同步



既然是高级篇,我们首先必须得对Dev的每次更新内容了如指掌,但是BiWiki的更新却不是最为迅速的,有些时候编辑器中支持的新代码无法在Biwiki中找到 https://community.bistudio.com/w ... pting_Commands_List  
那发生这种情况我们该怎么办?这里我来向大家介绍一下SupportInfo这个功能。每次Dev更新后我们通过这个代码与更新之前的代码进行比对从而找到最新的Biwiki所来不及更新的代码。这里我们用到Debug console(以后我会一直提到它)。进入游戏编辑器按esc。

在对话框内输入:{ diag_log _x; } forEach supportInfo "";



随后按local exec.切回桌面找到我们的arma3.rpt文件,在这里你可以看到武装突袭3所有的代码。由于我们将其记录到了rpt文件中,我们可以方便的看到其所有的t,b,u,n的四大分类。也就是说就目前而言武装突袭3至少支持33个大类的代码。比如说新添加的NetObjNull是啥玩意?它不是ObjNull,而是一个布尔值……

下一讲中我将介绍一下武装突袭3的惰性求值

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-10-2 22:36:28 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-5 09:54 编辑

武装突袭3之惰性求值(引言)



    在惰性求值开始之前我不得不提一些题外话,就是当我们已经掌握SQF后是不是就可以开始随心所欲的写脚本了?发挥自己的想象力把任务变成无尽的可能?答案是肯定的,而且我鼓励大家这么做。只要能够玩的开心,乐在其中,脚本写几百行都不在话下。这是正确的,而且也是必须得经历的一个过程。但是随着日子不断的流逝和自身脚本编写能力的不断加强,我们会陷入一个思考,虽然脚本是通用的,一劳永逸的,只要写好了就可以在任何情况任何任务中调用。但是否总感觉越到后来越不想写,脚本镶嵌的越多测试就越是麻烦?每写一个新的脚本都得花心思去构思,每出一个任务都得写新的脚本,这些东西做完后往往费时费力,浪费青春。怎么办,于是乎我们想着把别人的脚本直接抄过来不省力?这倒是个好办法,接着我们就开始扮演了脚本拼凑工的角色。几番折腾不用花多大力气就能把任务搞定,一个好办法,既省时又省力。

    到了这个阶段,恭喜自己,我们已经成功晋升为中级脚本达人了。出于人身安全的考虑,我们基本上就停留在这个阶段,毕竟我们有学习,有工作,有家庭,有事业。而武装突袭3,只是调节生活的一部分。

    那么高级达人呢?得要是程序员?如果自己本身就是从事这方面工作的那当然排除在外,都能做游戏了。剩下的就都是武装突袭3爱好者,爱好者一般没有受过专业的编程学习,而且得花时间在家自学,除非我们是天才……
    现在的问题是我们一看见别人写的这一大堆乱七八糟的代码就头疼,还怎么有这耐心慢慢看下去?回到我们刚才提到过的,我脚本写的都快抓狂了,那是一个宏伟的脚本,综合性能非常高,涉及全方面的游戏效果提升给玩家带来不一样的游戏体验等等,可进度真是牛郎织女也别想见面啊……(中级玩家肯定遇到过这种情况,如果想写大脚本并准备发布的话)。

    那我们该怎么办?我们必须开始把中心转向学写函数,学写功能,最后再是脚本。如何理解?如果代码是单词,那函数就是口头禅、最常用的句子、与最常引用的名人名言,script则就是最后文章的结构和成稿。现在我们来到Armaholic和BI forum来个走马观花。里面的脚本有写的好的,也有刚刚起步的。先来看一些中级脚本,打开一看很多,很复杂,还有文件夹分类的,脚本与脚本间有大量的传递量作为连接,这样的脚本发布一定反响不错但鲜花的背后往往只有脚本的作者自己明白曾在这上面所花的时间与精力。这么做的代价也是惨痛的,因为每一个脚本都是嵌入式的,所以根本不可能单独拿出来,除非全搬过来;第二是调试改错也麻烦;第三……想一拳把显示器给穿了。

    现在来看看高级货,他们在干什么?Thomas Ryan (就是Zipper5)大家都知道,BI forum的前moderator,现在的BI Developer,马上出来的武装突袭3第一个战役就有他的贡献。细心的人会发现武装突袭3的所有任务线全部是fsm勾勒出来的,脚本也不是啪的一大堆塞到任务文件中,包括打开编辑器也干净的很,脚本全部都是调用的!那被调用的函数谁来负责?Karel Moricky。这样做有什么好处?就一个字:快!
好了,闲言碎语不多说,赶快开始我们的第一课。

请切至55楼,惰性求值篇

本帖子中包含更多资源

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

x

点评

这段也解答了我的困惑!  发表于 2013-10-16 18:40
非常同意这一段啊! 当初从A2转到A3之后换了很久写function library就是为了reusability和consistency  发表于 2013-10-4 19:09
发表于 2013-10-2 22:43:38 | 显示全部楼层
dddddddddddddddddddddddddddddddddddd
发表于 2013-10-2 22:49:28 | 显示全部楼层
支持一个
发表于 2013-10-2 22:57:22 | 显示全部楼层
好好学习
发表于 2013-10-2 23:05:03 | 显示全部楼层
这么重要的帖子各位就别用N个d这种回复了吧,有点太对不住大版主的教程帖了。话说回来,我还真是需要好好学习一下脚本了,会用脚本还是挺重要的。 感谢作者的辛苦劳动!
发表于 2013-10-2 23:44:35 | 显示全部楼层
谢谢,版主分享!
发表于 2013-10-2 23:48:54 | 显示全部楼层
楼主辛苦,标识万分感谢!{:soso_e179:}
发表于 2013-10-2 23:58:16 | 显示全部楼层
这个必须要认真学习,感谢版主
发表于 2013-10-3 00:02:22 | 显示全部楼层
一直不懂得说
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-4-24 05:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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