Multiplayer Shooting Game

news/2025/3/10 15:08:40/文章来源:https://www.cnblogs.com/P1one/p/18688085

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需要在同一地区才能联机:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Aegisub】卡拉OK模板执行器学习

目录什么是卡拉OK模板执行器卡拉OK模板执行流程概念解析template行code行code区模板修饰语声明类修饰语onceline [name]pre-line [name]sylfurisyl furi其他修饰语allcharfx namefxgroup namemultikeeptagsnoblanknotextrepeat n, loop n内联变量如何使用内联变量变量类型行(…

比特c语言-数组和函数实践:扫雷

目录游戏分析和设计游戏功能说明游戏界面分析和设计数据结构分析文件结构设计游戏设计思路游戏代码实现游戏扩展 游戏分析和设计 游戏功能说明使用控制台实现经典扫雷游戏 游戏可以通过菜单实现是否退出游戏 扫雷棋盘默认为9*9格子 默认随机布置10个雷 可以进行排查雷如果位置不…

ANSYS计算完成后提示:# Error:Result file is incomplete or corrupt. It cannot be read.

问题: ANSYS模态分析计算完成后出现: Error:Result file is incomplete or corrupt. It cannot be read.解决办法: 将安装目录下的:C:\Program Files\ANSYS Inc\v242\Win64\mechanical\v242\commonfiles\Language\en-us\fx0.msb 文件 拷贝到上一级目录:C:\Program Files\…

vue3 输入框中能获取焦点,但是输入不了内容

原因:表单中的ref与model参数是一个,这两个参数应该不同。相同的话,输入不进去内容

让万物「听说」:AI 对话式智能硬件方案和发展洞察

本文整理自声网 SDK 新业务探索组技术负责人,IoT 行业专家 @吴方方 1 月 18 日在 RTE 开发者社区「Voice Agent +硬件分享会」上的分享。本次主要介绍了 AI 对话式智能硬件的发展历程,新一波 AI 浪潮所带来的创新机遇、技术挑战以及未来的展望。在语音交互浪潮的推动下,AIoT…

第一讲C++

第一题Long Loong For a positive integer X, the Dragon String of level X is a string of length (X+3) formed by one L, X occurrences of o, one n, and one g arranged in this order. You are given a positive integer N. Print the Dragon String of level N. Note …

蓝牙芯片HS6621CG-C丰富IO口资源集成红外编码语音采集功能超高性能已移植NFC例程支持语音蓝牙遥控智能门锁智能家居等应用

2.4Ghz的soc蓝牙5.1芯片HS6621CC语音遥控/智能门锁M4F内核兼容NORDIC的2.4G私有协议超低功耗,丰富IO口资源集成红外编码语音采集功能超高性能已移植NFC例程支持语音蓝牙遥控智能门锁智能家居等应用 简介:HS6621CxC 是一种功耗优化的真正的片上系统(SOC)解决方案,既适用于蓝牙…

Leetcode 287. 寻找重复数

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 示例 1: 输入: [1,3,4,2,2]输出: 2 示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。 只…

性价比PHY6252国产高性能蓝牙芯片支持BLE5.2内置M0内核512KB flash

简介PHY6252是一款支持BLE 5.2功能的系统级芯片(SoC),集成了低功耗的高性能多模射频收发机,搭载32位高性能低功耗处理器,提供64K retention SRAM、可选512/256K Flash、96KB ROM以及256bit efuse,支持基于BLE的安全架构、应用和OTA在线升级。此外,芯片串行外设IO和集成的…

Python代码将大量遥感数据的值缩放指定倍数的方法

本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法~本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存…

PHY6235超低功耗透传蓝牙soc内置MCU低成本方案

PHY6235是一款用于蓝牙低功耗和专有2.4G应用的系统级芯片(SoC)。它采用高性能、低功耗的32位RISC-V MCU,配备8KB保持型SRAM、80KB ROM以及超低功耗的高性能多模式无线电。此外,PHY6235支持带有安全功能的BLE(蓝牙低功耗)应用。串行外设IO和集成的应用IP使客户产品能够以最…

APISIX-API服务网关

一、简介 apisix是一款云原生微服务API网关,可以为API提供终极性能、安全性、开源和可扩展的平台。apisix基于Nginx和etcd实现,与传统API网关相比,apisix具有动态路由和插件热加载,特别适合微服务系统下的API管理。 Apisix 的诞生主要是为了是解决 Nginx 的动态配置问题以及…