第一部分——主要逻辑
一、BP_CarSelectionGameMode
1.1、BeginPlay
获取并保存StartGame关卡送过来的参数
1.2、InitializeHUDForPlayer
对该函数进行重写来控制HUD的生成,参考:
AGameModeBase Document
1.3、变量和默认值
Use Seamless Travel:游戏使用无缝旅行,对多人游戏极其重要。
好处是背景加载Level和客户端不断开链接
1.4、BP_CarSelectionGameState
二、BP_CarSelectionPlayerController
2.1、ClientCreateCarSelectionMenu
寻找到可以选择的汽车,并设置对应Button
函数中所有参数界面都不进行Replicate
个人认为这种行为是明显增加耦合度的,不推荐
2.2、ServerChangePlayerName
RunOnServer
2.3、OnBecomeViewTarget
调用时应该是在准备离开当前地图时,此时关闭主界面并打开加载界面
2.4、变量与默认值
三、BP_CarSelectionPlayerState
注意:继承自BP_CarPlayerState
3.1、BeginPlay
创建对应的widget显示该玩家
3.2、EndPlay
当Actor被销毁或者离开当前关卡后调用
3.3、参数与默认值
自己存储,当离开时在其他客户端RemoveFromParent
四、BP_CarSelectionPawn
4.1、OnBecomeViewTarget
当Controller以他为视口时(误),证明已经完成当前的地图加载了,关闭加载界面
五、BP_CarSelectionRoom
直接用于背景搭建,CarPreviewer直接被其他类设置就行
第二部分——UI逻辑
一、BP_CarSelectionWidget
1.1、Construct
绑定退出界面的确定退出和取消退出按钮
1.2、CreateCarButtons
对所有的可选汽车创建对应Widget
1.3、OnPlayerNameTextCommitted
让服务器的Controller修改玩家名字,同时修改UI
设置要Focus在那个按钮上,不重要
1.4、StartGame
直接Server Travel+地图名跳转,貌似很简单
1.5、OnKeyDown
主要处理Esc键事件
如果当前选中了车,则取消选中
如果没有选中车,则进入退出界面
1.6、OnFocusReceived
1.7、Are All Players Ready
从GameState中一个一个PlayerState查看是否选中了车辆
1.8、Create Player Row
创建玩家的名字列表,进来一个创建一个
1.9、属性与默认值
二、BP_CarCheckBox
2.1、Construct
设置显示的名字
2.2、OnKeyDown
按Enter后选择车辆
2.3、OnFocus
当被Focus时设置对应骨骼模型
2.4、OnMouseButtonDown
类似OnFocus
2.5、OnMouseMove
2.6、SetCar