1
00:00:00,000 --> 00:00:02,277
下面是演示环节。

2
00:00:02,277 --> 00:00:08,903
本节我们讲解《慕课英雄 2》网络版中 游戏房间界面的制作。

3
00:00:08,903 --> 00:00:14,443
这里我们已经在 Unity 编辑器中打开了《慕课英雄 2》的 GameLobby

4
00:00:14,443 --> 00:00:20,860
场景 在上一节演示视频中我们已经添加了房间面板——RoomPanel

5
00:00:20,860 --> 00:00:26,031
现在我们介绍 RoomPanel 的结构 在 RoomPanel

6
00:00:26,031 --> 00:00:31,160
中，RoomLabel 表示游戏画面正上方的游戏房间字样

7
00:00:31,160 --> 00:00:38,570
RoomName 用于显示游戏房间的名称

8
00:00:38,570 --> 00:00:45,890
TeamPanel 表示队伍面板 包括队伍 1 和队伍 2 两个面板

9
00:00:45,890 --> 00:00:55,300
每个队伍面板包含三个子对象 首先是队伍名称标签

10
00:00:55,300 --> 00:01:03,840
接着是两个队伍成员的信息条目 用于显示玩家的姓名和准备情况

11
00:01:03,840 --> 00:01:09,190
画面右下角的 SwitchButton 是切换队伍按钮

12
00:01:09,190 --> 00:01:15,788
用于玩家切换队伍 ReadyButton

13
00:01:15,788 --> 00:01:22,525
用于非房主玩家切换准备状态 对于房主，ReadyButton

14
00:01:22,525 --> 00:01:28,889
则用于开始游戏 Prompt Message

15
00:01:28,889 --> 00:01:35,330
用于显示玩家的错误操作提示信息 [空白_录音]

16
00:01:35,330 --> 00:01:41,209
下面我们为游戏房间面板绑定控制脚本 我们将

17
00:01:41,209 --> 00:01:46,259
RoomPanelController 脚本拖动至 RoomPanel

18
00:01:46,259 --> 00:01:51,410
对象上 [空白_录音]

19
00:01:51,410 --> 00:01:56,813
RoomPanelController 脚本中，需要用到
PUN 组件的 PhotonView 我们选中了

20
00:01:56,813 --> 00:02:02,520
RoomPanel 对象，点击 Inspector
视图中的 ADD Component

21
00:02:02,520 --> 00:02:07,014
按钮 为其绑定 PhotonView

22
00:02:07,014 --> 00:02:11,459
组件 接下来，我们设置RoomPanelController

23
00:02:11,459 --> 00:02:19,325
脚本的参数属性 [空白_录音]

24
00:02:19,325 --> 00:02:26,230
[空白_录音]

25
00:02:26,230 --> 00:02:34,580
[空白_录音] [空白_录音]

26
00:02:34,580 --> 00:02:42,580
[空白_录音]

27
00:02:42,580 --> 00:02:48,274
[空白_录音] 下面我们为

28
00:02:48,274 --> 00:02:52,588
SwitchButton 绑定事件处理函数 我们将

29
00:02:52,588 --> 00:02:58,326
SwitchButton 的事件处理函数
设置为 RoomPanelController

30
00:02:58,326 --> 00:03:03,292
脚本的 ClickSwitchButton ReadyButton

31
00:03:03,292 --> 00:03:09,374
的事件处理函数，我们在游戏运行时动态设置 我们展开

32
00:03:09,374 --> 00:03:17,813
Project 视图，在 Scenes 文件夹中 找到 GameScene 场景。

33
00:03:17,813 --> 00:03:24,274
该场景是游戏战斗场景 点击 Fell 菜单中的 BuildSettings

34
00:03:24,274 --> 00:03:29,652
打开项目构建窗口 点击 ADD Open Scenes 按钮，将

35
00:03:29,652 --> 00:03:35,209
GameScene 场景加入场景构建列表 接下来，返回

36
00:03:35,209 --> 00:03:41,610
GameLobby 场景 构建我们目前制作的项目

37
00:03:41,610 --> 00:03:48,850
我们将项目命名为 LobbyText

38
00:03:48,850 --> 00:03:56,690
[空白_录音] [空白_录音]

39
00:03:56,690 --> 00:04:05,400
[空白_录音] 项目构建完毕后

40
00:04:05,400 --> 00:04:13,400
我们运行两个项目程序

41
00:04:13,400 --> 00:04:18,902
[空白_录音] 返回

42
00:04:18,902 --> 00:04:25,950
Unity 编辑器 点击预览游戏按钮

43
00:04:25,950 --> 00:04:35,500
这样我们就启动了三个游戏客户端 首先我们操作第一个游戏客户端

44
00:04:35,500 --> 00:04:43,131
点击登录按钮，连接 Photon 服务器 这里如果你无法连接到 Photon

45
00:04:43,131 --> 00:04:49,884
服务器 可能的原因是你的路由器为你的电脑分配了 新的 IP 地址。

46
00:04:49,884 --> 00:04:58,130
你可以按照我们之前讲过的方法 在 PhotonControl 和
PhotonServerSettings中重新设置正确的 IP

47
00:04:58,130 --> 00:05:04,870
地址 进入游戏大厅后，我们点击创建房间按钮

48
00:05:04,870 --> 00:05:14,190
创建一个四人游戏房间 创建

49
00:05:14,190 --> 00:05:19,976
完游戏房间后，第一个客户端进入了游戏房间界面 在队伍

50
00:05:19,976 --> 00:05:27,520
1 中显示该玩家的昵称 玩家状态显示为房主

51
00:05:27,520 --> 00:05:34,912
下面我们操作第二个游戏客户端 点击登录按钮，连接

52
00:05:34,912 --> 00:05:40,790
Photon 服务器 进入大厅后

53
00:05:40,790 --> 00:05:44,624
大厅显示第一个客户端创建的房间。

54
00:05:44,624 --> 00:05:51,810
我们点击进入房间按钮 第二个客户端进入了游戏房间

55
00:05:51,810 --> 00:05:59,130
游戏房间显示玩家的昵称 玩家的状态为未准备

56
00:05:59,130 --> 00:06:04,410
我们点击切换队伍按钮，可以自由切换玩家所在的队伍

57
00:06:04,410 --> 00:06:09,650
点击准备按钮，切换玩家的准备状态

58
00:06:09,650 --> 00:06:19,500
当玩家处于准备状态 点击切换队伍按钮不会改变玩家的队伍信息

59
00:06:19,500 --> 00:06:26,853
左下方提示信息显示准备状态下不能切换队伍 接下来我们操作

60
00:06:26,853 --> 00:06:33,660
Unity 编辑器中的客户端 进入大厅

61
00:06:33,660 --> 00:06:42,680
进入游戏房间 进入房间后，点击切换队伍按钮

62
00:06:42,680 --> 00:06:48,300
由于另一队伍人数已满，提示信息显示

63
00:06:48,300 --> 00:06:53,000
另一队伍已满，无法切换，表示玩家切换队伍失败

64
00:06:53,000 --> 00:07:00,310
最后我们回到第一个客户端 该客户端是房主玩家。

65
00:07:00,310 --> 00:07:03,620
ReadyButton 用于开始游戏

66
00:07:03,620 --> 00:07:11,250
我们点击开始游戏按钮，提示信息显示有人未准备，游戏无法开始

67
00:07:11,250 --> 00:07:15,640
我们先把所有非房主玩家切换至准备状态

68
00:07:15,640 --> 00:07:24,409
再点击房主玩家的开始按钮 此时所有玩家都加载了

69
00:07:24,409 --> 00:07:29,680
GameScene 场景 游戏正式开始。

70
00:07:29,680 --> 00:07:34,658
接下来，我们关闭所有的游戏客户端 终止

71
00:07:34,658 --> 00:07:40,312
Unity 编辑器中的游戏预览 下面双击打开

72
00:07:40,312 --> 00:07:45,430
RoomPanelController 脚本

73
00:07:45,430 --> 00:07:51,500
我们讲解该脚本的核心代码 在 OnEnable

74
00:07:51,500 --> 00:07:59,240
函数中 显示游戏房间的名称 清空提示信息

75
00:07:59,240 --> 00:08:07,360
游戏房间的上一级是游戏大厅 我们为返回按钮绑定新的事件处理函数

76
00:08:07,360 --> 00:08:14,861
让客户端离开游戏房间，激活游戏大厅面板 关闭游戏房间的显示。

77
00:08:14,861 --> 00:08:20,270
我们根据 游戏房间的最大人数，计算每个队伍的最大人数

78
00:08:20,270 --> 00:08:28,710
调用 DisableTeamPanel
初始化队伍面板 调用 UpdataTeamPanel

79
00:08:28,710 --> 00:08:37,630
函数，更新队伍面板的显示 房间信息更新完毕后，我们在队伍列表中寻找空余的位置

80
00:08:37,630 --> 00:08:45,732
将新进入房间的玩家信息填入该空余位置 使用自定义属性

81
00:08:45,732 --> 00:08:53,876
CustomPropertles 初始化玩家的自定义属性，包括玩家队伍

82
00:08:53,876 --> 00:08:59,211
Team 玩家队伍顺序 TeamNum，玩家准备状态

83
00:08:59,211 --> 00:09:03,269
isReady 以及玩家得分 Score。

84
00:09:03,269 --> 00:09:09,786
在 OnEnable 函数的最后 调用 ReadyButtonControl

85
00:09:09,786 --> 00:09:14,390
函数 设置玩家 ReadyButton 按钮的事件处理函数

86
00:09:14,390 --> 00:09:20,646
我们覆写 OnPhotonPlayerPropertiesChanged

87
00:09:20,646 --> 00:09:28,100
的回调函数 该回调函数会在房间内玩家的属性发生变更时被调用

88
00:09:28,100 --> 00:09:33,220
我们在该函数中调用 DisableTeamPanel

89
00:09:33,220 --> 00:09:38,340
函数 和 UpdataTeamPanel 函数，更新队伍面板的显示

90
00:09:38,340 --> 00:09:44,080
我们覆写 OnMasterClientSwitch 的回调函数

91
00:09:44,080 --> 00:09:48,903
当房间内的房主 也就是

92
00:09:48,903 --> 00:09:55,296
MasterClient 发生变化时，该回调函数就会被调用 我们在这里重新设置玩家的

93
00:09:55,296 --> 00:09:59,966
ReadyButton 按钮的事件处理函数 我们重写

94
00:09:59,966 --> 00:10:05,040
OnPhotonPlayerDisconnected 回调函数

95
00:10:05,040 --> 00:10:11,462
我们覆写 OnPhotonPlayerDisconnect

96
00:10:11,462 --> 00:10:18,180
回调函数 该函数在有玩家离开房间时被调用

97
00:10:18,180 --> 00:10:24,280
我们在该函数中更新队伍面板中的玩家信息

98
00:10:24,280 --> 00:10:31,566
ClickSwitchButton 函数 用于切换玩家的队伍。

99
00:10:31,566 --> 00:10:35,970
我们首先判断玩家是否处于准备状态

100
00:10:35,970 --> 00:10:42,160
如果玩家处于准备状态，那么玩家不能切换队伍

101
00:10:42,160 --> 00:10:46,860
接着在另一支队伍中寻找空余位置

102
00:10:46,860 --> 00:10:52,990
如果找到空余位置，我们将该玩家放置在新的位置

103
00:10:52,990 --> 00:11:01,010
更新玩家的自定义属性 如果未找到空余位置

104
00:11:01,010 --> 00:11:09,632
则提示信息显示，另一队伍已满，无法切换队伍 ClickReadyButton

105
00:11:09,632 --> 00:11:14,170
函数 对于非房主玩家来说

106
00:11:14,170 --> 00:11:19,490
该函数会更新玩家的自定属性 isReady

107
00:11:19,490 --> 00:11:24,420
更改 ReadyButton 的文本显示内容

108
00:11:24,420 --> 00:11:33,540
ClickStartButton 函数 用于房主玩家开始游戏

109
00:11:33,540 --> 00:11:42,387
该函数首先遍历房间内的所有的非房主玩家 查看他们的准备状态。

110
00:11:42,387 --> 00:11:49,180
如果有玩家未准备 那么提示信息显示有人未准备，游戏无法开始

111
00:11:49,180 --> 00:11:55,505
如果其他玩家均已准备 我们使用 PhotonView

112
00:11:55,505 --> 00:12:00,147
的 RPC 函数 调用 RPC 方法 LoadGameScene 加载

113
00:12:00,147 --> 00:12:05,561
GameScene 游戏战斗场景 关于 PhotonView

114
00:12:05,561 --> 00:12:10,250
和 RPC 我们将在下一单元的课程中进行讲解。

115
00:12:10,250 --> 00:12:18,410
最后，返回 Unity 编辑器 保存游戏场景

116
00:12:18,410 --> 00:12:25,094
[空白_音频] 这样我们就完成了游戏大厅界面

117
00:12:25,094 --> 00:12:32,190
GameLobby 的制作 以上就是本节演示的全部内容
