十六、场景跳转与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);
}

猜你喜欢

转载自blog.csdn.net/m0_51032168/article/details/121504212