언리얼 델리게이트(Delegate)

  • 언리얼 엔진은 발행 구독 패턴 구현을 위해 델리게이트 기능을 제공함.
  • 델리게이트의 사전적 의미는 대리자.
    • 학사정보의 구독과 알림을 대리해주는 객체
  • 시나리오 구현을 위한 설계
    • 학사 정보는 구독과 알림을 대행할 델리게이트를 선언.
    • 학생은 학사 정보의 델리게이트를 통해 알림을 구독.
    • 학사 정보는 내용 변경시 델리게이트를 사용해 등록한 학생들에게 알림.

언리얼 델리게이트의 선언

 언리얼 델리게이트 선언 시 고려사항

  • 델리게이트를 설계하기 위한 고려 사항
    • 어떤 데이터를 전달하고 받을 것인가? 인자의 수와 각각의 타입을 설계
      • 몇 개의 인자를 전달할 것인가?
      • 어떤 방식으로 전달할 것인가?
      • 일대일로 전달
      • 일대다로 전달
    • 프로그래밍 환경 설정
      • C++ 프로그래밍에서만 사용할 것인가?
      • UFUNCTION으로 지정된 블루프린트 함수와 사용할 것인가?
    • 어떤 함수와 연결할 것인가?
      • 클래스 외부에 설계된 C++ 함수와 연결
      • 전역에 설계된 정적 함수와 연결
      • 언리얼 오브젝트의 멤버 함수와 연결 ( 대부분의 경우에 이 방식을 사용)

델리게이트의 유형

코드 예시

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "CourseInfo.generated.h"

// Declare Delegate
DECLARE_MULTICAST_DELEGATE_TwoParams(FCourseInfoOnChanged, const FString&, const FString&);//리턴값이 없는 형. 
//DECLARE_MULTICAST_DELEGATE_RetVal_TwoParams()//리턴값이 있는 형.

/**
 * 
 */
UCLASS()
class UNREALDELEGATE_API UCourseInfo : public UObject
{
	GENERATED_BODY()

public:
	UCourseInfo();

	FCourseInfoOnChanged OnChanged;

	void ChangeCourseInfo(const FString& InSchoolName, const FString& InNewContents);

private:
	UPROPERTY()
	FString Contents;
	
};
// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"//본인 클래스의 헤더는 항상 제일 먼저 와야 한다.
#include "Teacher.h"
#include "Student.h"
#include "Staff.h"
#include "Card.h"
#include "CourseInfo.h"

UMyGameInstance::UMyGameInstance()
{
	//기본 값 설정.
	//CDO(Class Default Object).언리얼에 있는 독특한 기능
	//템플릿 클래스 객체로 생성이 된다.
	SchoolName = TEXT("스쿨");
}

void UMyGameInstance::Init()
{
	Super::Init();

	UE_LOG(LogTemp, Log, TEXT("======================================="));

	//학사 정보 객체 생성.
	CourseInfo = NewObject<UCourseInfo>(this);

	//학생 객체 생성.
	UStudent* Student1 = NewObject<UStudent>();
	Student1->SetName(TEXT("학생 1"));

	UStudent* Student2 = NewObject<UStudent>();
	Student2->SetName(TEXT("학생 2"));

	UStudent* Student3 = NewObject<UStudent>();
	Student3->SetName(TEXT("학생 3"));

	//구독할 함수 등록.
	CourseInfo->OnChanged.AddUObject(Student1, &UStudent::GetNotification);
	CourseInfo->OnChanged.AddUObject(Student2, &UStudent::GetNotification);
	CourseInfo->OnChanged.AddUObject(Student3, &UStudent::GetNotification);

	//발행.
	CourseInfo->ChangeCourseInfo(SchoolName, TEXT("새로운 학사 정보"));
	
	
	
	UE_LOG(LogTemp, Log, TEXT("======================================="));


}

'언리얼 엔진 공부 > 언리얼C++' 카테고리의 다른 글

어설션(Assertion)  (0) 2025.04.08
직렬화  (2) 2025.04.08
컴포지션  (0) 2025.04.03
인터페이스  (1) 2025.04.02
언리얼 오브젝트 리플렉션 시스템  (0) 2025.04.01

+ Recent posts