LAN下多人游戏关卡
Open Leve(by name)
节点指定打开Lobby关卡,选项是listen(作为监听服务器)
另一台电脑的运行实例通过执行控制台指令
或者英文Execute Console Command
节点并使用Open <adress>
连接对应地址下的游戏服务器以进行多人游戏。
另一种方法是:
XXXCharacter.h下
相应cpp文件下:
服务端调用的是第一个
其他玩家调用第二个或第三个
当然,这里关卡在OpenLobby中被硬编码了。
文件路径
以一个level文件地址为例
D:/UnrealProject/MPTest/Content/ThirdPerson/Maps/ThirdPersonMap.umap
Content文件夹之前的内容可以用game
代替,即
/game/ThirdPerson/Maps/ThirdPersonMap.umap
例如对服务端使用UWorld::ServerTravel
时,就可以有
UWorld* World = GetWorld();
if(World){
World->ServerTravel("/game/ThirdPerson/Maps/ThirdPersonMap?listen");
}
不用扩展名是因为已经默认是umap
文件,另外附加参数listen
用?
连在后面(即被指定为监听服务器)
UFUNCTION宏
可利用函数说明符将UFunction对蓝图可视化脚本图表公开,以便开发者从蓝图资源调用或扩展UFunction,而无需更改C++代码。
使用方式如下
UFUNCTION(BlueprintCallable)
void function(1);
BlueprintCallable就是其中一种传入参数(传入的参数见上方链接文档),表示此函数可在蓝图或关卡蓝图图表中执行。
在线子系统
启用在线子系统(以steam为例)
编辑->插件中搜索启用相关平台即可(上图是steam平台)
然后将之加入到Bulid文件里(项目名.Build.cs
这个文件)
//原先
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay" });
//改为
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "OnlineSubsystemSteam", "OnlineSubsystem" });
找到项目文件夹下的\Config\DefaultEngine.ini
添加如下内容
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
; If using Sessions
; bInitServerOnClient=true
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
正式使用需要申请自己的SteamDevAppId
。480是steam的一个项目叫做space war
重新生成文件前应当删除已有的,即下图选中的三个
随后右键.uproject
文件并选择下图选项,得到Intermediate
和Saved
文件夹
然后双击打开该文件(即启动项目),提示点击“是”,得到Binaries文件夹
代码
暂略
使用委托
- (通常在头文件中)声明委托变量
- 初始化委托(用到的类构造函数中)
- 实现了CreateUObject函数的类可以通过对一个UObject的引用来初始化委托(简言之就是委托引用了委托对象)
- 一般CreateUObject函数需要传入user calss和回调函数。这是委托需要的最基本的东西。
- 使用之前使用函数(该函数特征是前缀
Add
和后缀_Handle
如AddOnFindSessionCompleteDelegate_Handle
)将委托添加到委托列表。 - 第5条中的函数返回
FDelegateHandle
类型的对象,存储有相应类型委托的句柄
UE项目
UE项目本身就是一个模块,模块是UE引擎的基本构成,每个模块都有自己的Build.cs
文件。
UE项目使用插件时会将插件添加到.uproject
项目文件中。其中有Plugins
部分,节选如下
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
},
{
"Name": "Bridge",
"Enabled": true,
"SupportedTargetPlatforms": [
"Win64",
"Mac",
"Linux"
]
},
{
"Name": "OnlineSubsystemSteam",
"Enabled": true
}
]
插件本身也可以包含其他插件,相应的包含关系将被添加到.uplugin
文件中。
UE支持模块和插件的相互依赖,但是具有先后顺序,比如引擎模块不能依赖游戏模块,但是游戏模块可以依赖引擎模块。因为即使没有任何项目引擎模块也可以被构建
引擎插件可以在解决方案资源管理器下找到,每个插件都包含一个或多个模块
子系统
Game Mode & Game State
UE有GAME MODE BASE
这个基类来实现game mode。他里面就有GameState
这个变量。GameState
被包装在TObjectPtr<AGameStatebase>
中
Game State:客户端可以访问。用于保存游戏状态信息(而不是玩家状态),比如分数、胜利次数。保存有一个玩家状态数组。
实现game mode可能需要重写下面两个函数
- PostLogin是一个继承的虚拟函数,每当玩家加入游戏时就会被调用
- Logout函数则在玩家离开游戏时调用
gamemode一般存在于主机,不存在于客户端