购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 PlayMaker的基本操作

为了说明 PlayMaker 的基本使用方法,在 2.2 节保存的场景 Test1中进一步实现以下效果:

(1)每当鼠标移到黄色的 Wall上时,让 Wall由黄变蓝;每当鼠标移出 Wa l l时,让它重新变回黄色。

(2)每次用鼠标单击 Wall时,Ground都会变色,并且将按照黑色→绿色→黑色→绿色→……的次序进行变化。

2.4.1 用PlayMaker实现对鼠标移动的响应

首先实现鼠标移进移出使 Wa l l 变色的效果。这个效果的实现相对简单,只需要先检测鼠标是否移入,在发生移入的动作时把 Wa l l 的颜色变成蓝色,然后再检测鼠标是否移出,在发生移出的动作时把 Wa l l 的颜色变回黄色即可。整个流程如图 2.25所示。

图2.25 检测鼠标移入移出时的流程图

具体操作如下:

① 在Unity的Scene面板中选中物体Wall,并在PlayMaker编辑窗口中右击选择Add FSM,即给Wall增加一个有限状态机(FSM),如图2.26所示,并给这个FSM命名为Change Color When Mouse Enters,如图2.27所示。

图2.26 给物体增加FSM

无论是变量的名字,还是FSM或者State的名字,都按照“见名知意”的规则命名会比较便于操作。

要选择一个物体对它进行编辑,既可以在Scene面板中选,也可以在Hierarchy面板中选。

FSM:Finite State Machine,有限状态机。FSM用来完整地描述一个复杂问题要按什么步骤来执行。所以FSM中通常含有多个State(状态),在每个State中都需要完成一些预先设定好的Action(动作),不同State之间会设置有各种跳转的规则,也就是转换事件。

如果给一个物体增加了FSM来控制它自己的行为,那么在Unity的Hierarchy面板中,这个物体的右侧会自动出现一个红色的“玩”符号,如下图所示。

图2.27 给FSM重命名

② 如图 2.28 所示,通过 Event Browser 给该 FSM 增加两个事件:Mouse Enter和Mouse Exit,分别用来控制鼠标移进、移出时的响应。

图2.28 添加Event

③ 如图 2.29所示,在 PlayMaker编辑窗口的空白处右击,选择 Add State,给FSM增加一个状态State 2。按照图2.30所示,将State 1和State 2分别重命名为Checking和Change Color to Blue。

图2.29 给FSM添加State

图2.30 给State重命名

④ 选中状态 Checking 并右击,选择 Add Transition → MOUSE ENTER,如图 2.31所示。即给状态 Checking添加了一个 MOUSE ENTER转换事件。单击选中MOUSE ENTER转换事件,拖出一个箭头指向状态Change Color to Blue。这样,当有鼠标划进这个FSM的所有者,也就是物体 Wa l l时,系统就会知晓,并将当前状态由Checking转换至Change Color to Blue。

同理,给状态 Change Color to Blue 添加一个 MOUSE EXIT 转换事件,并将它指向状态 Checking。完成后 PlayMaker 编辑窗口中的内容应该与图 2.32相似。

图2.31 给State添加转换事件

图2.32 Change Color When Mouse Enters FSM中的状态转换

⑤ 按图 2.33,选中状态 Change Color to Blue,在右下方单击 Action Browser,打开动作浏览器,给该状态增加一个动作 Set Material Color 。将这个动作中的Color改成蓝色,其他属性不变。

图2.33 给Change Color to Blue状态添加动作

参数 Game Object:表明要修改的是谁的材质。默认值为Use Owner,指的是本FSM的所有者,此处指的是物体Wall。因为我们本来就是要在鼠标移入物体Wall时,将Wall的颜色由黄色变为蓝色,所以此处Game Object的值不需要修改。

⑥ 在状态 Change Color to Blue中,如果发生了鼠标移出,也就MOUSE EXIT事件,就会转换到Checking状态。所以要在Checkin状态中将Wall的颜色变回黄色。如图2.34所示,给Checking状也添加一个 Set Material Color 的动作,将其中的 Color改回物Wa l l初始时的黄色。

图2.34 给Checking状态添加动作

此处为了准确地把Color改回Wall 原来的黄色,可以先在Unity的Project面板中的Assets中选中之前做的黄色的材质球,在右侧的Inspector面板中查到这个黄色的具体RGB值,如下图所示,然后再到图2.33中的Color中,把这个RGB值写进去。这样两者的颜色就完全一样了。

至此,用 PlayMaker 来控制对鼠标移动进行响应就完成了。运行整个项目,即可在 Unity 的 Game 面板中移动鼠标进出物体 Wall 了,观察Wall的颜色变化。注意,运行时应该在 Game面板中移动鼠标进行观察,而不是在 Scene 面板中移动鼠标。因为 Game 面板中呈现的才是最终游戏的效果。如图 2.35 所示,在 Unity 的工具栏中部,或者 PlayMaker 编辑界面的下方,都有运行按钮。

图2.35 运行项目的按钮

运行项目时可以发现,当鼠标移动到物体 Wall上时,PlayMaker编辑界面中的状态 Checking 上有个绿框,表示这个状态正在被执行,如图 2.36 所示。而当鼠标移出 Wall 时,从 MOUSE ENTER 指向 Change Color to Blue 的箭头会有一瞬间变成绿色。紧接着,如图 2.37 所示,状态 Change Color to Blue 上就出现了绿框,表明当前执行状态是Change Color to Blue。当鼠标再次移到 Wall 上时,执行状态又回到图2.36所示状态。

图2.36 鼠标在Wall上时的状态

图2.37 鼠标不在Wall上时的状态

在调试项目时,可以通过绿框来观察当前执行的状态到底是哪个,帮助检查项目。

2.4.2 用PlayMaker实现对鼠标单击的响应

下面在 2.4.1 节做出的场景上继续实现单击 Wall 改变 Ground 颜色的效果。使用两种不同的方法来实现这个效果。

1.平铺直叙式

分析鼠标单击物体 Wa l l 的过程可以发现,如果鼠标单击到了Wall,一定已经发生了鼠标移进 Wall 的情况。所以应该在鼠标移进Wall,但是还没有移出 Wall时插入对鼠标单击的响应。因此流程图将由图 2.25变成图 2.38。

图2.38 同时响应鼠标移动与单击的流程图

为了实现整个流程,我们将设置一个变量,专门用来保存当前Ground的颜色。同时还要设置两个自定义的转换事件。

具体操作如下

① 给物体 Wall的 Change Color When Mouse Enter FSM中,再添加一个系统中自带的转换事件MOUSE DOWN。添加的方法请参考图2.28。

② 给这个FSM再添加两个用户自定义事件,分别命名为CHANGE TO GREEN和CHANGE TO BLACK。添加用户自定义事件的方法很简单,如图2.39所示,只要在Event Browser按钮上方的Add Event空格中写入自定义事件的名字,然后按回车键即可。

图2.39 添加用户自定义的Event

③ 给这个FSM再添加一个新的状态,起名为Set Ground s Color,给它添加一个FINISHED转换事件,如图2.40所示。

图2.40 给状态Set Ground s Color添加FINISHED转换事件

所谓的FINISHED转换事件,也就是当本状态中的所有Action全部执行完毕后就自动跳转至下一个状态。

添加完所有转换事件之后,Events中应该如下图所示:

另外,如图2.41所示,在这个状态上右击选择Set as Start State,即让这个状态取代原来的初始状态Checking,成为整个FSM中第一个要执行的状态。同时,把这个状态的FINISHED转换到状态Checking上。

图2.41 把一个状态设置为起始状态

④ 给这个FSM再添加三个新状态,并按照图2.42进行状态转换连接。

⑤ 在状态 Set Ground s Color中,通过 Action Browser添加动作: Set Color Value 。并在这个动作的参数Color Variable的下拉菜单中选择New Variable…,即添加一个变量,命名为GroundColor。添加变量后如图2.43所示。

图2.42 同时响应鼠标移动与单击的Change Color When Mouse Enters FSM的状态转换

图2.43 添加变量

添加完变量之后,把动作 Set Color Value 的参数 Color设为物体Ground初始时的绿色。

⑥ 在状态 Check Ground s Color 中,通过 Action Browser 添加动作 Color Compare 。将这个动作中的 Color 1设为变量 GroundColor,Color 2 设为黑色,Equal 后面设为 CHANGE TO GREEN,Not Equal后面设为CHANGE TO BLACK,如图2.44所示。

图2.44 动作Color Compare

动作 Color Compare 的作用:

检测Color 1和Color 2是否相同,如果相同,就执行Equal后面的转换事件;如果不相同,就执行Not Equal后面的转换事件。

⑦ 将状态 Checking中的动作 Set Material Color 复制到状态 Change Ground s Color to Black中。

如图 2.45所示,右击 Set Material Color 动作右侧的齿轮标志,在下拉菜单中选择 Copy Selected Actions。然后在状态 Change Ground s Color to Black中的空白处右击,如图2.46所示,选择Paste Actions。

图2.45 拷贝状态中的动作

图2.46 粘贴动作

复制完动作后,将该动作的 Game Object 改为 Specify Game Object,并按照图2.47从Unity的Hierarchy面板中将Ground物体拖至该动作的Game Object中。同时,将该动作中的Color改为黑色。

图2.47 将Ground设为Set Material Color的Game Object

⑧ 同样,将状态Set Ground s Color中的动作 Set Color Value 也复制到状态Change Ground s Color to Black中。并将该动作中的Color改为黑色。状态Change Ground s Color to Black中的全部动作如图2.48所示。

图2.48 状态Change Ground s Color to Black中的所有动作

⑨ 将状态 Change Ground s Color to Black中所有动作都复制到状态Change Ground s Color to Green中。将Color全部设为绿色。

状态 Change Ground s Color to Green中的所有动作。

此时运行整个项目可以发现,Wall 已经能比较好地完成预设目标了。但是仔细观察还存在一个小问题:如果在单击了一次 Wa l l 之后,没有把鼠标移出 Wall,而是继续单击第二次 Wall,此时 Ground 并不会变色。要修改这个小错误其实非常简单,大家可以尝试自行修改。(提示:只需要给图 2.42 中的状态 Change Ground s Color to Green 和 Change Ground s Color to Black各增加一个转换事件即可。)

回顾本节的操作可以发现,我们在整个 FSM 中设置了 6个不同的状态、1 个变量、4 个系统转换事件、2 个用户自定义转换事件,才能同时对鼠标的移动和单击做出响应。整个过程还是比较复杂的。

本节的完整场景保存在本书配套资源中的CH2项目里,名为test1.unity。读者可以自行查看。

2.多FSM协同式

在 2.4.2 节中,我们在同一个 FSM 中既完成了对鼠标移动的响应,也完成了对鼠标单击的响应。从图 2.42 可以看出,整个 FSM 包含六个状态,各种状态之间的转换也比较凌乱。事实上,随着游戏的不断完善,经常会发现一个角色或者物体需要完成的动作有很多。在这种情况下,如果把所有的动作都放在一个 FSM 中去实现,FSM 会变得异常复杂,而且容易出错。因此,我们可以给一个角色或者物体设置多个 FSM,每个 FSM负责完成一种动作,不同的 FSM之间并行或者协同工作。

所以在本节中,我们把鼠标移进移出导致 Wa l l 自身颜色变化和单击鼠标导致 Ground 颜色变化这两种行为分开放到两个 FSM 中去实现。其中,鼠标移进移出导致 Wall 自身颜色变化这个功能仍用 2.4.1 节中的FSM 完成。而单击鼠标导致 Ground 颜色变化,这个功能则用下述方法新建一个 FSM来完成。

本节的完整场景保存在本书配套资源中的CH2项目里,名为est2.unity。

具体操作如下:

① 给Wall添加一个名为Change Ground s Color的FSM。如图2.49所示,在下拉菜单中选择Add FSM to Wall。

图2.49 给Wall增加一个新的FSM

② 在该FSM的Event中添加一个MOUSE DOWN事件。

③ 共设置2个状态:Change Color to Black,Change Color to Green,并按照图2.50进行状态转换连接。

图2.50 Change Ground s Color FSM中的状态转换

④ 给状态Change Color to Green添加一个动作 Set Material Color 。将其Game Object设为Ground,Color设为绿色。操作可参考图2.47。

⑤ 给Change Color to Black状态也添加一个动作 Set Material Color 。将其Game Object设为Ground,Color设为黑色。

这样,物体 Wall 一共拥有 2 个 FSM。如图 2.51 所示,在 Unity 的Inspector 面板中可以看到,这两个 FSM 的前面都打了钩。这表明,一旦游戏开始运行,这两个 FSM 会同时开始执行。单击运行按钮后可以看到,这两个 FSM 中均有绿色框,表示它们确实都正在执行,如图 2.52所示。

图2.51 两个FSM同时执行

如果不勾选,该FSM在游戏开始后就不会被执行。除非它被其他FSM调用。

读者可以尝试取消勾选这两个FSM中的一个,看看会出现什么效果。

图2.52 同时执行中的FSM

采用多个 FSM 不仅可以让每个 FSM 中的动作逻辑更清晰简单、便于阅读,而且不同动作之间相互独立,避免了相互干扰。这样即便后续再对某个动作进行修改,也不会对其他动作造成影响。 zXj6C0E7SKLFgi/6+kRgyS1WXCFOMQYpo3ktBEz58Tskj0r4Yes4ugDrD/iTLqgt

点击中间区域
呼出菜单
上一章
目录
下一章
×