|
楼主 |
发表于 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中是可以使用变量来控制文字显示的,所以可以做到随场景的动态对话。这里先暂时不予考虑,在下一篇中我再做详解:
- class Sentences
- {
- class hallo_01
- {
- text = "Hello Bret.";
- speech[] = {"\Sound\ffur01.ogg"};
- class Arguments {};
-
- };
- class hallo_02
- {
- text = "Oh, hello Jemaine.";
- speech[] = {"\Sound\ffur02.ogg"};
- class Arguments {};
-
- }
- };
- class Arguments{};
- class Special{};
- startWithVocal[] = {hour};
- startWithConsonant[] = {europe, university};
复制代码
最后四行是程序写死的,我们必须要加上去,当然它们也有其各自的意义,暂时不解释。我们现在要做的就是记住每一个项,应为接下来的代码,fsm和sqf控制需要用到4个特殊局部变量,这些变量与我们的bikb绑定,相当于EH的传递变量。
定义好bikb后游戏是无法直接识别它的,与description.ext不同,我们可以在任何地点任何时间让游戏识别此bikb,直接通过kbAddTopic即可,它将bikb赋予执行对象同时在游戏中声明文件以供识别。没有被赋予bikb的对象则不可以使用语音文件。这里共有5个可用代码:kbRemoveTopic, kbHasTopic, kbTell,kbWasSaid和kbAddTopic.我将在随后的控制中介绍他们。
在任意脚本中我们给对象添加语音:
- 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和控制文件:
- player kbaddtopic ["Test","conversation.bikb","",{call compile preprocessFileLineNumbers "conversation.sqf"}];
- man kbaddtopic ["Test","conversation.bikb","conversation.fsm"];
复制代码
现在是不会对话的,因为我们还没写控制文件,先看玩家的sqf控制文件:conversation.sqf
- BIS_convMenu = [];
- switch (_sentenceId) do
- {
- case "hallo_01":
- {
- _this kbTell [_from, _topic,"hallo_01"];
- };
- case "hallo_02":
- {
- BIS_convMenu = BIS_convMenu + [["hallo_01", _topic, "hallo_01", []]];
- BIS_convMenu = BIS_convMenu + [["hallo_02", _topic, "hallo_02", []]];
- };
- };
- 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和我们打声招呼:
- man kbtell [player,"test","hallo_02"];
复制代码
好了,他和我们说话了,等他讲完该轮到我们了,见证成就的时刻吧!
接下来我们就可以根据这种机制不断添加对话分支,再一次的进入奇妙的ARMA!
回头仔细想想bikb的方便度不言而喻,首先解决了一大难题就是cfgsound对语音时间无法把控的问题,第二是对话的连续性和全自动性,第三是方便的fsm,sqf可拓展性。比起纯脚本测试的复杂对话系统,写法上优化明显!最重要的是,思路清晰!
kbRemoveTopic用来移除topic, kbHasTopic则是布尔判断,最后一个是kbwasSaid.
这一般可以用作过场固定对话:
- miles kbAddTopic ["briefing", "kb\briefing.bikb", ""];
- shaftoe kbAddTopic ["briefing", "kb\briefing.bikb", ""];
- shaftoe kbTell [miles, "briefing", "shaftoe_briefing_H_1"];
- waitUntil {shaftoe kbWasSaid [miles, "briefing", "shaftoe_briefing_H_1", 3]};
- miles kbTell [shaftoe, "briefing", "shaftoe_briefing_M_1"];
- 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
|