![游戏设计与开发:Unity实战完全自学教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/6/43738006/b_43738006.jpg)
2.4.2 脚本编辑及相关设置
下面对《冰火人》游戏的所有功能的脚本编辑及相关设置进行介绍,读者可以看到游戏功能的具体实现方法。
《冰火人》游戏中所有需要挂载在游戏物体上的脚本已经在2.4.1节中介绍了,接下来会按照2.4.1节提到脚本的顺序逐一进行讲解。
(1)首先是摄像机跟随脚本。在该游戏中,摄像机需要一直和角色保持一定的角度和距离,才能使角色一直在游戏界面的某个位置,所以需要编辑摄像机的跟随逻辑。双击打开CameraFollow.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\CameraFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_1.jpg?sign=1739588171-nnYEy2in2B0M9eFBUuKpp8qrwfnBz3oh-0-da199a39074e992aeb6cce0059114994)
回到Unity编辑器,选中主摄像机,将游戏物体Player拖动到检视窗口(Inspector)的Camera Follow(Script)的参数Player旁边的输入框中,对所需要的参数进行赋值,如图2-34所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_2.jpg?sign=1739588171-Mjs755svh7Mm7do2skeQrrKsXEJ2DtFk-0-e8186ccbf3186b830a9b39eded487c6f)
图2-34
(2)该游戏有三个活动地板,每个活动地板的活动路径都不一样,第一个活动地板的活动路径为上下移动。双击打开GroundMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\GroundMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_3.jpg?sign=1739588171-KxW3xw2FXZSA6ppb0wJzSLFKjBQoJ0dS-0-bce6ec79ed859e555646700f5f566871)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_1.jpg?sign=1739588171-MITEI6AnUR3l5RM9PyLrFFGVaWBsA08U-0-066c98138d3f1e911d51bb8364bf84fb)
第二个活动地板为左右移动,双击打开Ground7LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground7LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_2.jpg?sign=1739588171-JHpuH5X6mCQS9YIZiSTHhcfoahjhpa52-0-8f2efbc2a5b468f13b87f7eaec95794a)
第三个活动地板为左右移动,但是它与第二个活动地板的移动范围不同。双击打开Ground8LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground8LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_3.jpg?sign=1739588171-xsCedbu21g2iVVv7TeqKHVcwyaxcW44r-0-d815635db298c62c2cada1ebd2ee77a3)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_1.jpg?sign=1739588171-fsaJ5g8305QIUUr1EBxrt9hgPPFyCuFx-0-ae9a5155c09c7c303a453796d81b96d9)
(3)场景中有几处陷阱。其中,一个陷阱是当角色靠近到一定距离时开始下落的,玩家需要及时调整角色前进的速度。双击打开Firedown.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Firedown.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_2.jpg?sign=1739588171-PZTF5evoUSaAkNv0sdNgy7KY3xJYwtjZ-0-078411a26f55186043cd61599e223682)
运行效果如图2-35所示,当角色前进到火焰下方时,火焰向下运动并攻击角色。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_1.jpg?sign=1739588171-gWfiGkGsvRCDPO8akwGI5r1xsg9wxBql-0-8a83ad33cf28cf3344f4e318b7fb2aed)
图2-35
在平台跳跃游戏中,为了使场景中的前、中、后景有明显的差异表现,有一种较简单的处理方法,就是使每个层次的贴图和镜头移动的相对速度不一致,从而模拟出一种有纵深感的效果。双击打开BackgroundFollow.cs脚本,编辑脚本,脚本代码如下。具体效果可以查看工程源文件。
代码位置:见源代码目录下Assets\Scripts\BackgroundFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_2.jpg?sign=1739588171-s2rZEmVvSAmW4FzWF51233jospGa2WZC-0-1682b9b4baee2c447849f86c0db0fe8b)
(4)在该游戏中,红心是场景中散落的收集要素,和很多2D游戏里的金币一样,当角色靠近时会被收集。双击打开Coin.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Coin.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_3.jpg?sign=1739588171-MTW6dAEPQpbbDSjZjE1Bk0ln7HHdvRLY-0-a2bf62db008d1a0d4d91dbddb362bd0b)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_1.jpg?sign=1739588171-qtSUwvKZ8EJ3Z6MRSZ5awu5x46byw5oE-0-757bb1a010eec94d11bfe9a8430a2d9b)
同样地,需要回到Unity对Coin脚本的参数进行赋值,如图2-36所示。将与字段同名的游戏物体分别拖动到对应的字段上,Is Run和U Icoin两个参数保留默认值即可。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_2.jpg?sign=1739588171-T58HZ9gLtAbP0r4X4dFn5CopVvAMxAaQ-0-34b3ccbb9aae4bff4ca2742642fcaff5)
图2-36
(5)角色的行为控制可以说是该游戏最复杂的脚本,其中包含了很多不同的功能方法。
首先是角色的移动控制,玩家控制的角色在游戏过程中(未通关之前)会一直向屏幕的右边前进,当玩家按下空格键时角色会向上跳起,当玩家按下“A”键时角色会缩小,当玩家按下“D”键时角色会变大。双击打开PlayerMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_3.jpg?sign=1739588171-0TZkEustPgxMaA3dXomDmn6OJCCiXkhX-0-3679111d5e4b2791eb8201653aea47ee)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_52_1.jpg?sign=1739588171-MfyUzFYdRj23FALMPLMPRjGsxeq5oywS-0-b78536550b465e11f4b7d5193a3165c5)
角色的碰撞盒需要检测一些触发事件,当角色碰到障碍物时游戏结束,当角色碰到关卡出口的碰撞体时游戏通关。双击打开PlayerMove.cs脚本,编辑脚本。在脚本中通过判断进入触发器的游戏物体的Tag区分不同的碰撞情况,关于不同游戏物体的Tag,在2.4.1节新建游戏物体时已经进行相关设置,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_53_1.jpg?sign=1739588171-2CjmHNVEWx2u7kCSzvkyEtAqnhJnx5gz-0-bd669d12c12d8320a85f5c9ab230f443)
下面介绍角色和场景中的道具互动的相关逻辑。该游戏目前有收集红心用的道具、火人变冰人道具,以及磁吸红心效果的磁吸道具。双击打开PlayerMove.cs脚本,编辑脚本。在当前脚本对相关的游戏物体进行初始设置,可以在步骤(5)看到在红心控制的脚本中调用了当前脚本的Money字段和SetMoney方法,而磁吸时间条的显示则由脚本Magnet触发。具体脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_53_2.jpg?sign=1739588171-y0coPB7BIHaVBtzAjxj7ua1HJ8vb97Sl-0-38dda8e29a75f1e57354eaafb5501d4b)
回到Unity编辑器,对游戏物体Player的Player Move脚本组件的字段Money Text和HP进行拖动并赋值,将游戏物体拖动到对应的输入框中,方法参考步骤(1)。缩小角色,使其跳跃力变大来通过原本过不去的火焰并且收集到红心,如图2-37所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_1.jpg?sign=1739588171-Myd7mtpPQVDgzGm1eF7COC2pmOpMrGBT-0-c563944df4a11fa0baa35b5a3fa33cd4)
图2-37
(6)在该游戏中有一个障碍物—冰墙,这个障碍物需要玩家拿到火人变冰人的道具,让火人变成冰人后就可以通过冰墙了。该道具在原地旋转,当玩家控制的角色踏入该道具的触发器内则可获得该道具,使角色变成冰人,场景中的冰墙变成可以通过的触发器状态,将该道具的游戏物体设为不显示,相当于删除道具,但实际上,场景中还存在该游戏物体。双击打开RainbowMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\RainbowMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_2.jpg?sign=1739588171-QH7TtnmJvroghUp0N355uq86MKqQySWm-0-be008fb0d074f3be45278a165a8e9915)
回到Unity,对游戏物体RainbowPlayer的RainbowMove(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,对Tupian的参数进行设置,如图2-38所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_1.jpg?sign=1739588171-KhqdBrFnrziqAhMlugVAn262Vgad8xNU-0-5b37c40b358260e1ccab815ee3972641)
图2-38
(7)前文提到了当前游戏中一共有三个道具,已经介绍了其中两个道具的开发过程,接下来介绍磁吸道具的开发过程。2.4.1 节提到磁吸道具的相关脚本有两个,首先是磁吸道具的父物体的脚本 MagnetFollow.cs,该脚本控制的是梯形磁吸范围的游戏物体。双击打开 MagnetFollow.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\MagnetFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_2.jpg?sign=1739588171-z9dBiocOYFM5xogUiBcOIqIiO8GhPiBH-0-5b4fe77fe40fe1c909e9bfcf9bb9eeb7)
回到Unity,选中游戏物体MagnetBox,在检视窗口(Inspector)中对Magnet Follow(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,如图2-39所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_3.jpg?sign=1739588171-hl4MB2skgIqgP06knhwUhlfthahonELA-0-a305b85f4bd50b3d0e8fcd483ef8444f)
图2-39
(8)磁吸道具的另一个脚本用于控制子物体的行为,当角色进入该子物体的触发器后,整个磁吸道具会跟随角色,并且开始显示与磁吸效果剩余时间的时间条相关的UI。当磁吸效果剩余时间小于0时,则将相关游戏物体都销毁。双击打开Magnet.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Magnet.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_56_1.jpg?sign=1739588171-kRj16PKsYy90dmOjQx9Z4mNfblIRV69m-0-3419cd9c01255963b905cd4a76a5f5ea)
回到Unity,对游戏物体magnet的Magnet(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,该道具在游戏中的使用效果如图2-40所示。(9)目前已经把游戏中大部分游戏物体的逻辑实现了,最后还有两个需要显示和隐藏的 UI组,一个是游戏失败时显示的UI,另一个是游戏通关时显示的UI。首先是游戏失败时显示的相关UI管理脚本,双击打开FailPanel.cs脚本,编辑脚本。该脚本采用单例模式,其他脚本可以通过调用这个单例来控制 FailPanel 和半透明幕布的显示和隐藏,该脚本还注册了“再试一次”按钮的监听事件。脚本代码如下。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_1.jpg?sign=1739588171-xcptiqsUILQlZPflg99hl8fPMzLHTXY7-0-72db8d9aa171191254bf2467127fa7fe)
图2-40
代码位置:见源代码目录下Assets\Scripts\FailPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_2.jpg?sign=1739588171-wrc23czzki7H9ybG62zEsQ3Z6sGmNGqc-0-739d6df5ca83b593174187f4a6da8080)
(10)然后是游戏通关时显示的相关UI管理脚本,和FailPanel.cs一样作为单例,并且将“游戏通关”窗口隐藏,“继续”按钮需要像“再试一次”按钮一样注册一个跳转场景的方法,这里并没有制作下一个关卡,所以没有可以注册的方法。双击打开 SuccessPanel.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\SuccessPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_3.jpg?sign=1739588171-y8HhNMR0FjTRfk53dpXomRv2jBOZ2xqm-0-44ebec198f8540ca848eb07cf2826a66)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_58_1.jpg?sign=1739588171-vZKensPOhhHdHUoLJuqARW3upQUKvtmE-0-04cdb4a074c1b4d637e00531a9017113)
(11)单击 Unity 上方的“播放”按钮运行游戏,可以查看游戏运行效果。至此,本章的实例制作过程介绍完毕。