게임 인스턴스 생성 .. 일반 클래스에 없기에 모든 클래스에서 찾아야한다.
게임 인스턴스를 프로젝트 세팅에서 생성한것으로 교체한다.
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Engine/UGameInstance/
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 함수는 특히 개발에서 매우 훌륭하고 매우 유용합니다. 명령줄에서 함수를 호출할 수 있습니다. 진부한 부분은 문서가 제대로 문서화되어 있지 않고 주의 사항과 숨겨진 기능이 많기 때문에 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 |