- 点击C++类文件夹,在右边的区域点击鼠标右键,在弹出的菜单中选择“新建C++类”
- 在弹出的菜单中选中“显示所有类”,选择GameInstanceSubsystem作为父类, 点击“下一步”按钮
- 输入子类名称“UVRVIUOnlineGameSubsystem”,选择插件作为新类的目标模块,点击“公共”选择器
-
打开C++工程,找到".Build.cs"文件,在“PublicDependencyModuleNames”下,添加"MultiPlayerPlugin"
1
2
3
4
5
6
7
8
9
10
11
public
class
LandMaster : ModuleRules
{
public
LandMaster(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(
new
string[] {
"Core"
,
"CoreUObject"
,
"Engine"
,
"InputCore"
,
"UMG"
,
"Http"
,
"Json"
,
"JsonUtilities"
,
"Sockets"
,
"Networking"
,
"OnlineSubsystem"
,
"OnlineSubsystemUtils"
,
"MultiPlayerPlugin"
});
PrivateDependencyModuleNames.AddRange(
new
string[] {
"Slate"
,
"SlateCore"
});
}
}
-
设置“MultiPlayerPlugin.uplugin”文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"FileVersion"
: 3,
"Version"
: 1,
"VersionName"
:
"1.0"
,
"FriendlyName"
:
"MultiPlayerPlugin"
,
"Description"
:
"plugin for multi player "
,
"Category"
:
"Other"
,
"CreatedBy"
:
"VRVIU_Jacky"
,
"CreatedByURL"
:
""
,
"DocsURL"
:
""
,
"MarketplaceURL"
:
""
,
"SupportURL"
:
""
,
"EngineVersion"
:
"4.26.0"
,
"CanContainContent"
:
true
,
"Installed"
:
true
,
"Modules"
: [
{
"Name"
:
"MultiPlayerPlugin"
,
"Type"
:
"Runtime"
,
"LoadingPhase"
:
"Default"
,
"WhitelistPlatforms"
: [
"Win32"
,
"Win64"
]
}
]
}
-
设置插件“.Build.cs”文件,添加需要引用的模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Copyright Epic Games, Inc. All Rights Reserved.
using
UnrealBuildTool;
public
class
MultiPlayerPlugin : ModuleRules
{
public
MultiPlayerPlugin(ReadOnlyTargetRules Target) : base(Target)
{
bEnableUndefinedIdentifierWarnings =
false
;
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
//bUsePrecompiled = true;
PublicIncludePaths.AddRange(
new
string[] {
"MultiPlayerPlugin/Public"
}
);
PrivateIncludePaths.AddRange(
new
string[] {
}
);
PublicDependencyModuleNames.AddRange(
new
string[]
{
"Core"
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new
string[]
{
"CoreUObject"
,
"Engine"
,
"Slate"
,
"SlateCore"
,
"UMG"
,
"Http"
,
"Json"
,
"JsonUtilities"
,
"Sockets"
,
"Networking"
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new
string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
-
获取本机IP地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FString UVRVIUOnlineGameSubsystem::GetIpAddress(
bool
bHasPort
/*= true*/
)
{
FString IpAddr(
"NONE"
);
bool
canBind =
false
;
TSharedRef<FInternetAddr>LocalIp = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->GetLocalHostAddr(*GLog, canBind);
if
(LocalIp->IsValid())
{
IpAddr = LocalIp->ToString(bHasPort);
}
return
IpAddr;
}
-
创建会话
1
2
3
FString cmd =
"open "
+ Map +
"?listen"
;
UGameplayStatics::GetPlayerController(GetWorld(), 0)->ConsoleCommand(cmd);
m_ServerAddress = ServerAddress.Len() == 0 ? GetIpAddress(
false
):ServerAddress;
-
加入会话
1
2
3
4
5
UE_LOG(LogTemp, Warning, TEXT(
"UVRVIUOnlineGameSubsystem::ConnectServer %s"
), *IntranetIP);
FString cmd =
"open "
+ IntranetIP;
UGameplayStatics::GetPlayerController(GetWorld(), 0)->ConsoleCommand(cmd);
m_ServerAddress = IntranetIP;