![游戏设计与开发: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=1739409032-B8FggV4ZhQdL2S8qHtGe7bw3tdowYx6A-0-c33893e9666e907f4fda4734d2b754dd)
回到Unity编辑器,选中主摄像机,将游戏物体Player拖动到检视窗口(Inspector)的Camera Follow(Script)的参数Player旁边的输入框中,对所需要的参数进行赋值,如图2-34所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_2.jpg?sign=1739409032-2JjFd2gwiBzQGdZEbfll0Kuvpjysneep-0-9e8db8038f98a4c7ed19f78cdadaeab9)
图2-34
(2)该游戏有三个活动地板,每个活动地板的活动路径都不一样,第一个活动地板的活动路径为上下移动。双击打开GroundMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\GroundMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_3.jpg?sign=1739409032-Wy1m333mDesLyJAT2z6OHEu8criwWkOb-0-8cada70fd85f455f55936930afb2e95b)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_1.jpg?sign=1739409032-p2mjDXacVnQjwycsYx4j9lRUIpq1Ll2e-0-b3ccaa56f36701c8e714213e04caf228)
第二个活动地板为左右移动,双击打开Ground7LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground7LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_2.jpg?sign=1739409032-X1M13pTSjTiwTCSg85AI0rc2rVV9FZQ4-0-28858638f54d8bd8a688c7dc6f1a7e46)
第三个活动地板为左右移动,但是它与第二个活动地板的移动范围不同。双击打开Ground8LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground8LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_3.jpg?sign=1739409032-aH5XEIAY0N0rH8hoS3kw1EadZ7VkUrQ5-0-a9c0e95d144d2d94887ee20eb5b3b5df)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_1.jpg?sign=1739409032-vyq6MmPJj2ECexD2pd5ZJRYgCYrjuzTb-0-fa2e31e71dcc04b57a35996ec778cb8a)
(3)场景中有几处陷阱。其中,一个陷阱是当角色靠近到一定距离时开始下落的,玩家需要及时调整角色前进的速度。双击打开Firedown.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Firedown.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_2.jpg?sign=1739409032-V0yO8mNgGhJd79rIK12TqV9JCPRgmXLh-0-e98c134721e56048e0ac128aeb70bc0a)
运行效果如图2-35所示,当角色前进到火焰下方时,火焰向下运动并攻击角色。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_1.jpg?sign=1739409032-CuUbFAWA5TxHVhaEeE6EzdODNoEql5Jd-0-2c7b5066c3b3a2eb6abdbc71bfbd37b8)
图2-35
在平台跳跃游戏中,为了使场景中的前、中、后景有明显的差异表现,有一种较简单的处理方法,就是使每个层次的贴图和镜头移动的相对速度不一致,从而模拟出一种有纵深感的效果。双击打开BackgroundFollow.cs脚本,编辑脚本,脚本代码如下。具体效果可以查看工程源文件。
代码位置:见源代码目录下Assets\Scripts\BackgroundFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_2.jpg?sign=1739409032-8y42quJ9puqKnDrMoFc6Qz4TZzVq1QD9-0-834821f7d11408104932689cd144a416)
(4)在该游戏中,红心是场景中散落的收集要素,和很多2D游戏里的金币一样,当角色靠近时会被收集。双击打开Coin.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Coin.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_3.jpg?sign=1739409032-fwlUvUGclagh1FaNGCpfexdVDEiD8Hh5-0-b3992e4377b7e84e62d3f015599cbe69)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_1.jpg?sign=1739409032-6tsX0le7mDRealZCcNrK6Y2fWclOPt0X-0-2807e12dff53a0ec36d74e4d3973026e)
同样地,需要回到Unity对Coin脚本的参数进行赋值,如图2-36所示。将与字段同名的游戏物体分别拖动到对应的字段上,Is Run和U Icoin两个参数保留默认值即可。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_2.jpg?sign=1739409032-pH0zklMZXWQg9Tj6ZH8VXVU9VKTpA5mF-0-03b1f4c12ed8cde5ad5d13a9b4ba8c42)
图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=1739409032-A40vuDHk3A3QbiFrVhU8eEsNn7OFeyJV-0-0c96af0507256a64d5ba53a4e4def096)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_52_1.jpg?sign=1739409032-X5Q4IzaS87VHCcBlhXyrXy2MF87IZSgw-0-9be80d347de946d9cad84fcbdc72c6d0)
角色的碰撞盒需要检测一些触发事件,当角色碰到障碍物时游戏结束,当角色碰到关卡出口的碰撞体时游戏通关。双击打开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=1739409032-2djnuZzC8WbG2OSmu1cUJOlUJZLPg170-0-e260e13b0fb4400598a57d2bab5587a7)
下面介绍角色和场景中的道具互动的相关逻辑。该游戏目前有收集红心用的道具、火人变冰人道具,以及磁吸红心效果的磁吸道具。双击打开PlayerMove.cs脚本,编辑脚本。在当前脚本对相关的游戏物体进行初始设置,可以在步骤(5)看到在红心控制的脚本中调用了当前脚本的Money字段和SetMoney方法,而磁吸时间条的显示则由脚本Magnet触发。具体脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_53_2.jpg?sign=1739409032-3EHHfu5KTssebxiA2y5RNZJTLkV0ETWA-0-803891a1005d958677ea23bd41c80588)
回到Unity编辑器,对游戏物体Player的Player Move脚本组件的字段Money Text和HP进行拖动并赋值,将游戏物体拖动到对应的输入框中,方法参考步骤(1)。缩小角色,使其跳跃力变大来通过原本过不去的火焰并且收集到红心,如图2-37所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_1.jpg?sign=1739409032-kSceE2WFosehCaAmhW3w6nq2SC9rHrqE-0-0aeedce1dcf3e891b54b07a68fb796b8)
图2-37
(6)在该游戏中有一个障碍物—冰墙,这个障碍物需要玩家拿到火人变冰人的道具,让火人变成冰人后就可以通过冰墙了。该道具在原地旋转,当玩家控制的角色踏入该道具的触发器内则可获得该道具,使角色变成冰人,场景中的冰墙变成可以通过的触发器状态,将该道具的游戏物体设为不显示,相当于删除道具,但实际上,场景中还存在该游戏物体。双击打开RainbowMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\RainbowMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_2.jpg?sign=1739409032-hajxrWG3h9znd82WV3DtgFwiL1eNTUaw-0-13f291e980047f4b9bed4d0cb27f84d0)
回到Unity,对游戏物体RainbowPlayer的RainbowMove(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,对Tupian的参数进行设置,如图2-38所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_1.jpg?sign=1739409032-taForscxSTJLaDHxk0MDhW4iLq9hN1xb-0-134f3dfb9f39aedeb3a1dd0304ca0752)
图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=1739409032-L5oSxtBwfHVXqcuzP1Q0D1XAVGAtYHtw-0-e6f8423636c0f2362593f969949c115d)
回到Unity,选中游戏物体MagnetBox,在检视窗口(Inspector)中对Magnet Follow(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,如图2-39所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_3.jpg?sign=1739409032-sRQEfawqrDdWXYiiw6gzEivgpDKRL8DG-0-c787b5d2d06e0cae3564b099a75e32c2)
图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=1739409032-wEklJyf1gDfW3vSFVoJ6uR32gHuxMdYm-0-0968725031b901904db4a9b7e11e247b)
回到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=1739409032-CTWYc62cpCStC4boK5nKv01dnJwOAFxT-0-c329b2e4ebe0d075f7f0c3106e144f87)
图2-40
代码位置:见源代码目录下Assets\Scripts\FailPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_2.jpg?sign=1739409032-GEHAHivfh6GxcU7J9EebsIVp8YL8wf1o-0-a0d396fd845bf8f54f43c24f3fc2b9d6)
(10)然后是游戏通关时显示的相关UI管理脚本,和FailPanel.cs一样作为单例,并且将“游戏通关”窗口隐藏,“继续”按钮需要像“再试一次”按钮一样注册一个跳转场景的方法,这里并没有制作下一个关卡,所以没有可以注册的方法。双击打开 SuccessPanel.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\SuccessPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_3.jpg?sign=1739409032-71eZpzPMRsaNzToljJIGXlVma5wv8oZk-0-d611bf5f5bc64d7e69e6ac4e0339cb1c)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_58_1.jpg?sign=1739409032-Vu1LVRsczPtAfFikfPfbpfHSFk6E0KuV-0-ab620219d498edb7b53b93d9a522b88d)
(11)单击 Unity 上方的“播放”按钮运行游戏,可以查看游戏运行效果。至此,本章的实例制作过程介绍完毕。