如何跨场景进行交互

时间:2023-02-03 11:03:26

本文首发于微信公众号【小蚂蚁教你做游戏】,欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。

嗨!大家好,我是小蚂蚁。

在讲游戏场景的时候,我通常会使用这样的类比:把游戏比作一个房子,场景就是房子里的房间,通常一个房子里有多个房间,而且每个房间都互相连通,可以从一个房间进入到另一个房间。对应的就是可以从游戏中的一个场景进入到另一个场景。

两个场景之间是可以互通的,比如说你可以从“场景1”进入到“场景2”,也可以从“场景2”进入到“场景1”。但是不同场景里的精灵和逻辑是不能够直接交互的。这也是很多同学在面对多场景时,经常遇到的困惑。为什么无法在一个场景里设置另一场景里的精灵呢?为什么给另一个场景中的精灵发送通知时,接收不到呢?

下面,让我们先来看一下这两个经常会遇到的问题。

跨场景设置精灵报错

如何跨场景进行交互

如图,我们创建两个场景,在场景2中放置了一个“基础文字”。

接着,我们在场景1中,使用积木修改场景2中的“基础文字”。

如何跨场景进行交互

预览场景,你会发现提示了一个错误信息。

如何跨场景进行交互

对应的修改场景2中的“基础文字”的积木块会高亮显示。

如何跨场景进行交互

当你在一个场景中使用积木设置另一个场景的文字,数字,精灵等操作时,就会出现这种错误。因为每个场景的精灵只能够在自己所在的场景中设置。

现在积木块点击下拉时,会显示所有场景中的可设置的精灵,比如说,点击基础文字设置积木的下拉,会显示所有场景中的基础文字。如果工具在这里能增加一个限制,即只显示当前场景中的基础文字,那这个错误就能够在工具的层面上完全解决了。期待小游戏制作工具日后的改进升级。

跨场景发送通知无效

如何跨场景进行交互

如图,我们在场景2的“基础文字”上增加了一个通知的处理,当它收到“修改文字”的通知时,修改一下自己的文字内容。

接着,我们在场景1中给场景2的“基础文字”发送一个“修改文字”的通知,然后将场景切换到场景2。

如何跨场景进行交互

预览一下:

如何跨场景进行交互

场景2中的基础文字并没有改变。这证明我们在场景1中向场景2发送的通知并没有生效,而且也没有给出明显的错误提示。

当你在一个场景中向另一个场景中的精灵发送通知时,会遇到这种没有明显提示的问题,通知只有在发送给当前场景中的精灵时才会有效。

跨场景交互

我们既不能去设置其它场景的精灵,又不能向其它的场景发送通知,那两个场景之间想要交互的话如何做呢?答案就是“全局变量”。

如何跨场景进行交互

如图,全局变量是一个公共区域,每个场景都可以读取和设置全局变量。两个场景之间可以借助全局变量来进行互动。举个例子,假设现在有一个全局变量 a,它的值是 0,当前在场景1中,我们把这个 a 的值设置成 1,接着切换到场景2中,此时场景2获取到的 a 的值就是 1 了。

全局变量相当于一个中介的角色,可以在一个场景中记录某个值,然后在另一个场景中把这个值拿出来用。

接下来,我们以一个小示例来演示一下,如何使用全局变量来进行两个场景间的交互。

我们制作一个游戏中常用的选角色的示例,在选人场景(场景1)中玩家选择一个角色,然后进入游戏场景(场景2)后,会使用玩家选择的这个角色进行游戏。

首先,来看一下选择角色场景。

如何跨场景进行交互

如图,场景1是角色选择场景,在这里玩家可以选择角色,选择的角色使用红色放大作为提示,点击“开始游戏”按钮,会进入游戏场景。

创建一个“当前角色”的全局变量,以及一个“刷新角色”的通知。

如何跨场景进行交互

接着,看一下小Y上的积木逻辑。

如何跨场景进行交互

点击小Y时,设置全局变量“当前角色”的数值为 1,然后向所有的角色发送“刷新角色”的通知。通知中的处理是根据“当前角色”变量的值,设置当前的角色是否要红色放大显示。

再来看一下小怪兽上的积木逻辑。

如何跨场景进行交互

逻辑都差不多,唯一的区别就是,选择小怪兽时,“当前角色”的数值设置为 2。

最后,在来看一下场景2中的积木逻辑。

如何跨场景进行交互

逻辑很简单,当场景启动后,根据变量“当前角色”的值显示游戏的角色。“当前角色”的值为 1 的时候,显示小Y,为 2 的时候,显示小怪兽。

预览一下看看结果。

如何跨场景进行交互

最后,总结一下。

跨场景交互经常会遇到两个问题:

  • 在一个场景中设置另一个场景中的文字,数字,精灵等,会报错。
  • 在一个场景中向另一个场景中的精灵发送通知时,不会报错,但是通知无效。

对于这两个问题,只需要记住一点:不论是对精灵进行设置,还是给精灵发送通知,只有在同一场景下才有效,跨场景无效

跨场景交互的解决方法是利用“全局变量”,它是游戏这座房子里的一块公共区域,是一个中介。每个场景都可以与它交互,利用它我们就可以实现多个场景间的信息传递了。