![游戏设计与开发: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=1739083931-G5g8seLdYNf4QRzEcHp1datgyNVIcFp3-0-a3e15e6ec2ec723d829d04fc00343bc9)
回到Unity编辑器,选中主摄像机,将游戏物体Player拖动到检视窗口(Inspector)的Camera Follow(Script)的参数Player旁边的输入框中,对所需要的参数进行赋值,如图2-34所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_2.jpg?sign=1739083931-0Y02thKi3eP0WB0EbCCkeT7vrOl3uppd-0-14cfdbcc93c670e10ba23819669ef094)
图2-34
(2)该游戏有三个活动地板,每个活动地板的活动路径都不一样,第一个活动地板的活动路径为上下移动。双击打开GroundMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\GroundMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_3.jpg?sign=1739083931-R8qivccTH3bizE7lWR68wIz072SJBs8f-0-159c0efe15d8d53690a9207cdd78079d)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_1.jpg?sign=1739083931-SUKZq7U6DzeR1g3kOiA8UwMyRmqjg7Ss-0-523852f5517a5e9c7a58ff8fb2351559)
第二个活动地板为左右移动,双击打开Ground7LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground7LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_2.jpg?sign=1739083931-5yOkfVGDQYNDtki3HP6zY9l5aRypTDWb-0-f3f59bdb9e88bd75151588253425b2fa)
第三个活动地板为左右移动,但是它与第二个活动地板的移动范围不同。双击打开Ground8LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground8LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_3.jpg?sign=1739083931-68IM56EbmxyOYWYKJQU0ggrzaZw0NWsx-0-b071fec219238a0ded623b1e5de13ee5)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_1.jpg?sign=1739083931-Vgtt4Tb6rpFNjzZji9OofocIra37VFaP-0-2742f2289bea7f445c46935e4eea7197)
(3)场景中有几处陷阱。其中,一个陷阱是当角色靠近到一定距离时开始下落的,玩家需要及时调整角色前进的速度。双击打开Firedown.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Firedown.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_2.jpg?sign=1739083931-Mark67lJdz3y3rdWftrC62qEemiOac93-0-055b522617a28e3863aeb434f82da941)
运行效果如图2-35所示,当角色前进到火焰下方时,火焰向下运动并攻击角色。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_1.jpg?sign=1739083931-aFnJ6SvY8FTlU58ZkrL3a3urvbEsoEoY-0-d1ef441ca40db2a66d0347859e8690b5)
图2-35
在平台跳跃游戏中,为了使场景中的前、中、后景有明显的差异表现,有一种较简单的处理方法,就是使每个层次的贴图和镜头移动的相对速度不一致,从而模拟出一种有纵深感的效果。双击打开BackgroundFollow.cs脚本,编辑脚本,脚本代码如下。具体效果可以查看工程源文件。
代码位置:见源代码目录下Assets\Scripts\BackgroundFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_2.jpg?sign=1739083931-tMjSaKEPdB777HizbtXnRhjAMpKhnplq-0-487b627c2861ba8462c6b2df45525a51)
(4)在该游戏中,红心是场景中散落的收集要素,和很多2D游戏里的金币一样,当角色靠近时会被收集。双击打开Coin.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Coin.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_3.jpg?sign=1739083931-XwlCF8IDdLMZHGtjSfLBxpXPtSanwTsN-0-603c925b6d3fc5b7a3d709e303604bd8)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_1.jpg?sign=1739083931-sWahqAxQVTX61qUQ4kwG4ffd1LIKkKTi-0-beed573d64aaccfa99a45604d05a3544)
同样地,需要回到Unity对Coin脚本的参数进行赋值,如图2-36所示。将与字段同名的游戏物体分别拖动到对应的字段上,Is Run和U Icoin两个参数保留默认值即可。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_2.jpg?sign=1739083931-heoE6YOXb06304wUNNV1DRbutaDURYYD-0-eb249b7ddbceedc0558ffd62986bb915)
图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=1739083931-XQEs72i720NkbYKqmGxQvGvJbN3ke1wF-0-4ab2ceb7687507a069fa2770f929c3fb)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_52_1.jpg?sign=1739083931-zdZfupP9BVM6sHx0EZ1mIMSyjmqg0Acw-0-d23ccbb8d4cf6fb8318a1e5a41aa1dbf)
角色的碰撞盒需要检测一些触发事件,当角色碰到障碍物时游戏结束,当角色碰到关卡出口的碰撞体时游戏通关。双击打开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=1739083931-tPNGhAWYWq6WxLEXDRdNxteAS4d0sz1l-0-b73ae8a2f2951503569f0aa801ccd5e7)
下面介绍角色和场景中的道具互动的相关逻辑。该游戏目前有收集红心用的道具、火人变冰人道具,以及磁吸红心效果的磁吸道具。双击打开PlayerMove.cs脚本,编辑脚本。在当前脚本对相关的游戏物体进行初始设置,可以在步骤(5)看到在红心控制的脚本中调用了当前脚本的Money字段和SetMoney方法,而磁吸时间条的显示则由脚本Magnet触发。具体脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_53_2.jpg?sign=1739083931-Z1S9aL7DSbC8YX2sj5ekR9ORnRyCsSia-0-a22bad7704b9ec6f4c1f9eed0aec46f1)
回到Unity编辑器,对游戏物体Player的Player Move脚本组件的字段Money Text和HP进行拖动并赋值,将游戏物体拖动到对应的输入框中,方法参考步骤(1)。缩小角色,使其跳跃力变大来通过原本过不去的火焰并且收集到红心,如图2-37所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_1.jpg?sign=1739083931-ugYazSe1QgqgiHMIIXhnqCeYcVoEDF9Q-0-7376ab36bface0e5d1f48635c8aab61a)
图2-37
(6)在该游戏中有一个障碍物—冰墙,这个障碍物需要玩家拿到火人变冰人的道具,让火人变成冰人后就可以通过冰墙了。该道具在原地旋转,当玩家控制的角色踏入该道具的触发器内则可获得该道具,使角色变成冰人,场景中的冰墙变成可以通过的触发器状态,将该道具的游戏物体设为不显示,相当于删除道具,但实际上,场景中还存在该游戏物体。双击打开RainbowMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\RainbowMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_2.jpg?sign=1739083931-Co1Cupn4HdzRjtDUxPFUsUckhywnhB4N-0-f29c391eaf1a896ee418e3024b9a18bf)
回到Unity,对游戏物体RainbowPlayer的RainbowMove(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,对Tupian的参数进行设置,如图2-38所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_1.jpg?sign=1739083931-xXHMhlsSAshRI74knRouRF3aFrhuiKSI-0-b0d3cb713ed998f84427e6aae49966a1)
图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=1739083931-1orhpsWHjuCdDYmBoJ8LgAtbjtUGexNZ-0-7632067c60a94ee89089680582843c2f)
回到Unity,选中游戏物体MagnetBox,在检视窗口(Inspector)中对Magnet Follow(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,如图2-39所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_3.jpg?sign=1739083931-UHFAHKtqjTAVAoW2wGyO3L1hRQzdYxAH-0-23d2160099920fceef0c73971d0f7c5c)
图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=1739083931-2Bvf5W9FpRxjFxA2EiGCbOn9ACFIZbWa-0-ecaaf35e47e88275bc024f2d45b0458b)
回到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=1739083931-T8mXgFAdJgICddzkaWxCOBYct8sKlHBY-0-ae40fa7566e46ee0eef05ea15fb4953c)
图2-40
代码位置:见源代码目录下Assets\Scripts\FailPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_2.jpg?sign=1739083931-vBU4flouInvW1JgngEZUc01elRMhYlj8-0-36ce8cc54cfeae5408a3d755427ecc40)
(10)然后是游戏通关时显示的相关UI管理脚本,和FailPanel.cs一样作为单例,并且将“游戏通关”窗口隐藏,“继续”按钮需要像“再试一次”按钮一样注册一个跳转场景的方法,这里并没有制作下一个关卡,所以没有可以注册的方法。双击打开 SuccessPanel.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\SuccessPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_3.jpg?sign=1739083931-hFkatBSWUaTFz3fZObcTLD5WPkuHeZCA-0-0d44350704ca67555d7ac0ed9796616f)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_58_1.jpg?sign=1739083931-zqSV0iGA6gghfxoDF9JXmx0EnjN2WVuV-0-6fd079a33282340bf3b1672df92cc058)
(11)单击 Unity 上方的“播放”按钮运行游戏,可以查看游戏运行效果。至此,本章的实例制作过程介绍完毕。