UE5 C++ TPS开发p23 Gamemode 玩家数量 玩家名称 Tips如何搜索 如何查找文档 如何查找源码

时间:2024-03-13 08:26:10

这节课学习了创建游戏模式,可以读取到现在的玩家有多少人

我对这一部分的理解是游戏这个框架中分别分为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