多人局域网游戏学习笔记:
视频网址:
https://www.bilibili.com/video/av42635205?from=search&seid=13300639985119867331
本地局域网运行,LAN模式,config中的DefaultEngine.ini文件中增加
[OnlineSubsystem]
DefaultPlatformService=Null
关卡设置:
MainMenu为开始关卡,空,默认设置
Arena01,Arena02为游戏关卡,第三人称地图,修改gamemode,playercontroller,defaultPawnclass
Lobby为大厅关卡,仅平面地图,增设PlayerStart点和BlockingVolume修改gamemode,playercontroller,defaultPawnclass
TravelMap空,默认设置
一、AllLevel
- GameInfoInstance
- 展示MainMenu,允许鼠标光标
- 保存游戏,分情况显示MainMenu和OptionMenu
- 显示HostMenu
- 显示ServerMenu
- 显示OptionMenu,根据save文件是否存在决定WelcomMessageVis是否显示
- 显示LoadingScreen
- 进入大厅,参数传递:最大玩家数量,server名字,是否enable LAN,显示 Loading Screen后openLevel
- 执行Joinserver显示 Loading Screen后joinSession
- 调用时销毁游戏进程DestroySessionCaller
- 事件NetworkError和TravelError通过宏DisplayErrorMessage显示ErrorDialog窗口
- PlayerInfo
存储玩家相关信息:姓名,头像,角色,角色头像,当前状态
- PlayerSaveGame
只包含一个结构体变量
二、Character
1、0_Base
重定向动画蓝图
2、创建子类蓝图
三、Gameplay
- GameplayGM
- 事件OnSwapPlayerControllers:保持追踪连接的Player Controller
- RespawnPlayer:获取初始位置,摧毁原有Pawn生成新的Pawn,设置Possess
- 事件OnLogout:获取GameInfoInstance和GameplayPC,执行Destroy Session Caller
- GameplayPC
- 事件BeginPlay:获取Local Controller,移除所有widget,加载游戏,向Server传递角色信息
- PassCharacterInfoToServer(服务器):设置PlayerSettings获取Gamemode重生玩家RespawnPlayer,设置聊天窗口
- SetupChatWindow(客户端):创建GameplayChat控件,添加到视口
- getChatMessage(服务器):变量存储用户名和要发送的信息,遍历所有的PlayerController更新聊天窗口的信息
- UpdateChat(客户端):调用GameplayChatWB,获取GameplayChat,调用UpdateChatwindow
- 按键T切换鼠标显隐
四、MainMenu
- UI
1.MainMenu
2.OptionMenu
3.ServerMenu
4.HostMenu
5.ErrorDialog
五、Lobby
- LobbyGM
- RespawnPlayer获取GetControllerPawn存在则销毁,在原位置处生成新的Actor并Possess
- EveryoneUpdate:判断当前连接人数大于0,清空connectPlayer,遍历AllPlayercontrollers,Update Number Of Players(LobbyPC);完成后AddPlayerInfo(LobbyPC),UpdateAvailableCharacter(LobbyPC),然后Add to KickedList;完成后判断当前角色是否0_Base,角色改变了Can We Start为真。
- Add to KickedList:获取playercontroller,获取LobbymenuWB,获取GameSetting,执行FillPlayersWindow刷新玩家窗口
- 事件OnPostLogin:有玩家进入此事件执行,switch has Authority (Authority连接指的是服务器),收集所有的PlayerController存储为AllPlayerController,收集所有的PlayerStart存储为SpawnPoint,获取GameInstance中的ServerName和MaxPlayers,设置大厅,更新大厅,重生玩家
- 事件OnLogout:遍历所有controller找到当前controller并移除,相应AvailableCharacters设置为false,移除相应ConnectPlayers,使所有人更新Everyone Update
- ServerUpdateGameSetting(服务器):在服务器上设置地图的图标,名称,时间,ID,遍历所有的controller,更新LobbySetting
- 剔除:YouHaveBeenKicked(服务器)调用LobbyPC中的Kicked(客户端)
- LaunchTheGame:根据GM Map ID开启整型,执行命令行Execute Console Command,命令为servertravel/Game/Maps/Arena01(注意:该命令行的执行应设置为独立窗口运行的情况下,在类默认值中设置Use SeamlessTravel为True)
- LobbyPC
- 初始化:事件BeginPlay,执行Initial Setup
- InitialSetup:检查游戏存储信息SaveGameCheck,获取玩家信息后,服务器更新信息Call Update
- SaveGameCheck:保存文件存在则先LoadGame然后SaveGame
- CallUpdate(在服务器上执行):设置playerSetting,执行角色替换Swap Character(LobbyGM)和EveryoneUpdate(LobbyGM)
- AddPlayerInfo(客户端):获取所有连接的玩家,在lobbyMenu界面清空玩家列表ClearPlayerList,更新玩家信息UpdatePlayerWindow
- setupLobbyMenu(客户端):创建LobbyMenu窗口显示
- UpdateLobbySetting(客户端):更新LobbyMenu的信息图片,名称,时间
- ShowLoadingScreen(客户端):去掉LobbyMenu,显示LoadingScreen
- UpdateNumberOfPlayers(客户端):更新LobbyMenu中的玩家数量
- 断开连接: 服务器断联 Event End Play -destroy Session; 剔除 Kicked(客户端)先打开MainMenu关卡在destroy Session
- UpdateAvailableCharacter(客户端):更新角色选择显示,没有选的角色为可选状态
- AssignSelectedCharacter(服务器):处理角色选择,决定角色是否可以被分配
- CharacterCheck(函数):把当前角色的available characters设置为true,preview的设置为false然后分配角色AssignPlayer
- AssignPlayer(客户端):分配角色,保存,callUpdate在所有机器上更新
- GetChatMessage(服务器):获取发送文字,发送方名称,遍历所有PlayerController调用UpdateChat事件
- UpdateChat(客户端):获取Lobby Menu WB,获取ChatWindow执行UpdateChatWindow
- T:切换显示玩家列表和大厅设置界面
- UI
1.characterSelect
2.ConnectedPlayer
3.GameSetting
4.LobbyMenu
5.PlayerButton
六、其他
1、ChatUI
- ChatText
2、ChatWindow
3、GameplayChat
2、loadingScreen
附录
DefaultEngine.ini
使用Steam
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
使用LAN
[OnlineSubsystem]
DefaultPlatformService=Null