UDN
Search public documentation:

DialogSystemCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3主页 > 音频系统 > 对话系统

对话系统


动态载入音频


虚幻引擎的音频系统不支持任意音频内容的同步的动态载入;但是您可以动态载入包含那些音频包文件。这种方法是有用的,因为我们想把尽可能多的带宽应用于贴图的动态载入;并且对于像虚幻竞技场和战争机器这样快动作的游戏来说有延迟也是不可接受的,而且此时同步FaceFX也变成了一个附加的令人厌烦的任务。作为替换的办法,我们为战争机器创建了专用的对话系统。

战争机器也有很多非脚本化的对话系统,所以这种方法非常划算的。

非脚本化的对话


战争机器2的对话系统是一个 非脚本化的对话系统GUDS ,在战争机器1中也使用了它。

这个系统是基于事件的,并且它会使得Pawns对游戏中发生的事件进行评论,比如当产生一个敌人时或者当您的团队中的各成员倒下时。对于每种可能发生的动作,Pawn有多种可以选择进行播放的线路 - 对于每个动作可以有任意数量的线路,甚至是一条都没有。目前,Pawn可以通话的所有线路都放在GUDBank中,游戏将会为地图中的每个pawn完全地加载它。这将导致在给定的时间内出现大量的声音。

为了降低系统的内存消耗,我们把每个玩家的GUDBank细分为几个较小的线路堆。任何时候,可以保证一个pawn至少会加载一个线路堆,从而允许它们对它们设置的任何情形做出反应。

这个过程是在 内容烘焙过程中完成的,所以在内容侧没有管理的消耗。这个系统引入了针对游戏的 烘焙器助手程序 ,它允许游戏在任何必要的地方控制烘焙过程。烘焙过程中的每个阶段都可以引入游戏烘焙器助手,并允许它执行任何需要的动作。这包括生成应该烘焙的包的列表、每个独立对象的烘焙、让助手加载包的函数(或在游戏运行中创建一个,这便是GUDs烘焙的情形)、当加载完要烘焙的包之后但是在任何过程发生之前要调用的函数。

这里是GUDS烘焙使用这个系统的方式:

  • 烘焙器将生成需要烘焙的包的列表。当这个过程完成时,它将会调用烘焙器助手,在那里它添加需要生成到列表中的GUD线路堆。这些是‘假的’包,因为它们实际上是不存在的。助手只是插入它知道的需要创建的包的名称。在这个过程中,它将根据上面的描述把源GUDBanks细分为几个较小的线路堆。它也会生成对话中使用的声效及FaceFX 动画的列表,以便稍后再系统中使用。(这个信息将存储在永久的烘焙器数据中,从而避免每次运行烘焙器时重新生成它。) 同时,目录包也会被放到那个映射‘父项’GUDBank类到细分的GUDBank包的列表上。
  • 烘焙器将会迭代列表中的所有包,加载每个包并烘焙包中的每个对象。当加载一个包时,它将首先调用助手来允许它加载那个包。在GUDS的情况中,这是助手在游戏运行中创建包并返回它的地方。这涉及到创建一个新的GUDBank,并使用适当的线路填充它。当给pawn设置线路堆时,任何FaceFX动画也会被插入到新的AnimGroup中。它将会设置一个中间标志预示GUD包是否已经被烘焙,以便在后面的过程中使用。如果助手程序不需要对给定的包文件做任何特殊处理,那么将返回NULL,并且烘焙器将会按照标准的方式来加载包。会对所有的非-GUDS包执行这个过程。
  • 当加载包后,助手程序将调用一个滞后加载函数。在GUDS系统中,如果包是GearGame或GearGameContent,那么助手程序将会找到原始的GUD线路堆,并清楚它们的内容。这样是为了避免线路被放入到它们的烘焙包中。(注意,这个操作也可以在真正的GUDBank对象烘焙过程中完成,但是它演示了烘焙器助手程序的PostLoad函数的应用示例。)
  • 烘焙器然后迭代包中的每个对象来烘焙它。它将首先调用助手程序的CookObject函数,这将返回一个布尔值,该值预示标准的烘焙器是否应该进一步处理那对象。在GUDS助手程序中,如果对象是一个位于引用列表中的声效并且那个包不是GUDS包,那么声效将会被设置为 MarkedByCooker ,以避免把它烘焙到当前的包中。如果它是GUDS包,那么将会把它设置为强制导出,如果需要也会修复它的FaceFX动画组的名称。如果那个对象是FaceFX资源或动画集,并且它不是一个GUDS包,那么将会从那个集合中删除GUDS使用的任何引用的动画。

在运行时,GUDS管理器处理 加载/卸载 线路堆的操作。当生成了一个Pawn时,它将会注册到GUD管理器。如果pawn使用了GUDS资源,那么管理器将会查看是否已经加载了那个集合。如果它还没有加载,它将会启动伴随那个pawn的其中一个GUDBank包的异步加载操作。加载的包会被放入到适当的集合中,并且会对其进行引用计数,以便避免当所有使用它的玩家都消失了时还占用着这些线路。在各种时候都可以发出请求来动态载入新的一组线路堆,以避免响应的重复。当加载了新的线路堆后,便可以写在旧的线路堆了。

尽管您的游戏可能不会使用这个特殊的系统,但是它提供了根据特定游戏需要细分内容的模型。

注意,这个系统是为动态(非脚本化的)对话设计的...

脚本化的对话


硬引用(针对特定情况的)对话将不会从这个方法中获得好处。但是,可以才有一个修改了的GUDS方法,它简单地把对话细分为更加小的组。当正在使用一个组时,管理器将一步地加载下一个需要的组。一旦知道线路组完成后,便可以卸载它,降低任何给定时间内内存中的线路的数量。在这种情况中,平衡线路组的大小来确保最小的内存消耗并且不会在对话播放时产生停顿便是技巧所在。