1
00:00:00,000 --> 00:00:04,480
欢迎大家继续学习《Unity 游戏编程进阶》

2
00:00:04,480 --> 00:00:14,275
本节我们讲解 游戏房间界面的实现

3
00:00:14,275 --> 00:00:19,500
本节将采用 PPT 讲解加项目演示的方式介绍游戏房间界面相关的知识要点

4
00:00:19,500 --> 00:00:24,420
在项目演示环节，我们演示了游戏房间界面在《慕课英雄 2》项目中的具体应用

5
00:00:24,420 --> 00:00:31,128
希望大家可以根据自己的专业基础和学习能力，从以下三种方法中选择一种来学习
第一种方法，先看

6
00:00:31,128 --> 00:00:37,140
PPT 讲解，对相关知识有一个系统的了解，然后观看项目演示视频，学习知识点的运用

7
00:00:37,140 --> 00:00:42,238
第二种方法，先看项目演示视频，了解知识要点的具体应用，再回到 PPT

8
00:00:42,238 --> 00:00:48,670
讲解阶段，有针对性地学习相关知识要点 第三种方法，跳过
PPT 讲解，直接进入项目演示

9
00:00:48,670 --> 00:00:54,820
通过理解项目中的知识要点的运用，完成相关知识要点的学习，不需回顾 PPT 讲解。

10
00:00:54,820 --> 00:01:01,534
下面进入 PPT讲解阶段 玩家进入房间后 OnJoinedRoom

11
00:01:01,534 --> 00:01:07,141
回调函数被调用，我们在该回调函数中启用 RoomPanel 游戏房间面板。

12
00:01:07,141 --> 00:01:13,762
RoomPanel 游戏房间面板显示房间内玩家的信息
游戏房间内有且仅有一名房主，也就是

13
00:01:13,762 --> 00:01:19,135
PUN 中的 MasterClient 它通常是创建游戏房间的玩家。

14
00:01:19,135 --> 00:01:23,860
当创建游戏房间的玩家退出房间时，Photon 服务器

15
00:01:23,860 --> 00:01:28,100
将指定房间的另一名玩家作为新的 MasterClient

16
00:01:28,100 --> 00:01:35,313
在游戏房间面板中，玩家点击切换队伍按钮，选择自己所在的队伍 非

17
00:01:35,313 --> 00:01:40,690
MasterClient 玩家点击准备按钮，切换自己的准备状态

18
00:01:40,690 --> 00:01:47,950
所有玩家进入准备状态后，MasterClient
点击开始游戏按钮，所有玩家进入游戏战斗场景

19
00:01:47,950 --> 00:01:51,370
下面我们讲解游戏房间面板 RoomPanel 的实现

20
00:01:51,370 --> 00:01:56,557
[空白_录音] 本页 PPT

21
00:01:56,557 --> 00:02:01,352
给出了游戏房间面板的各个 UI 控件 在 Hierarchy

22
00:02:01,352 --> 00:02:07,731
层级视图中的组织结构，其中 RoomName 表示房间名称，TeamPanel

23
00:02:07,731 --> 00:02:13,230
显示玩家的队伍信息和准备状态 SwitchButton 用于切换玩家的队伍

24
00:02:13,230 --> 00:02:18,585
在非 MasterClient 玩家所在的客户端 ReadyButton

25
00:02:18,585 --> 00:02:24,188
用于切换玩家的准备状态 在 MasterClient
所在的客户端，ReadyButton

26
00:02:24,188 --> 00:02:28,820
用于开始游戏 PromptMessage 用于提示玩家操作失败

27
00:02:28,820 --> 00:02:34,809
进入 房间后，玩家通过

28
00:02:34,809 --> 00:02:41,598
Photon 服务器获得同意房间内其他玩家的信息
也可以通过 Photon 服务器向其他玩家发送信息。

29
00:02:41,598 --> 00:02:47,474
PhotonPlayer 类用于保存玩家信息
PhotonPlayer 类包含了玩家的昵称和

30
00:02:47,474 --> 00:02:52,737
ID 信息 我们可以使用
PhotonPlayer.SetCustomProperties

31
00:02:52,737 --> 00:02:59,808
函数 设置玩家的自定义属性，自定义属性使用哈希表来保存
本页 PPT 给出了《慕课英雄

32
00:02:59,808 --> 00:03:05,961
2》中玩家的自定义属性 其中 Team 表示玩家的队伍，TeamNum

33
00:03:05,961 --> 00:03:11,645
表示玩家在队伍中的编号 isReady 表示玩家的准备状态，Score

34
00:03:11,645 --> 00:03:17,138
表示玩家的得分 RoomPanelController

35
00:03:17,138 --> 00:03:22,130
是游戏房间面板的控制脚本 我们在该脚本的 OnEnable

36
00:03:22,130 --> 00:03:28,720
回调函数中，初始化游戏房间信息 首先我们使用
PhotonNetwork.room.name

37
00:03:28,720 --> 00:03:36,680
获取房间的名称，其次清空玩家操作未成功的提示信息 promptMessage。

38
00:03:36,680 --> 00:03:41,268
接着，根据房间最大人数计算每支队伍的最大人数 保存在

39
00:03:41,268 --> 00:03:46,199
teamSize 变量中，然后调用 DisableTeamPanel

40
00:03:46,199 --> 00:03:51,023
函数 禁用队伍面板中所有的玩家信息控件 最后，调用

41
00:03:51,023 --> 00:03:56,310
UpdateTeamPanel 函数，在队伍面板中更新玩家信息

42
00:03:56,310 --> 00:04:01,736
下面讲解 DisableTeamPanel

43
00:04:01,736 --> 00:04:06,740
函数 我们遍历两支队伍的信息面板，获得玩家信息的显示控件

44
00:04:06,740 --> 00:04:11,375
使用 SetActive 函数禁用这些控件

45
00:04:11,375 --> 00:04:16,010
下面讲解 UpdateTeamPanel 函数

46
00:04:16,010 --> 00:04:23,274
该函数用于更新队伍面板中的玩家信息 函数参数 isUpdateSelf

47
00:04:23,274 --> 00:04:28,630
表示是否显示本地玩家的信息 UpdateTeamPanel

48
00:04:28,630 --> 00:04:34,428
函数，遍历房间内的所有玩家 对于每个玩家首先获取 Team 和 TeamNum

49
00:04:34,428 --> 00:04:39,995
属性，确定玩家信息显示的位置 然后在显示位置处填入玩家的昵称和状态。

50
00:04:39,995 --> 00:04:45,325
如果玩家是 MasterClient 玩家状态栏显示房主，如果玩家不是

51
00:04:45,325 --> 00:04:53,135
MasterClient 玩家状态栏显示玩家的准备状态

52
00:04:53,135 --> 00:04:57,586
下面我们继续讲解 RoomPanelController 脚本的

53
00:04:57,586 --> 00:05:03,070
OnEnable 函数 远程玩家的信息显示完毕后，本地玩家查找

54
00:05:03,070 --> 00:05:11,296
队伍面板中空缺的位置，把自己的昵称和状态填入该位置
接下来设置玩家的自定义属性，玩家的

55
00:05:11,296 --> 00:05:16,615
Team 和 TeamNum 属性 由该玩家在队伍面板中的位置决定。

56
00:05:16,615 --> 00:05:21,035
玩家的 isReady 属性设为 false 表示玩家未准备。

57
00:05:21,035 --> 00:05:24,860
玩家的 Score 属性设为 0，重置玩家的得分

58
00:05:24,860 --> 00:05:30,990
[空白_录音] 在 Enable 函数的最后，调用

59
00:05:30,990 --> 00:05:36,766
ReadyButtonControl 函数
设置本地客户端的 ReadyButton 按钮。

60
00:05:36,766 --> 00:05:41,306
如果本地玩家是 MasterClient isMasterClient 的属性为

61
00:05:41,306 --> 00:05:46,698
true，我们把 ReadyButton
按钮上的文字改为"开始游戏" 并把它的点击事件处理函数设置为

62
00:05:46,698 --> 00:05:52,196
ClickStartGameButton 用于 MasterClient 开始游戏。

63
00:05:52,196 --> 00:05:58,090
如果玩家不是 MasterClient
isMasterClient 的属性为 false，我们把

64
00:05:58,090 --> 00:06:03,078
ReadyButton 按钮上的文字改为"准备" 并把它的事件处理函数设置为

65
00:06:03,078 --> 00:06:11,460
ClickReadyButton 用于玩家切换准备状态

66
00:06:11,460 --> 00:06:18,684
下面讲解开始游戏按钮的事件处理函数，ClickStartGameButton
MasterClient

67
00:06:18,684 --> 00:06:23,120
点击开始游戏按钮，Unity 执行 ClickStartGameButton 函数

68
00:06:23,120 --> 00:06:28,232
该函数遍历房间内的所有玩家，检查所有非 MasterClient

69
00:06:28,232 --> 00:06:35,700
玩家是否都处于准备状态 如果有非 MasterClient
玩家未点击准备按钮，提示信息显示

70
00:06:35,700 --> 00:06:41,488
有人未准备，游戏无法开始 如果所有非

71
00:06:41,488 --> 00:06:47,487
MasterClient 玩家都处于准备状态 执行以下操作。

72
00:06:47,487 --> 00:06:52,821
首先清除提示信息 然后设置 PhotonNerwork.room.open

73
00:06:52,821 --> 00:06:58,267
属性为 false 禁止游戏大厅内的玩家进入该房间，最后使用

74
00:06:58,267 --> 00:07:03,770
RPC 方法 让房间内所有玩家加载游戏战斗场景 GameScene

75
00:07:03,770 --> 00:07:08,980
我们将在下一单元的课程中介绍 RPC 和游戏战斗场景 GameScene

76
00:07:08,980 --> 00:07:18,640
[空白_录音] 下面讲解准备按钮的点击事件处理函数，ClickReadyButton

77
00:07:18,640 --> 00:07:22,960
该函数对玩家的自定义属性 isReady 进行取反操作

78
00:07:22,960 --> 00:07:31,372
切换玩家的准备状态，该函数还会根据玩家当前的准备状态 设置
ReadyButton 上的文字。

79
00:07:31,372 --> 00:07:36,784
如果玩家处于准备状态 ReadyButton 上的文字设为"取消准备"。

80
00:07:36,784 --> 00:07:41,348
如果玩家处于未准备状态 ReadyButton

81
00:07:41,348 --> 00:07:51,050
上的文字设为"准备"
下面讲解切换队伍按钮的点击事件处理函数，ClickSwitchButton

82
00:07:51,050 --> 00:07:55,631
该函数首先检查玩家的自定义属性 isReady 如果玩家

83
00:07:55,631 --> 00:08:00,590
isReady 属性为 true，在 PromptMessage 提示信息框中显示

84
00:08:00,590 --> 00:08:07,283
准备状态下不能切换队伍，使用 return
退出函数 如果玩家 isReady 属性为

85
00:08:07,283 --> 00:08:13,680
false，遍历另一支队伍的 队伍信息面板，判断另一支队伍是否满员

86
00:08:13,680 --> 00:08:18,881
如果另一支队伍未满员，就更改玩家的队伍属性 把

87
00:08:18,881 --> 00:08:24,640
isSwitch 变量设置为 true，表示已切换队伍，如果另一支队伍已满员

88
00:08:24,640 --> 00:08:29,773
则 isSwitch 变量仍为 false 在

89
00:08:29,773 --> 00:08:34,845
ClickSwitchButton 函数的最后 读取

90
00:08:34,845 --> 00:08:39,780
isSwitch 的变量的值，判断玩家是否成功切换队伍

91
00:08:39,780 --> 00:08:45,990
如果切换失败，PromptMessage 显示另一支队伍已满，无法切换

92
00:08:45,990 --> 00:08:50,720
如果切换成功，清空 PromptMessage 中的提示信息

93
00:08:50,720 --> 00:09:00,060
下面讲解 返回按钮的点击事件处理函数。

94
00:09:00,060 --> 00:09:05,532
玩家进入游戏房间后 返回按钮的功能变为返回游戏大厅。

95
00:09:05,532 --> 00:09:11,077
首先使用 onClick .RemoveAllListeners

96
00:09:11,077 --> 00:09:17,838
函数，移除返回按钮原有的事件处理函数 然后使用
onClick.AddListener

97
00:09:17,838 --> 00:09:24,250
函数 给返回按钮绑定一个匿名的事件处理函数，在返回按钮的事件处理函数中

98
00:09:24,250 --> 00:09:28,387
我们使用 PhotonNetwork.LeaveRoom

99
00:09:28,387 --> 00:09:33,465
函数退出游戏房间 返回游戏大厅，然后使用 SetActive

100
00:09:33,465 --> 00:09:39,320
函数启用大厅面板 禁用房间面板

101
00:09:39,320 --> 00:09:48,190
最后我们讲解房间内玩家信息的更新 房间内玩家的信息会在四种情况下发生改变

102
00:09:48,190 --> 00:09:53,960
第一种情况，房间内的玩家点击返回大厅按钮，退出房间

103
00:09:53,960 --> 00:09:59,670
或者其他玩家在大厅中加入此房间，会引起房间内玩家数量的改变

104
00:09:59,670 --> 00:10:08,074
第二种情况，玩家点击准备或取消准备按钮 会引起房间内玩家准备状态的改变。

105
00:10:08,074 --> 00:10:15,008
第三种情况，玩家点击切换队伍按钮 就会引起玩家队伍信息发生改变。

106
00:10:15,008 --> 00:10:20,626
第四种情况 MasterClient
离开房间，会引起房间内 MasterClient

107
00:10:20,626 --> 00:10:27,160
的变更 当房间内玩家的信息发生改变时，房间内所有玩家都需要更新

108
00:10:27,160 --> 00:10:34,640
游戏房间的 UI 显示，这里我们使用 Photon
的回调函数，OnPhotonPlayerPropertiesChanged

109
00:10:34,640 --> 00:10:40,370
与 OnMasterClientSwitch，实现房间内玩家信息的更新

110
00:10:40,370 --> 00:10:49,563
[空白_录音] 当房间内玩家的自定义属性发生改变时 PUN

111
00:10:49,563 --> 00:10:57,670
会调用 OnPhotonPlayerPropertiesChanged
回调函数 我们在该回调函数中，完成房间内玩家信息的更新

112
00:10:57,670 --> 00:11:02,698
首先调用 DisableTeamPanel 函数，禁用显示玩家信息的

113
00:11:02,698 --> 00:11:07,575
UI 控件 接着，调用 UpdateTeamPanel 函数，将更新后的玩家

114
00:11:07,575 --> 00:11:12,599
属性填入相应的玩家信息 UI 控件，显示在场景 UI 中 当房间内的

115
00:11:12,599 --> 00:11:18,266
MasterClient 发生改变时 PUN 会调用
OnMasterClientSwitched

116
00:11:18,266 --> 00:11:23,310
回调函数 在该函数中，我们调用 ReadyButtonControl 函数

117
00:11:23,310 --> 00:11:28,360
将新 MasterClient 的 ReadyButton 上的文字改为"开始游戏"

118
00:11:28,360 --> 00:11:33,150
并将它的点击事件处理函数设置为 ClickStartGameButton 函数

119
00:11:33,150 --> 00:11:41,287
用于开始游戏 迄今为止，我们已经使用

120
00:11:41,287 --> 00:11:47,532
PUN 完成了《慕课英雄 2》游戏大厅场景的开发 下一单元我们讲解如何使用

121
00:11:47,532 --> 00:11:56,660
PUN 实现《慕课英雄 2》的战斗场景逻辑 下面是演示环节

122
00:11:56,660 --> 00:12:01,630
我们演示游戏房间界面的制作
