《土豆荣耀》重构笔记(二十一)制作游戏菜单场景
前言
  到目前为止,我们游戏中只有一个游戏场景,我们还需要制作一个游戏菜单场景,让玩家可以选择开始游戏。
创建游戏菜单场景
  首先,我们在顶部菜单栏选择File->New Scene
,然后按快捷键Ctrl + S
将创建的场景保存至Assets\Scenes
文件夹下,并将其命名为GameMenuScene
。接着,我们创建一个用于绘制UI的Canvas:
创建Canvas的步骤如下:
- 在
Hierarchy
窗口中右击鼠标,选择UI->Canvas
在场景中新建一个Canvas
,然后将其重命名为UICanvas
- 接着修改
UICanvas
下Canvas Scaler
组件Canvas Scaler
组件的属性UI Scale Mode
:Scale With Screen Size
Reference Resolution
:X(1920), Y(1080)
Screen Match Mode
:Match Width or Height
Match
:0.5
  创建完UICanvas
之后,我们开始添加UI,添加UI的步骤如下:
添加
UI
的步骤:
- 在
UICanvas
物体下新建一个Panel
,然后将其重名为BackgroundPanel
,然后删除BackgroundPanel
的Image
组件 - 在
BackgroundPanel
物体下新建一个Panel
,然后其重名为Background
Background
物体需要修改的组件属性:Image
:Source Image
:Assets\Sprites\Environment
文件夹下的env_bg
图片Color
: (255, 255, 255, 255)
- 在
BackgroundPanel
物体下新建一个Panel
,然后其重名为Gherkin
Gherkin
物体需要修改的组件属性:Image
:Source Image
:Assets\Sprites\Environment
文件夹下的env_Gherkin
图片Color
: (255, 255, 255, 255)
- 在
BackgroundPanel
物体下新建一个Panel
,然后其重名为BigBen
BigBen
物体需要修改的组件属性:Image
:Source Image
:Assets\Sprites\Environment
文件夹下的env_BigBen
图片Color
: (255, 255, 255, 255)
- 在
BackgroundPanel
物体下新建一个Panel
,然后其重名为Bank
Bank
物体需要修改的组件属性:Image
:Source Image
:Assets\Sprites\Environment
文件夹下的env_Bank
图片Color
: (255, 255, 255, 255)
- 在
BackgroundPanel
物体下新建一个Panel
,然后其重名为River
River
物体需要修改的组件属性:Rect Transform
:Left
: 0Top
: 1000Right
: 0Bottom
: 0
Image
:Source Image
:Assets\Sprites\Environment
文件夹下的env_RiverBase
图片Color
: (255, 255, 255, 255)
- 在
UICanvas
物体下新建一个Image
,然后其重名为OptionWindow
OptionWindow
物体需要修改的组件属性:Rect Transform
:Anchors
: 点击Rect Transform
组件左上角的方框,然后选择middle-left
PosX
: 500PosY
: -55Width
: 540Height
: 720
Image
:Source Image
:Assets\Sprites\UI
文件夹下的SF Window
图片Color
: (8, 68, 225, 110)
- 在
OptionWindow
物体下新建一个Button
,然后其重名为StartButton
StartButton
物体需要修改的组件属性:Rect Transform
:PosX
: 0PosY
: 110Width
: 320Height
: 120
Image
:Source Image
:Assets\Sprites\UI
文件夹下的SF Button
图片
- 修改
StartButton
物体下的子物体Text
Text
物体需要修改的组件属性:Text
:Text
:Start
Font
:Assets\Fonts
下的BradBunR
字体文件Font Size
: 80Color
: (255, 255, 255, 255)
- 在
OptionWindow
物体下新建一个Button
,然后其重名为ExitButton
ExitButton
物体需要修改的组件属性:Rect Transform
:PosX
: 0PosY
: -110Width
: 320Height
: 120
Image
:Source Image
:Assets\Sprites\UI
文件夹下的SF Button
图片
- 修改
ExitButton
物体下的子物体Text
Text
物体需要修改的组件属性:Text
:Text
:Exit
Font
:Assets\Fonts
下的BradBunR
字体文件Font Size
: 80Color
: (255, 255, 255, 255)
- 在
UICanvas
物体下新建一个Text
,然后其重名为Title
Title
物体需要修改的组件属性:Rect Transform
:Anchors
: 点击Rect Transform
组件左上角的方框,然后选择top-center
PosX
: 0PosY
: -100Width
: 600Height
: 180
Text
:Text
:Potato Glory
Font
:Assets\Fonts
下的BradBunR
字体文件Font Size
: 120Alignment
: 水平居中,垂直居中Color
: (255, 255, 255, 255)
- 在
UICanvas
物体下新建一个Text
,然后其重名为Author
Author
物体需要修改的组件属性:Rect Transform
:Anchors
: 点击Rect Transform
组件左上角的方框,然后选择bottom-right
PosX
: -200PosY
: 115Width
: 340Height
: 80
Text
:Text
:@RainbowCyan
Font
:Assets\Fonts
下的BradBunR
字体文件Font Size
: 60Alignment
: 水平居中,垂直居中Color
: (119, 119, 119, 255)
  至此,我们就完成了游戏菜单场景的UI制作,其效果图如下:
在UI上添加能动的物体
  添加完游戏菜单场景的UI之后,我们发现整个界面的右边比较空旷,影响美感,因此我们希望能在右边加上一些会动的物体来装饰界面。因为加入的物体需要能动,使用Unity提供的UI难以实现,所以我们选择可以使用动画的GameObject
作为我们的装饰物
。
添加
装饰物
的步骤:
- 在场景中新建一个名为
Decoration
的Empty GameObject
,并将其Position
设置为(0, 0, 0)
- 将
Assets\Prefabs\Character
文件夹下的Player
这一Prefab拖拽到Decoration
物体上成为其子物体对
Player
物体的操作如下:- 设置
Position
为(0.53, -0.85, 0)
,Rotation
为(0, 0, 14.5)
- 移除
Player
物体上除了Animator
组件外,的其他所有组件(有依赖关系,注意先移除脚本,再移除其他组件)
- 删除
Player
物体下的HealthBarDisplay
、GroundCheck
和GroundCheck
子物体
- 设置
- 将
Assets\Prefabs\Character
文件夹下的AlienSlug
这一Prefab拖拽到Decoration
物体上成为其子物体对
AlienSlug
物体的操作如下:- 设置
Position
为(2.84, 1.31, 0)
,Scale
为(-1, 1, 1)
- 移除
AlienSlug
物体上除了Animator
组件外,的其他所有组件(有依赖关系,注意先移除脚本,再移除其他组件)
- 删除
AlienSlug
物体下的FrontCheck
子物体
- 设置
- 将
Assets\Prefabs\Character
文件夹下的AlienShip
这一Prefab拖拽到Decoration
物体上成为其子物体对
AlienShip
物体的操作如下:- 设置
Position
为(6.3, 1.6, 0)
,Scale
为(-1, 1, 1)
- 移除
AlienShip
物体上除了Animator
组件外,的其他所有组件(有依赖关系,注意先移除脚本,再移除其他组件)
- 删除
AlienShip
物体下的FrontCheck
子物体
- 设置
- 将
Assets\Sprites\Environment
文件夹下的env_PlatformUfo
图片拖拽到Decoration
物体上成为其子物体对
env_PlatformUfo
物体的操作如下:- 设置
Position
为(5.32, -0.72, 0)
,Rotation
为(0, 0, 18.2)
,Scale
为(0.2, 0.2, 0.2)
- 设置
- 将
Assets\Sprites\Environment
文件夹下的env_UfoLegs
图片拖拽到env_PlatformUfo
物体上成为其子物体对
env_UfoLegs
物体的操作如下:- 设置
Position
为(0, 3.8, 0)
,Rotation
为(0, 0, 0)
,Scale
为(1, 1, 1)
- 设置
  添加完毕之后,我们发现在Game
窗口中看不到我们添加的GameObject
。如何让GameObject
显示在Canvas之上?这里,我们想到了前面提到的Canvas绘制方式中的Screen Space - Camera
。因此,我们需要将UICanvas
物体上Canvas
组件的Render Mode
设置为Screen Space - Camera
,并将Canvas
组件的Render Camera
设置为场景中的Main Camera
。最后,我们发现装饰物偏大,因此我们将Main Camera
物体上Camera
组件的Size
设置为6.8
。此时,我们发现已经能在Game
窗口中看到我们添加的GameObject
了。
加入控制代码
  在场景中添加GameObject
作为装饰物之后,我们还需要添加控制代码。首先,我们在Assets\Scrpits\Manager
文件夹下创建一个名为MenuSceneManager
的C#脚本,然后编辑MenuSceneManager.cs
:
1 |
|
  编辑完MenuSceneManager.cs
之后,我们在场景中创建一个名为MenuSceneManager
的Empty GameObject
,然后为MenuSceneManager
添加MenuSceneManager.cs
。接着,我们来设置OptionWindow
物体的子物体StartButton
的点击事件。
StartButton
点击事件的设置步骤:
- 选中
StartButton
物体,然后点击其Button
组件上On Click()
下的+
号增加一个空点击事件
- 将场景中的
MenuSceneManager
拖拽至On Click()
下的GameObject
赋值框处 - 点击
No Function
下拉菜单,选择MenuSceneManager
下的StartGame函数
  最后,我们按照相同的步骤,将OptionWindow
物体的子物体ExitButton
的点击事件设置为MenuSceneManager
下的ExitGame函数
修改GameStateManager.cs并修改BuildSetting
  在前面的文章中,因为我们还没有创建游戏菜单场景,所有GameStateManager.cs
中用于返回游戏菜单场景的Back函数
我们留空了。现在我们已经创建好了游戏菜单场景,因此我们需要补全GameStateManager.cs
的Back函数
:
1 |
|
  修改完成之后,我们运行游戏,点击Start
按钮,发现场景并没有跳转。这是因为我们还没有将我们创建好的GameMenuScene
和SinglePlayerGameScene
添加至Build Setting
中。选择顶部菜单栏的File->Build Settings...
打开Build Setting
窗口,然后同时选中Assets\Scenes
文件夹下的GameMenuScene
和SinglePlayerGameScene
将它们拖拽至Build Setting
窗口的Scenes In Build
处(游戏运行时,会默认加载下标为0的场景,因此我们要确保GameMenuScene的下标为0)
。
  再次运行游戏,点击Start
按钮,此时场景跳转到SinglePlayerGameScene
场景。在SinglePlayerGameScene
中点击BackButton
按钮,然后再点击Yes
按钮,场景则跳转回GameMenuScene
场景。
后言
  至此,我们就已经完成了制作游戏菜单场景的所有工作。最后,本篇文章所做的修改,可以在PotatoGloryTutorial这个仓库的essay19
分支下看到,读者可以clone这个仓库到本地进行查看。