![游戏设计与开发: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=1739594712-OHnvoCHGtW9a2AqvROGyfUPC5xlVnPro-0-6862b08bd999b54359c70b94d32fd487)
回到Unity编辑器,选中主摄像机,将游戏物体Player拖动到检视窗口(Inspector)的Camera Follow(Script)的参数Player旁边的输入框中,对所需要的参数进行赋值,如图2-34所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_2.jpg?sign=1739594712-DVz0HLQK0M2mvLzbicZJ5rjgj1AMZH0D-0-0c2bfdec4ff40fa0333fb97a72649dfb)
图2-34
(2)该游戏有三个活动地板,每个活动地板的活动路径都不一样,第一个活动地板的活动路径为上下移动。双击打开GroundMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\GroundMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_47_3.jpg?sign=1739594712-EJwHO3KFJ0vNAOOGs6DRkBotWWtYLcNz-0-e203bae840cbc01fdca308aa4fdd57d3)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_1.jpg?sign=1739594712-uy1G9uCu3Csa7bPdtLSr0sXkGAdKb7N9-0-2ca194121f76a05d65bef71bd0e0dca5)
第二个活动地板为左右移动,双击打开Ground7LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground7LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_2.jpg?sign=1739594712-BR4WxUeIYPzOzKVEShdLCCStjllRczkC-0-e8436b2802bc4258131197bdd7aeeb6a)
第三个活动地板为左右移动,但是它与第二个活动地板的移动范围不同。双击打开Ground8LeftMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Ground8LeftMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_48_3.jpg?sign=1739594712-V346ykRcSQ2DOiiN1z7AgiY3onkVAFyj-0-d19312fdb5928bf2a7acfb344bd121a4)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_1.jpg?sign=1739594712-h3GRy75VDQeGjEHBblFygnjJnPt0eN6O-0-a52a2a7a32422c1fb8281e3fafda4cb9)
(3)场景中有几处陷阱。其中,一个陷阱是当角色靠近到一定距离时开始下落的,玩家需要及时调整角色前进的速度。双击打开Firedown.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Firedown.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_49_2.jpg?sign=1739594712-R7jD7m1PBbJqJu8TaJAnb8NAZAaWAY4v-0-39a7aebc49ee247976eb815dd1d09b9f)
运行效果如图2-35所示,当角色前进到火焰下方时,火焰向下运动并攻击角色。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_1.jpg?sign=1739594712-WNLO6xuoyTed09hjQQA6i2n2wYOMPFe4-0-62bbc0ce241eb89e8feb6711c1056283)
图2-35
在平台跳跃游戏中,为了使场景中的前、中、后景有明显的差异表现,有一种较简单的处理方法,就是使每个层次的贴图和镜头移动的相对速度不一致,从而模拟出一种有纵深感的效果。双击打开BackgroundFollow.cs脚本,编辑脚本,脚本代码如下。具体效果可以查看工程源文件。
代码位置:见源代码目录下Assets\Scripts\BackgroundFollow.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_2.jpg?sign=1739594712-SZgmMgiu7fpZNVveggJNefUxcpVRGwyk-0-69bd89d04298d78f49b042c78555497c)
(4)在该游戏中,红心是场景中散落的收集要素,和很多2D游戏里的金币一样,当角色靠近时会被收集。双击打开Coin.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\Coin.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_50_3.jpg?sign=1739594712-W0OaKWHsVQYuJ1RyyukLdsw4YRjebvfM-0-c6304eb9b48d190bf3ff2fc4368e1048)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_1.jpg?sign=1739594712-gZAH1mtTzEOm43ZIILTLHnQ0SmIFTMtw-0-f7f16e5a1fd7ae820e71c2c998367cc8)
同样地,需要回到Unity对Coin脚本的参数进行赋值,如图2-36所示。将与字段同名的游戏物体分别拖动到对应的字段上,Is Run和U Icoin两个参数保留默认值即可。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_51_2.jpg?sign=1739594712-cww1gyMmAFXjkgjM4TkqqRoB8BqDtLSI-0-2e336189744e49157fedcc9b9e900b58)
图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=1739594712-sLE8QjrECNF6xJDtvA4aPeiiJeXwWNIE-0-67de4d0c3b3a8f69a430f19c6a453b0f)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_52_1.jpg?sign=1739594712-uSaQMCinZX1nUKkMmDvm6FsTpXTCBX4K-0-df43ef4f12b315afde876319f5ce8752)
角色的碰撞盒需要检测一些触发事件,当角色碰到障碍物时游戏结束,当角色碰到关卡出口的碰撞体时游戏通关。双击打开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=1739594712-vyOGsxPD678dKYjMZpHb5hGSec5G0KNx-0-a56a1c15cd04e59d929de88930aec6a9)
下面介绍角色和场景中的道具互动的相关逻辑。该游戏目前有收集红心用的道具、火人变冰人道具,以及磁吸红心效果的磁吸道具。双击打开PlayerMove.cs脚本,编辑脚本。在当前脚本对相关的游戏物体进行初始设置,可以在步骤(5)看到在红心控制的脚本中调用了当前脚本的Money字段和SetMoney方法,而磁吸时间条的显示则由脚本Magnet触发。具体脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\PlayerMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_53_2.jpg?sign=1739594712-k48MnuQjjAHEPVlmhxA6hK7QaP1mVRhH-0-65d48e24505be9462f5d80caae6e3ace)
回到Unity编辑器,对游戏物体Player的Player Move脚本组件的字段Money Text和HP进行拖动并赋值,将游戏物体拖动到对应的输入框中,方法参考步骤(1)。缩小角色,使其跳跃力变大来通过原本过不去的火焰并且收集到红心,如图2-37所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_1.jpg?sign=1739594712-PQJ5wy4Ia24hMY4bXdxYC2fuCMboOTtY-0-4a60383dcec87681de0e5e086abd3ed9)
图2-37
(6)在该游戏中有一个障碍物—冰墙,这个障碍物需要玩家拿到火人变冰人的道具,让火人变成冰人后就可以通过冰墙了。该道具在原地旋转,当玩家控制的角色踏入该道具的触发器内则可获得该道具,使角色变成冰人,场景中的冰墙变成可以通过的触发器状态,将该道具的游戏物体设为不显示,相当于删除道具,但实际上,场景中还存在该游戏物体。双击打开RainbowMove.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\RainbowMove.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_54_2.jpg?sign=1739594712-jcoLgK79oX9VdVg513ajFuVCdnzFc8iz-0-7fdbb09323ec9e50cb38f276e5c1a3ff)
回到Unity,对游戏物体RainbowPlayer的RainbowMove(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,对Tupian的参数进行设置,如图2-38所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_1.jpg?sign=1739594712-UYygtGGI94EwjHxx5eog6W3omF5oiRuI-0-e1019192a10b4166cefcbf8d16dbf7b5)
图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=1739594712-9rsXTsoxclfDGez2G57tCDbtI6HmoUnL-0-089a3343e49869671e6c8e30992f2f67)
回到Unity,选中游戏物体MagnetBox,在检视窗口(Inspector)中对Magnet Follow(Script)上的参数进行拖动并赋值,方法参考步骤(1),将游戏物体和贴图拖动到对应的位置,如图2-39所示。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_55_3.jpg?sign=1739594712-5F9s0smuPTUmql1FZBAs6AhYjeZbQYSv-0-c2218e91dc408e7a9406a866bc11d351)
图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=1739594712-qzLtm4QpYv0VKT7Q3qy8mHsrffILpAZf-0-148b60a827ced1315240fceda118c174)
回到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=1739594712-xTEmluLveXmtRt5R2BS2EhmPnW6pfqTV-0-e22efd5f98888e7fe7080e5d83619c20)
图2-40
代码位置:见源代码目录下Assets\Scripts\FailPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_2.jpg?sign=1739594712-29McAT2CRVWd8Nr7ccJrNIWemQMjbB7k-0-9ce4580a677b12b7f0755a340cec75b3)
(10)然后是游戏通关时显示的相关UI管理脚本,和FailPanel.cs一样作为单例,并且将“游戏通关”窗口隐藏,“继续”按钮需要像“再试一次”按钮一样注册一个跳转场景的方法,这里并没有制作下一个关卡,所以没有可以注册的方法。双击打开 SuccessPanel.cs脚本,编辑脚本,脚本代码如下。
代码位置:见源代码目录下Assets\Scripts\SuccessPanel.cs。
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_57_3.jpg?sign=1739594712-4NsOhAYaeeTuHusmrtD02bt7ngoZipEw-0-dc425ee0a9052c4bc566545f4c70fbc7)
![](https://epubservercos.yuewen.com/9A2E4E/23020637701641706/epubprivate/OEBPS/Images/42155_58_1.jpg?sign=1739594712-sMs6EbMWBB2SkiFzxY6WfuyhQZKLaduZ-0-b8e349a1842fc9ed0cd777d255fb6e9d)
(11)单击 Unity 上方的“播放”按钮运行游戏,可以查看游戏运行效果。至此,本章的实例制作过程介绍完毕。