Launch game in settings
添加多人游戏
设置游戏人数:
选择网络模式:
Play As Listen Server:其中一台有人游玩的机器充当服务器,需要图形渲染
Play As Client:指定一台机器作为服务器,没有人实际在这台机器上游玩游戏,无需图形渲染(大型多人游戏)
配置Project连接到Steam
启用Steam插件:
在DefaultEngine.ini中添加代码:
[/Script/Engine.GameEngine]+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")[OnlineSubsystem]DefaultPlatformService=Steam[OnlineSubsystemSteam]bEnabled=trueSteamDevAppId=480bInitServerOnClient=true[/Script/OnlineSubsystemSteam.SteamNetDriver]NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
添加完成后关闭UE和VS并删除指定文件重构代码:
获取在线子系统(OnlineSubsystem)并打印该名称“Steam”:
遇到该错误需要重构代码:
在编辑器中运行时,连接到的是名为“null”的子系统,只有打包后的项目才能连接到Steam在线子系统
选择多人模式并Package项目才能生效:
Create Game Session
委托(delegate):可以绑定回调函数(CallbackFuction),当游戏中某个特定事件发生时调用该函数
在线会话接口(Online Session Interface):使用委托来处理创建和加入游戏会话时需要的信息传输
步骤:
1.定义:
会话接口(OnlineSessionInterface)、
创建会话的函数(CreateGameSession( ))、
委托变量(CreateSessionCompleteDelegate)、
回调函数(OnCreateSessionComplete(FName SessionName,bool bWasSuccessful))
2.绑定回调函数到委托变量上:OnCreateSessionComplete()
3.将委托添加到会话接口(Session Interface)的委托列表(Delegate List)中,使得当会话接口被创建时调用委托的CallbackFunction
4.会话接口(Session Interface)调用创建会话函数(CreateSession())来连接Steam并创建游戏会话
5.当会话创建完成时,Steam将会把信息发送回来,回调函数(callbackFuction)被触发,并通过该函数打印出调试信息以验证会话已成功创建
Find Game Session
需要添加头文件才能使用:SEARCE_PRESENCE
Join Game Session
创建一个大厅(Lobby Level):
创建Join Session的委托和回调函数:
初始化委托:
添加SessionSetting的Set函数:
Create Session时,改变服务器地图:
Find session的回调函数:
Join session的回调函数:
需要保证Steam在同一下载地区:
Create a Plugin
创建多人游戏插件:
启用在线子系统插件:
添加在线子系统模块名称:
Create our own subsystem
GameInstance和GameInstanceSubsystem
创建GameInstanceSubsystem:
在子系统中
1.添加公共函数以处理会话创建、查找、加入、销毁和启动等操作
2.添加委托变量
3.创建对应的回调函数
4.创建委托句柄以存储对每个委托的引用,用于从会话接口中移除不再需要的委托
Create Widget
创建C++Widget类:
创建Widget蓝图类:
初始化Menu类并添加按钮回调函数:
添加删除Widget函数,并在NativeDestruct函数中调用:
添加NumPublicConnections和MatchType:
添加自定义委托
创建委托和回调函数并将回调函数绑定到委托上:
如果创建失败,则清除委托并广播自定义委托为false;如果成功,则在回调函数中清除委托并广播自定义委托为true
将HostButtonClicked函数中的ServerTravel函数放到自定义委托的回调函数中,若创建成功则前往大厅:
添加更多委托和回调函数并进行绑定:
完善FindSession和JoinSession函数:
通过游戏模式跟踪加入和退出的玩家
创建GameModeBase C++类:
创建GameMode 蓝图类:
Path to lobby
完善Destroy函数
由于网络传输需要时间,立即调用CreateSession函数时可能Session还未被销毁
在DestroySession函数中先销毁session,若成功则调用CreateSession函数重新创建:
Disable Menu button
当创建时禁用按钮,创建失败时启用按钮:
Steps to use plugin
Plugins.zip
链接: https://pan.baidu.com/s/13PgLgU_LrBP4z0X3XMbFCQ?pwd=nx32 提取码: nx32
将测试里的Plugin压缩:
解压到桌面:
直接拖到需要的Project中:
启用Steam插件:
在DefaultEngine.ini中添加代码:
[/Script/Engine.GameEngine]+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")[OnlineSubsystem]DefaultPlatformService=Steam[OnlineSubsystemSteam]bEnabled=trueSteamDevAppId=480bInitServerOnClient=true[/Script/OnlineSubsystemSteam.SteamNetDriver]NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
在DefaultGame.ini中添加代码:
[/Script/Engine.GameSession]
MaxPlayer=100
创建Lobby地图并复制该路径:
打开Level Blueprint:
创建Widget并调用Menu Setup函数:
删除这些文件以重构代码:
打包时在List of maps添加这两个地图:
steam需要在同一地区才能联机: