튀김족발
공부 끄적이는 공간
튀김족발
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • C++ (10)
    • DirectX (12)
    • Unreal (11)
    • Unity (0)
    • EASTL (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
튀김족발

공부 끄적이는 공간

Unreal

6. Delegate - 2

2023. 10. 3. 18:00

CourseInfo

// 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_MULTICAST_DELEGATE_TwoParams(FCourseInfoOnChangedSignature, const FString&, const FString&);

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

	FCourseInfoOnChangedSignature OnChanged;

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

private:
	FString Contents;
};

DECLARE_MULTICAST_DELEGATE_TwoParams 으로 델리게이트를 만드는데 인자 이름은 언리얼에서 Signature를 붙여서 만들기 때문에 똑같이 만들어 준다.

 

그리고, FCourseInfoOnChangedSignature 변수를 선언하고 외부에서 학사 정보를 번경 할때 호출하는 함수인 ChangeCourseInfo 함수도 선언 해준다.

 

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


#include "CourseInfo.h"

UCourseInfo::UCourseInfo()
{
	Contents = TEXT("기존 학사 정보");
}

void UCourseInfo::ChangeCourseInfo(const FString& InSchoolName, const FString& InNewContents)
{
	Contents = InNewContents;

	UE_LOG(LogTemp, Log, TEXT("[CourseInfo] 학사 정보가 변경되어 알림을 발송합니다."));
	OnChanged.Broadcast(InSchoolName, Contents);
}

학사 정보를 갱신 해주고, 로그를 찍어준다. 그리고 OnChanged에 연결된 모든 함수를 호출해준다.

 

Student

UCLASS()
class UNREALDELEGATE_API UStudent : public UPerson, public ILessonInterface
{
	GENERATED_BODY()
	
public:
	UStudent();

	virtual void DoLesson() override;

	void GetNotification(const FString& School, const FString& NewCourseInfo);
};

콜백을 위한 GetNotification 함수만 새로 만들어준다.

 

UStudent::UStudent()
{
	Name = TEXT("학생");
	Card->SetCardType(ECardType::Student);
}

void UStudent::DoLesson()
{
	ILessonInterface::DoLesson();
	UE_LOG(LogTemp, Log, TEXT("%s님은 가르칩니다."), *Name);
}

void UStudent::GetNotification(const FString& School, const FString& NewCourseInfo)
{
	UE_LOG(LogTemp, Log, TEXT("[Student] %s님이 %s님으로 부터 받은 메시지 : %s"), *Name, *School, *NewCourseInfo);
}

그리고, 호출시 출력할 로그만 만들어준다.

 

MyInstance

그리고 이 델리게이트를 컨트롤할 중간 관리를 MyInstance에 추가해준다.

 

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

#pragma once

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "MyGameInstance.generated.h"

/**
 * 
 */
UCLASS()
class UNREALDELEGATE_API UMyGameInstance : public UGameInstance
{
	GENERATED_BODY()
public:
	UMyGameInstance();

	virtual void Init() override;

private:
	UPROPERTY()
	TObjectPtr<class UCourseInfo> CourseInfo;

	UPROPERTY()
	FString SchoolName;
};

오브젝트 포인터로 만들어준다. 

 

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

	CourseInfo = NewObject<UCourseInfo>(this);

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

	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("================================="));
}

학사 정보를 선언 해주고, 각 학생들의 콜백과 오브젝트를 AddUObject를 사용해서 추가 해준다.
마지막으로 델리 게이트를 호출해주면,

 

LogTemp: =================================
LogTemp: [CourseInfo] 학사 정보가 변경되어 알림을 발송합니다.
LogTemp: [Student] 학생3님이 학교님으로 부터 받은 메시지 : 변경된 학사 정보
LogTemp: [Student] 학생2님이 학교님으로 부터 받은 메시지 : 변경된 학사 정보
LogTemp: [Student] 학생1님이 학교님으로 부터 받은 메시지 : 변경된 학사 정보
LogTemp: =================================

이렇게 출력이 된다.

'Unreal' 카테고리의 다른 글

7-2. 언리얼 컨테이너 라이브러리 - TSet  (1) 2023.10.16
7-1. 언리얼 컨테이너 라이브러리 - TArray  (1) 2023.10.11
6. Delegate - 1  (0) 2023.09.20
5. 컴포지션  (0) 2023.09.11
4. 인터페이스  (0) 2023.08.31
    'Unreal' 카테고리의 다른 글
    • 7-2. 언리얼 컨테이너 라이브러리 - TSet
    • 7-1. 언리얼 컨테이너 라이브러리 - TArray
    • 6. Delegate - 1
    • 5. 컴포지션
    튀김족발
    튀김족발

    티스토리툴바