7.1 언리얼 인터페이스
7.1-1 언리얼 C++ 인터페이스 개요
- 인터페이스란
객체가 반드시 구현해야 할 행동을 지정하는데 활용되는 타입
다형성(Polymorphism)의 구현, 의존성이 분리된(Decouple) 설계에 유용하게 활용됨.
- 언리얼 엔진에서 게임 컨텐츠를 구성하는 오브젝트의 설계 예시
월드에 배치되는 모든 오브젝트(안움직이는 Actor, 움직이는 Pawn을 포함하는 상위개념)
ex. 길찾기 시스템을 반드시 사용하면서 움직이는 오브젝트를 구현하고자 한다면
INavAgentInterface 인터페이스를 구현한 Pawn을 설계해야함.
7.1-2 언리얼 C++ 인터페이스의 특징
- 인터페이스를 생성하면 두 개의 클래스가 생성됨.
U로 시작하는 타입 클래스/I로 시작하는 인터페이스 클래스
- 개체를 설계할 때는 인터페이스 클래스를 사용하고
런타임에서 클래스 타입정보를 제공하거나 할때는 타입 클래스를 사용함.
실제로는 타입 클래스 작업을 할 일은 없음.
- 언리얼 C++ 인터페이스는 인터페이스에서도 구현이 가능함.
추상 타입으로만 선언할 수 있는 Java, C#과는 다름.
7.1-3 다른 프로젝트에서 소스코드를 가져오는 방법
- 원하는 header 파일과 cpp 파일을 블럭지정 후 Ctrl + C
- 내 프로젝트의 Source 폴더에 Ctrl + V
- 언리얼 에디터 > Tools > Refresh Visual Studio 2022 Project 클릭
- header 파일에 ..._API 키워드를 해당 프로젝트에 맞게 수정해야함.
7.1-3 언리얼 C++ 인터페이스 실습
- 학생과 선생은 수업에 꼭 참여하게끔 구현하고자 함. 반면에 교직원은 참여하지 않음.
- 새 프로젝트 UnrealInterface 생성
- 새 C++ 클래스 > UObject 부모 클래스 > UPerson/UStudent/UTeacher/UStaff 클래스 생성
<hide/>
// Person.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.generated.h"
UCLASS()
class UNREALINTERFACE_API UPerson : public UObject
{
GENERATED_BODY()
public:
UPerson();
FORCEINLINE FString& GetName() { return Name; }
FORCEINLINE void SetName(const FString& InName) { Name = InName; }
protected:
UPROPERTY()
FString Name;
};
<hide/>
// Person.cpp
#include "Person.h"
UPerson::UPerson()
{
Name = TEXT("홍길동");
}
<hide/>
// LessonInterface.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "LessonInterface.generated.h"
UINTERFACE(MinimalAPI)
class ULessonInterface : public UInterface
{
GENERATED_BODY()
};
class UNREALINTERFACE_API ILessonInterface
{
GENERATED_BODY()
public:
virtual void DoLesson() // 구현을 해도 되고 안해도됨.
{
UE_LOG(LogTemp, Log, TEXT("수업에 입장합니다."));
}
};
<hide/>
// LessonInterface.cpp
#include "LessonInterface.h"
<hide/>
// Student.h
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "LessonInterface.h"
#include "Student.generated.h"
UCLASS()
class UNREALINTERFACE_API UStudent : public UPerson, public ILessonInterface
{
GENERATED_BODY()
public:
UStudent();
virtual void DoLesson() override;
};
<hide/>
// Student.cpp
#include "Student.h"
UStudent::UStudent()
{
Name = TEXT("이학생");
}
void UStudent::DoLesson()
{
ILessonInterface::DoLesson();
UE_LOG(LogTemp, Log, TEXT("%s님은 공부합니다."), *Name);
}
<hide/>
// Teacher.h
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "LessonInterface.h"
#include "Teacher.generated.h"
UCLASS()
class UNREALINTERFACE_API UTeacher : public UPerson, public ILessonInterface
{
GENERATED_BODY()
public:
UTeacher();
virtual void DoLesson() override;
};
<hide/>
// Teacher.cpp
#include "Teacher.h"
UTeacher::UTeacher()
{
Name = TEXT("이선생");
}
void UTeacher::DoLesson()
{
// 여기서 Super 범위지정자를 사용할 수 없음. UTeacher의 Super는 UPerson이기 때문. 다중 상속중이기 때문.
ILessonInterface::DoLesson(); // 그래서 이와같이 직접 범위지정을 해줌.
UE_LOG(LogTemp, Log, TEXT("%s님은 가르칩니다."), *Name);
}
<hide/>
// Staff.h
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "Staff.generated.h"
UCLASS()
class UNREALINTERFACE_API UStaff : public UPerson
{
GENERATED_BODY()
public:
UStaff();
};
<hide/>
// Staff.cpp
#include "Staff.h"
UStaff::UStaff()
{
Name = TEXT("이직원");
}
<hide/>
// MyGameInstance.cpp
#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
#include "Staff.h"
UMyGameInstance::UMyGameInstance()
{
SchoolName = TEXT("기본학교");
}
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("============================"));
TArray<UPerson*> Persons = { NewObject<UStudent>(), NewObject<UTeacher>(), NewObject<UStaff>() };
for (const auto Person : Persons)
{
UE_LOG(LogTemp, Log, TEXT("구성원 이름 : %s"), *Person->GetName());
}
UE_LOG(LogTemp, Log, TEXT("============================"));
for (const auto Person : Persons)
{
ILessonInterface* LessonInterface = Cast<ILessonInterface>(Person);
if (LessonInterface)
{
UE_LOG(LogTemp, Log, TEXT("%s님은 수업에 참여할 수 있습니다."), *Person->GetName());
LessonInterface->DoLesson();
}
else
{
UE_LOG(LogTemp, Log, TEXT("%s님은 수업에 참여할 수 없습니다."), *Person->GetName());
}
}
UE_LOG(LogTemp, Log, TEXT("============================"));
}
'Unreal > [서적] 언리얼5 이득우님 인프런1' 카테고리의 다른 글
Ch 09. 델리게이트 (0) | 2023.05.12 |
---|---|
Ch 08. 컴포지션 (0) | 2023.05.11 |
Ch 06. 언리얼 리플렉션 2 (0) | 2023.05.10 |
Ch 05. 언리얼 리플렉션 (0) | 2023.05.10 |
Ch 04. 언리얼 오브젝트 (0) | 2023.05.09 |
댓글