十六、场景跳转与GameInstance
场景跳转
case EMenuItem::EnterGame:
//检测是否可以进入游戏
if (NewGameWidget->AllowEnterGame())
{
SlAiHelper::PlaySoundAndCall(UGameplayStatics::GetPlayerController(GWorld, 0)->GetWorld(),
SlAiStyle::GetMenuStyle()->StartGameSound, this, &SSlAiMenuWidget::EnterGame);
}
else
{
//解锁按钮
ControlLocked = false;
}
break;
case EMenuItem::EnterRecord:
//告诉选择存档更新存档名
ChooseRecordWidget->UpdateRecordName();
SlAiHelper::PlaySoundAndCall(UGameplayStatics::GetPlayerController(GWorld, 0)->GetWorld(),
SlAiStyle::GetMenuStyle()->StartGameSound, this, &SSlAiMenuWidget::EnterGame);
break;
}
void SSlAiMenuWidget::EnterGame()
{
UGameplayStatics::OpenLevel(UGameplayStatics::GetPlayerController(GWorld, 0)->GetWorld(), FName("GameMap"));
}
点击进入游戏却跳转回主界面
到项目设置中更改GameMode不要选择SlAiMenuGameMode,
MenuMap中场景设置GameMode选择SlAiMenuGameMode。
GameInstance
SlAiGameInstance
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "SlAiGameInstance.generated.h"
/**
*
*/
UCLASS()
class SLAICOURSE_API USlAiGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
//virtual void Init() override;
UPROPERTY(VisibleAnywhere, Category = "SlAi")
FString GameName;
};
SlAiMenuGameMode
#include "SlAiMenuGameMode.h"
#include "SlAiMenuController.h"
#include "SlAiMenuHUD.h"
#include"SlAiGameInstance.h"
#include "Kismet/GameplayStatics.h"
ASlAiMenuGameMode::ASlAiMenuGameMode()
{
//等同于蓝图里面的GameMode选择PlayerController等
PlayerControllerClass = ASlAiMenuController::StaticClass();
HUDClass = ASlAiMenuHUD::StaticClass();
}
void ASlAiMenuGameMode::BeginPlay()
{
Cast<USlAiGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()))->GameName = FString("SlAiCourse");
}
SlAiGameMode
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "SlAiGameMode.generated.h"
/**
*
*/
UCLASS()
class SLAICOURSE_API ASlAiGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
ASlAiGameMode();
protected:
virtual void BeginPlay() override;
};
#include "SlAiGameMode.h"
#include"SlAiDataHandle.h"
#include"SlAiGameInstance.h"
#include"SlAiHelper.h"
#include"Kismet/GameplayStatics.h"
ASlAiGameMode::ASlAiGameMode()
{
}
void ASlAiGameMode::BeginPlay()
{
SlAiHelper::Debug(FString("DataHandle : ") + SlAiDataHandle::Get()->RecordName, 30.f);
SlAiHelper::Debug(FString("GameInstance : ")+Cast<USlAiGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()))->GameName ,30.f);
}
设置
项目设置中GameInstance选择SlAiGameInstance,
GameMap的世界场景设置为SlAiGameMode。
设置GameMap中的GameMode
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "SlAiGameMode.generated.h"
/**
*
*/
UCLASS()
class SLAICOURSE_API ASlAiGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
ASlAiGameMode();
//重写帧函数
virtual void Tick(float DeltaSeconds) override;
protected:
virtual void BeginPlay() override;
};
#include "SlAiGameMode.h"
#include"SlAiDataHandle.h"
#include"SlAiGameInstance.h"
#include"SlAiHelper.h"
#include"Kismet/GameplayStatics.h"
#include"SlAiGameHUD.h"
#include"SlAiPlayerController.h"
#include"SlAiPlayerState.h"
#include"SlAiPlayerCharacter.h"
ASlAiGameMode::ASlAiGameMode()
{
PrimaryActorTick.bCanEverTick = true;
//添加组件
HUDClass = ASlAiGameHUD::StaticClass();
PlayerControllerClass = ASlAiPlayerController::StaticClass();
PlayerStateClass = ASlAiPlayerState::StaticClass();
DefaultPawnClass = ASlAiPlayerCharacter::StaticClass();
}
void ASlAiGameMode::Tick(float DeltaSeconds)
{
}
void ASlAiGameMode::BeginPlay()
{
SlAiHelper::Debug(FString("DataHandle : ") + SlAiDataHandle::Get()->RecordName, 30.f);
SlAiHelper::Debug(FString("GameInstance : ")+Cast<USlAiGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()))->GameName ,30.f);
}