在上一期的内容中,我们提到了如何运用行为模块(Building Blocks)的方法,及各个分类行为模块的位置。这次,我将以一个实例来说明,期使各位能有深刻的了解。在本次的范例中,我将说明「如何使用鼠标点选的方式,控制人物移动」,较实际的例子就是游戏了,大部分的游戏都使用这种方式来控制角色的移动,因为这样的控制方式很方便,也很简单,只要一个鼠标即可。
一开始,必须先做需求的功能分析。我们要做的是「使用鼠标点选的方式,控制人物移动」,从字面上我们可以得到,这里有两种对象:一个是鼠标,另一个是人物,要做的动作分别是「点选」与「移动」。鼠标点选的部分要有更进一步、更具体的想法,因为到底是要用鼠标左键点选?还是用鼠标右键点选?这里我们选择使用鼠标左键的方式,再来又有另外一个问题,鼠标左键要点选哪里才有效?在这范例中,使用者必须点选人物角色所站立的「地板物体」才有效。所以在鼠标点选的功能部分,可以整理出对于鼠标控制的具体想法:「使用者必须使用鼠标左键,点选人物角色所站立的地板物体」。 在人物移动控制的部分,必须知道要用什么方式移动,用走的?跑的?或是直接移动人物的3D坐标位置?在这范例中,我们使用走的方式,所以在人物的部分我们就必须要有走路的动作。但是要走到哪里?就必须等到点选鼠标左键做完后才知道。所以在人物的部分,可以整理出对于人物移动控制的具体想法:「人物是以走的方式,走向鼠标左键点选在地板上的位置」,必须说明的是,此位置是一个含有X,Y,Z坐标的位置。
所以整个看来,我们要提供「等待鼠标左键按下」的功能、「取得鼠标左键所点选的位置」的功能、「人物移动控制」的功能与「人物走向的目的地」的功能。
接下来的步骤,我们就要把我们的想法文件化,画出流程图会让人一目了然,知道每一步骤应该做的工作。

有了具体想法之后,要画出流程图就很容易了,当流程图完成后,接下来的步骤,就要针对这几个功能,找出可供我们运用的BB。
(1) 等待鼠标左键按下:可以使用 「Logics > Message >」中的BB:Wait Message,在「Wait Message」的预设参数设定中,可以设定成"OnClick",设定完成后,此时的「Wait Message」就可以解释为:当鼠标左键点选该物体时…,其中「该物体」指的是「Wait Message」所作用的物体。这是一个很常用的功能,一定要记得。
(2) 取得鼠标左键所点选的点:这个功能算是重点,若不知道 Virtools有提供这样的功能,可能会想不到应该如何处理较好。这个功能我们可以使用「Interface > Screen」中的「BB:2D Picking」,在「2D Picking」的众多输出参数 pOut中,您可以找到「Intersection Point」,这个点的意义简单说就是点选的「点坐标位置」(世界坐标)。因为这个BB做了一些运算后,才会送出这个数值出来,其中的运算即是取得所点选的鼠标坐标位置,此坐标位置还是一个 2D向量,只有 X、Y两个值,接下来透过计算后,可以计算出平面上的X、Y值,对应到3D空间中,物体上的某一点。
(3) 人物移动控制:这部分比较简单,在Virtools控制人物动作的只有两个:一个是「BB:Character Controller」,另一个是「BB:Unlimited Controller」,都是放在 「Character > Movement」中。这里我们使用前者:「BB:Character Controller」,因为我们没有很多复杂的动作。
(4) 人物走向的目的地:这个功能一样可以在「Character > Movement」中找到:「BB:Character Go To」。
在了解Virtools Dev 中有哪些BB可以使用之后,接下来就要进入实作的部分了。我将使用 Virtools Dev 所提供的 Resource档案来示范,包含人物、人物动作与地板。
(step-1) Open Data Resource,打开资源文件"VirtoolsResources",一般预设状况都是开启的。如果已经开启者,请跳过此步骤。
(step-2)选择「3D Entities > Primitices」中的「Plane」做为地板对象,并拖拉至左边的3D Layout中。
(step-3)选择「Character > Skin Character」中的「Eva」做为此次范例中的人物,并拖拉至左边的3D Layout中。
(step-4)选择「Character > Animation > Skin Character Animation > Eva」中的「Walk」与「Wait」,并拖拉至左边3D Layout中的人物「Eva」上。

(step-5)以上都是准备工作,接下来就要开始BB实作的部分了。先处理人物动作的部分,使用「Character > Movement」中的「BB:Character Controller」,并设定如下图,记得必须作用在 "Eva"身上。
(step-6)在这步骤中的BB,全都写在地板的物体上,先完成如下图。

(step-7)在上一步骤中,发现「BB:Character Go To」的第2个参数:Target Object,只接受 "3D Entity"的设定,也就是说,要设定这个参数,必须要有一个 3D Entity,而「BB:2D Picking」所得到的是一个3D Vector,不是一个3D Entity。在此情况下,我们就要想办法把「3D Vector」变成「3D Entity」,而在目前场景中只有两个 3D Entity,就是地板与人物,所以,我们必须建立一个新的 3D Entity,这里我们将建立一个「3D Frame」,然后使用「BB:Set Position」,将由「BB:2D Picking」得来的3D 位置坐标,设定为此 「3D Frame」的位置。再将此「3D Frame」设定为「BB:Character Go To」的第2个参数就可以了。完成的script如下图:

记得整个 script要做 Loop,回到 Wait Message 的状态,才能进行下一次的动作,整个功能就算大功告成了。
以上所介绍的,是一个稍微简单,但是又有一些技巧的范例,这功能可以再做的更好,因为你们可能已经注意到了,使用者再做完「点选」的动作后,必须等到人物走到所点选的位置后,再继续点选才有作用。在下一期的内容中,我将会在针对此部分做一些修改与新增的功能。
在上一期中,我们做到了「使用鼠标点选的方式,控制人物移动」,在本期中,将针对这个功能做进一步的修改。
下图是截至目前为止,我们所建立的 script:

在此script的流程中,我们可以从上图的"Character Go To"得知,场景中的人物会在到达目的地后,才可以继续接受前往下一个目的地的指令。

上图中,红色圈选处为 "Character Go To " 的Arrived Output,表示 "Character Go To "的动作做完之后,整个执行流程才会 Link 回 "Wait Message"。现在,我们可以将这条线(或是说Link)删除,删除后的结果如下图:

在此情况之下,这个 script只会执行一次而已,就再也不接受任何讯息了。接下来,只要做一个很简单的连结,就可以完成「在人物行进过程中,也可以接受其它新增的目的地讯息」,也就是说,人物不必等到前进至目前的目的地位置,才可以进行下一个目的地的处理,而是随时都可以等待下一个目的地位置的讯息。修改的结果如下图:

在 "Wait Message" 做一个 Loop,表示script 随时都在等待 「鼠标左键按下」的讯息,只要接收到讯息时,流程会从 "Wait Message" 的 "Out"出去,连接到 "2D Picking" 的 "In",启动"2D Picking"的功能……,一直执行,直到整个流程结束,或是又有新的讯息进来为止。
接下来我要特别强调的是Virtools Dev最好用、也最方便的功能之一。修改完成后的 script,具有可重复使用性,可以储存成 .nms 的档案格式,但是储存前的过程可以分成两种,一种是直接在 script 上按右键,选择 save 就把该 script 储存,但是这种方式对于其它使用者来说,有可能造成使用上的不便,如果 script 中包含很多 building blocks,在这种未经整理的情况之下,所储存的档案,在修改参数(parameter)数值时可能会浪费些许时间寻找参数的位置,而且对于视觉的阅读上来说,也是一种负担。另外一种方式,可以使用既有的building blocks,建立一个新的building blocks,在 Virtools Dev 中称作是「Behavior Graph」。
首先,可以把变量先整理出来,这些变量的作用主要是让其它使用者在使用该Behavior Graph时,可以修改的变量,变量数量的设定没有一个准则,主要可以让其它使用者在使用上感觉很容易操作即可。接着,使用「Draw Behavior Graph」的功能,画出一个区域,将需要整合在一起的 building blocks 包含在一起,如下图:

需要重新连结的部分如上图所示,会有两条连结因为执行「Draw Behavior Graph」的功能而消失,所以必须重新再做一次连结。在上图的例子中,我选择「Target」与「Eva」为变量,也就是使用者只要设定"人物名称"与"目标物的名称"就可以使用,而不需要再重新建立一个相同流程的 script,或是需要了解这4个 building blocks的使用方式,即可完成「使用鼠标点选的方式,控制人物移动」的功能。然后以按住鼠标左键的方式,将「Target」与「Eva」拖曳出框外,再修改这两个变量的名称(是名称,不是内含的值),Double Click "Behavior Graph",这个"Behavior Graph"会缩小好像是一个新的 building blocks 一样,如下图:

名称可以自行修改,也可以使用中文,往后使用的编辑参数界面就会变成如下图:

最后一个步骤,就是把这个 "Behavior Graph"储存起来,而储存的位置可以放在 Virtools Dev 预设的 VirtoolsResources / Behavior Graphs 目录里面,也可以在您自行建立的Resource档案资料夹中,不用重新启动 Virtools,就可以看到 "Character Go To by Mouse"这个新的 Behavior Graph(如下图),使用的方式就如同使用 building blocks 一样,只需要 "Drag and Drop",再设定参数就完成了。

多使用这种方式来建构场景中的 script,对于未来维护上可以省下许多时间,但是当然的,必要的批注、文件说明还是要纪录,不然随着时间的流逝,您可能会渐渐淡忘了当初建立的方法与使用方式。 (完) |