게임 인스턴스 생성 .. 일반 클래스에 없기에 모든 클래스에서 찾아야한다.
게임 인스턴스를 프로젝트 세팅에서 생성한것으로 교체한다.
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Engine/UGameInstance/
UGameInstance
GameInstance: high-level manager object for an instance of the running game.
docs.unrealengine.com
UGameInstanceGameInstance: 실행 중인 게임의 인스턴스에 대한 상위 수준 관리자 개체입니다.
//게임 인스턴스 생성자, Init보다 먼저 실행된다.
UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer);
//게임 인스턴스의 Init, 생성자 후에 실행됨.
virtual void Init();
UPuzzlePlatformsGameInstance::UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer)
{
UE_LOG(LogTemp, Warning, TEXT("게임 인스턴스 Constructor"));
}
void UPuzzlePlatformsGameInstance::Init()
{
UE_LOG(LogTemp, Warning, TEXT("게임 인스턴스 Init"));
}
게임 인스턴스는 생성자 -> Init 순으로 실행된다.
게임 인스턴스에 Exec함수를 등록하여 사용하도록 하자.
UFUNCTION(Exec)
void Host();
UFUNCTION(Exec)
void Join(const FString& Address);
서버를 호스팅할 Host와 Join 함수를 선언
https://unreal.gg-labs.com/wiki-archives/common-pitfalls/exec-functions
Exec Functions - UE4: Guidebook
Only some classes support Exec functions out of the box. Possessed Pawns, Player Controllers, Player Input, Cheat Managers, Game Modes, Game Instances, overriden Game Engine classes, and Huds should all work by just adding the standard UFUNCTION markup. Ex
unreal.gg-labs.com
개요
Exec 함수는 특히 개발에서 매우 훌륭하고 매우 유용합니다. 명령줄에서 함수를 호출할 수 있습니다. 진부한 부분은 문서가 제대로 문서화되어 있지 않고 주의 사항과 숨겨진 기능이 많기 때문에 exec 문서가 더 좋아질 때까지 이 페이지를 잡기 포인트로 만들고 싶었습니다.
exec함수란?
exec 함수는 무엇입니까? 대부분의 exec 함수는 'Exec' 명령을 추가하는 것만으로도 UFUNCTION 매크로 시스템을 통해 콘솔에 액세스할 수 있는 함수를 쉽게 선언할 수 있는 간단한 방법입니다. 콘솔 명령은 체인의 특정 지점에서 처리될 때까지 플레이어 컨트롤러나 뷰포트를 통해 일종의 계단식으로 진행됩니다.
대부분의 키보드에서 '~' 키를 누르고 뒤에 입력된 인수와 함께 함수 이름을 입력하면 콘솔에서 간단히 호출됩니다.
Exec 함수를 사용할 수 있는 곳
Host, Join 구현
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "PuzzlePlatformsGameInstance.generated.h"
/**
*
*/
UCLASS()
class PUZZLEPLATFORMS_API UPuzzlePlatformsGameInstance : public UGameInstance
{
GENERATED_BODY()
private:
public:
//게임 인스턴스 생성자, Init보다 먼저 실행된다.
UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer);
//게임 인스턴스의 Init, 생성자 후에 실행됨.
virtual void Init();
UFUNCTION(Exec)
void Host();
UFUNCTION(Exec)
void Join(const FString& address);
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "PuzzlePlatformsGameInstance.h"
#include "Engine/Engine.h"
UPuzzlePlatformsGameInstance::UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer)
{
UE_LOG(LogTemp, Warning, TEXT("게임 인스턴스 Constructor"));
}
void UPuzzlePlatformsGameInstance::Init()
{
UE_LOG(LogTemp, Warning, TEXT("게임 인스턴스 Init"));
}
void UPuzzlePlatformsGameInstance::Host()
{
//UEngine을 가져온다, GetEngine은 GameInstance에 있는 함수.
//#include "Engine/Engine.h" 헤더 파일 필요
UEngine* Engine = GetEngine();
if (!ensure(Engine != nullptr)) return;
//로그가 아닌 게임 화면에 디버그 메시지를 출력한다.
// 매개변수 설명
// Key 같은 메시지가 여러 번 추가되는 것을 방지하기 위한 고유 키입니다.
// TimeToDisplay 메시지를 표시할 시간(초)입니다.
// DisplayColor 텍스트를 표시할 색상입니다.
// DebugMessage 표시할 메시지입니다.
Engine->AddOnScreenDebugMessage(0, 2, FColor::Green, TEXT("호스팅"));
//WorldTravel
//World는 액터와 컴포넌트가 존재하고 렌더링될 맵 또는 샌드박스를 나타내는 최상위 객체입니다.
//World는 볼륨 및 블루프린트 기능을 통해 로드 및 언로드되는
//스트리밍 레벨의 선택적 목록이 있는 단일 영구 레벨이거나 World Composition으로 구성된 레벨 모음일 수 있습니다.
//독립형 게임에서는 대상과 현재 세계가 모두 존재하는 끊김 없는 영역 전환 동안을 제외하고
//일반적으로 단일 세계만 존재합니다.편집기에는 편집 중인 레벨,
//각 PIE 인스턴스, 대화식으로 렌더링된 뷰포트가 있는 각 편집기 도구 등 많은 세계가 있습니다.
//https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Engine/UWorld/
UWorld* World = GetWorld();
if (!ensure(World != nullptr)) return;
//맵의 전체 경로를 불러와서 해당 맵을 로딩한다.
//?listen은 다른 플레이어의 행동을 듣는다 -> 개방한다는 것.
World->ServerTravel("/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap?listen");
}
void UPuzzlePlatformsGameInstance::Join(const FString& Address)
{
UEngine* Engine = GetEngine();
if (!ensure(Engine != nullptr)) return;
//서버라면 전혀 존재하지 않을 수도 있는 로컬 플레이어 컨트롤러를 찾습니다.
APlayerController* PlayerController = GetFirstLocalPlayerController();
if (!ensure(PlayerController != nullptr)) return;
//다른 지도 또는 IP 주소로 이동합니다.작업을 수행하기 전에 PreClientTravel 이벤트를 호출합니다.
//ETavelType
//TRAVEL_Absolute Absolute URL. //절대적인 URL
//TRAVEL_Partial Partial(carry name, reset server)
//TRAVEL_Relative Relative URL.
//TRAVEL_MAX
PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
Engine->AddOnScreenDebugMessage(0, 2, FColor::Red, FString::Printf(TEXT("%s 으로 접속"), *Address));
}
'unreal engine' 카테고리의 다른 글
[언리얼엔진] C++로 UI, UMG에 접근하기, C++로 게임 내 클래스 찾기 (0) | 2022.07.10 |
---|---|
[언리얼엔진] C++로 트리거함수 콜백시키기, 트리거로 다른 오브젝트 작동 (0) | 2022.07.10 |
[언리얼엔진] C++로 트리거 재정의하기 (AddDynamic) (0) | 2022.07.10 |
[언리얼엔진] C++로 움직이는(왕복) 물체 만들기 (0) | 2022.07.10 |
[언리얼엔진] C++로 컴포넌트 생성하기 (0) | 2022.07.10 |