这节课学习了创建游戏模式,可以读取到现在的玩家有多少人
我对这一部分的理解是游戏这个框架中分别分为Gamemode和GameState这两块,同时GameMode是可以访问GameState的.Gamemode的作用是游戏规则,移动角色到下一个关卡,设置每个玩家该在的出生点,监听玩家加入(PostLogin)和玩家注销(Logout).GameState是负责当前游戏的状态并且保存下来,比如得分,游玩进度,多人游戏则是把每个玩家作为变量放在数组内,再通过这个数组去分别对每个玩家的状态进行处理
这里记一下怎么利用搜索
然后搜索ue5 PostLogin
在文档中可以找到这一段
virtual void PostLogin ( APlayerController * NewPlayer )
把这一段复制到编译器内
如何找到需要的变量
这里右键转到定义
可以看见这个是继承Acontroller,继续查找定义
在新的定义中查询GetPlayerState
于是就可以用PlayerState这个模板获得到指针变量上
APlayerState* PlayerState = NewPlayer->GetPlayerState<APlayerState>();
在UE内创建新的游戏模式,命名LobbyGamemode
LobbyGameModeBase.h
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "LobbyGameModeBase.generated.h" /** * */ UCLASS() class MENU_API ALobbyGameModeBase : public AGameModeBase { GENERATED_BODY() public: //这里是为了重写基类函数,所以加了override virtual void PostLogin(APlayerController * NewPlayer) override; virtual void Logout(AController* Exiting) override; };
LobbyGameModeBase.cpp
// Fill out your copyright notice in the Description page of Project Settings. #include "LobbyGameModeBase.h" #include "GameFramework/GameStateBase.h" #include "GameFramework/PlayerState.h" void ALobbyGameModeBase::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); if(GameState) { int32 NumberPlayer = GameState.Get()->PlayerArray.Num(); /*这里有一段Printf显示当前的 NumberPlayer ,但是我偷懒不写了*/ /*这里大概是Printf("当前玩家数量"), NumberPlayer */ APlayerState* PlayerState = NewPlayer->GetPlayerState<APlayerState>(); if(PlayerState) { FString PlayerName = PlayerState->GetPlayerName(); /*这里有一段Printf显示当前的 PlayerName ,但是我偷懒不写了*/ /*这里大概是Printf("当前玩家名字"),PlayerName */ } } } void ALobbyGameModeBase::Logout(AController* Exiting) { Super::Logout(Exiting); APlayerState* PlayerState = Exiting->GetPlayerState<APlayerState>(); if(PlayerState) { int32 NumberPlayer = GameState.Get()->PlayerArray.Num(); FString PlayerName = PlayerState->GetPlayerName(); /*这里有一段Printf显示当前的 NumberPlayer ,但是我偷懒不写了*/ /*这里大概是Printf("当前玩家"),NumberPlayer - 1 */ } }
在MultiPlayerSessionSubsystem.cpp下的
void UMultiPlayerSessionSubsystem::CreateSession(int32 NumPublicConnections, FString MatchType)
内添加一行
//唯一标识符设置为整数1 LastSessionSettings->BuildUniqueId = 1;
在文件目录下DefaultGame.ini添加一行
[/Script/Engine.GameSession]
MaxPlayer=100