๐ ๊ฐํ ๊ฒฐํฉ
- ํด๋์ค๋ค์ด ์๋ก ์์กด์ฑ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ
- Card๊ฐ ์๋ ๊ฒฝ์ฐ Person์ด ๋ง๋ค์ด์ง ์ ์๋ ๊ฒฝ์ฐ ๐ ์ด ๋ Person์ Card์ ๋ํ ์์กด์ฑ์ ๊ฐ์ง๋ค๊ณ ํ๋ค.
- ํธ๋ํฐ์์๋ ์ธ์ฆํ ์ ์๋ ์๋ก์ด ์นด๋๊ฐ ๋์ ๋๋ค๋ฉด?
๐ ๋์จํ ๊ฒฐํฉ
- ์ค๋ฌผ์ ์์กดํ์ง ๋ง๊ณ ์ถ์์ ์ค๊ณ์ ์์กดํ๋ผ (DIP ์์น)
- ์ Person์ Card๊ฐ ํ์ํ๊ฐ? ์ถ์ ์ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ
- ์ถ์ ์ ๊ด๋ จ๋ ์ถ์์ ์ธ ์ค๊ณ์ ์์กดํ์.
- ICheck๋ฅผ ์์๋ฐ์ ์๋ก์ด ์นด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํด ํด๊ฒฐ
- ์ด๋ฌํ ๋์จํ ๊ฒฐํฉ ๊ตฌ์กฐ๋ ์ ์ง ๋ณด์๋ฅผ ์์ฝ๊ฒ ํด์ค
๐ฉ ๋์จํ ๊ฒฐํฉ์ ๊ฐํธํ ๊ตฌํ - ๋ธ๋ฆฌ๊ฒ์ดํธ
ํจ์๋ฅผ ์ค๋ธ์ ํธ์ฒ๋ผ ๊ด๋ฆฌํ๋ฉด ์ด๋จ๊น?
๐ ํจ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
- ํจ์ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ์ฝ๋ฐฑ ํจ์ ๊ตฌํ
- ๊ฐ๋ฅ์ ํ๋ ์ด๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ๊ณผ์ ์ด ๊ฝค๋ ๋ณต์กํจ
- ์์ ์ฑ์ ์ค์ค๋ก ๊ฒ์ฆํด์ฃผ์ด์ผ ํจ
- C++17 std::bind์ std::function ํ์ฉ์ ๋๋ฆผ
๐ C#์ ๋ธ๋ฆฌ๊ฒ์ดํธ ํค์๋
- ํจ์๋ฅผ ๋ง์น ๊ฐ์ฒด์ฒ๋ผ ๋ค๋ฃฐ ์ ์์
- ์์ ์ ์ด๊ณ ๊ฐํธํ์ ์ธ
๐ ์ธ๋ฆฌ์ผ C++๋ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ง์ํจ. ๋์จํ ๊ฒฐํฉ ๊ตฌ์กฐ๋ฅผ ๊ฐํธํ๊ณ ์์ ์ ์ผ๋ก ๊ตฌํํ ์ ์์
๐ฉ ๋ฐํ ๊ตฌ๋ ๋์์ธ ํจํด
ํธ์ ํํ์ ์๋ฆผ์ ๊ตฌํํ๋๋ฐ ์ ํฉํ ๋์์ธ ํจํด
๐ ๋ฐํ์์ ๊ตฌ๋ ์๋ก ๊ตฌ๋ถ
- ์ฝํ ์ธ ์ ์์ : ์ฝํ ์ธ ์์ฑ
- ๋ฐํ์ : ์ฝํ ์ธ ๋ฐฐํฌ
- ๊ตฌ๋ ์ : ๋ฐฐํฌ๋ ์ฝํ ์ธ ๋ฅผ ๋ฐ์ ์๋น
- ์ ์์์ ๊ตฌ๋ ์๊ฐ ์๋ก๋ฅผ ๋ชฐ๋ผ๋, ๋ฐํ์๋ฅผ ํตํด ์ฝํ ์ธ ๋ฅผ ์์ฐํ๊ณ ์ ๋ฌํ ์ ์๋ค(๋์จํ ๊ฒฐํฉ)
๐ ๋ฐํ ๊ตฌ๋ ๋์์ธ ํจํด์ ์ฅ์
- ์ ์์์ ๊ตฌ๋ ์๋ ์๋ก๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋์จํ ๊ฒฐํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ์ ์ง ๋ณด์๊ฐ ์ฝ๊ณ , ์ ์ฐํ๊ฒ ํ์ฉ๋ ์ ์์ผ๋ฉฐ, ํ ์คํธ๊ฐ ์ฌ์์ง๋ค.
- ์์คํ ์ค์ผ์ผ์ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ฅ ํ์ฅ์ด ์ฉ์ดํ๋ค.
๐ฉ ์์
ํ๊ต์์ ์งํํ๋ ์จ๋ผ์ธ ์์ ํ๋ ์์
1. ํ์ฌ์ ๋ณด(CourseInfo)์ ํ์
- ํ๊ต๋ ํ์ฌ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค.
- ํ์ฌ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ํ์์๊ฒ ์๋ ค์ค๋ค.
- ํ์์ ํ์ฌ ์ ๋ณด์ ์๋ฆผ ๊ตฌ๋ ์ ํด์งํ ์ ์๋ค.
2. ์๋๋ฆฌ์ค
- ํ์ฌ ์ ๋ณด์ 3๋ช ์ ํ์์ด ์๋ค.
- ์์คํ ์์ ํ์ฌ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ํ์ฌ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฆผ ๊ตฌ๋ ํ ํ์๋ค์๊ฒ ๋ณ๊ฒฝ ๋ด์ฉ์ ์๋์ผ๋ก ์ ๋ฌํ๋ค.
๐ฉ ์ธ๋ฆฌ์ผ ๋ธ๋ฆฌ๊ฒ์ดํธ ์ ์ธ ์ ๊ณ ๋ ค์ฌํญ
1. ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ๋ฐ์ ๊ฒ์ธ๊ฐ? ์ธ์์ ์์ ๊ฐ๊ฐ์ ํ์ ์ ์ค๊ณ
- ๋ช ๊ฐ์ ์ธ์๋ก ์ ๋ฌํ ๊ฒ์ธ์ง / ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฌํ ๊ฒ์ธ์ง / ์ผ๋์ผ๋ก ์ ๋ฌ / ์ผ๋๋ค๋ก ์ ๋ฌ
2. ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ ์ค์
- C++ ํ๋ก๊ทธ๋๋ฐ์์๋ง ์ฌ์ฉํ ๊ฒ์ธ์ง
- UFUNCTION์ผ๋ก ์ง์ ๋ ๋ธ๋ฃจํ๋ฆฐํธ ํจ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง
3. ์ด๋ค ํจ์์ ์ฐ๊ฒฐํ ๊ฒ์ธ์ง
- ํด๋์ค ์ธ๋ถ์ ์ค๊ณ๋ C++ ํจ์์ ์ฐ๊ฒฐ
- ์ ์ญ์ ์ค๊ณ๋ ์ ์ ํจ์์ ์ฐ๊ฒฐ
- ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ๋ฉค๋ฒ ํจ์์ ์ฐ๊ฒฐ (๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ด ๋ฐฉ์์ ์ฌ์ฉ)
๐ฉ ์ธ๋ฆฌ์ผ ๋ธ๋ ๊ฒ์ดํธ ์ ์ธ ๋งคํฌ๋ก
DECLARE_{๋ธ๋ฆฌ๊ฒ์ดํธ ์ ํ} DELEGATE{ํจ์์ ๋ณด}
1. ๋ธ๋ฆฌ๊ฒ์ดํธ ์ ํ : ์ด๋ค ์ ํ์ ๋ธ๋ฆฌ๊ฒ์ดํธ์ธ์ง ๊ตฌ์ํ๋ค.
- ์ผ๋์ผ ํํ๋ก C++๋ง ์ง์ํ๋ค๋ฉด ์ ํ์ ๊ณต๋ ๐ DECLARE_DELEGATE
- ์ผ๋๋ค ํํ๋ก C++๋ง ์ง์ํ๋ค๋ฉด MULTICAST๐ DECLARE_MULTICAST
- ์ผ๋์ผ ํํ๋ก ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ์ง์ํ๋ค๋ฉด DYNAMIC ๐ DECLARE_DYNAMIC
- ์ผ๋๋ค ํํ๋ก ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ์ง์ํ๋ค๋ฉด DYNAMIC, MULTICAST ๐ DECLARE_DYNAMIC_MULTICAST
2. ํจ์ ์ ๋ณด : ์ฐ๋๋ ํจ์ ํํ๋ฅผ ์ง์ ํ๋ค. (์์๋ค)
- ์ธ์๊ฐ ์๊ณ ๋ฐํ๊ฐ๋ ์์ผ๋ฉด ๊ณต๋ ๐ DECLARE_DELEGATE
- ์ธ์๊ฐ ํ๋๊ณ ๋ฐํ๊ฐ์ด ์์ผ๋ฉด OneParam์ผ๋ก ์ง์ ๐ DECLARE_DELEGATE_OneParam
- ์ธ์๊ฐ 3๊ฐ๊ณ ๋ฐํ๊ฐ์ด ์์ผ๋ฉด RetVal_ThreeParams๋ก ์ง์ ํ๋ค ๐ DECLARE_DELEGATE_RetVal_ThreeParams (MULTICAST๋ ๋ฐํ๊ฐ์ ์ง์ํ์ง ์์)
- ์ต๋ 9๊ฐ๊น์ง ์ง์ํจ
(EX) ๋งคํฌ๋ก ์ ์ ์์
1. ํ์ฌ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฆผ ์ฃผ์ฒด์ ๋ด์ฉ์ ํ์์๊ฒ ์ ๋ฌํ๋ค. ๐ 2๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง
2. ๋ณ๊ฒฝ๋ ํ์ฌ ์ ๋ณด๋ ๋ค์ ์ธ์์ ๋์์ผ๋ก ๋ฐ์กํ๋ค. ๐ MULTICAST ์ฌ์ฉ
3. ์ค์ง C++ ํ๋ก๊ทธ๋๋ฐ์์๋ง ์ฌ์ฉํ๋ค. ๐ DYNAMIC ์ฌ์ฉํ์ง ์์
๐ DECLARE_MULTICAST_DELEGATE_TwoParams ๋งคํฌ๋ก ์ฌ์ฉ
๐ฉ ์ธ๋ฆฌ์ผ ๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ค๊ณ
ํ์ฌ ์ ๋ณด ํด๋์ค์ ํ์ ํด๋์ค์ ์ํธ ์์กด์ฑ์ ์ต๋ํ ์์ค๋ค.
- ํ๋์ ํด๋์ค๋ ํ๋์ ์์ ์๋ง ์ง์คํ๋๋ก ์ค๊ณ
- ํ์ฌ ์ ๋ณด ํด๋์ค๋ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ ์ธํ๊ณ ์๋ฆผ์๋ง ์ง์ค
- ํ์ ํด๋์ค๋ ์๋ฆผ์ ์์ ํ๋๋ฐ๋ง ์ง์ค
- ์ง์๋ ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก ์ ์ฐํ๊ฒ ์ค๊ณ
- ํ์ฌ ์ ๋ณด์ ํ์์ ์๋ก ํค๋๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ก ์ ๊ฒฝ์ธ ๊ฒ
๐ ์ด๋ฅผ ์ํด ๋ฐํ๊ณผ ๊ตฌ๋ ์ ์ปจํธ๋กคํ๋ ์ฃผ์ฒด๋ฅผ ์ค์
ํ์ฌ ์ ๋ณด์์ ์ ์ธํ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌ๋ ๊ณผ ์๋ฆผ์ ์ปจํธ๋กคํ๋ ์ฃผ์ฒด ์ค์ = MyGameInstance
๐ฉ ์์ ์ฝ๋
๐ CourseInfo(h, cpp) : ํ์ฌ ์
// 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;
};
// 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);
}
๐ MyGameInstance (h, cpp) : ํ์ฌ ์ ๋ณด์ ํ์์ ์ฐ๊ฒฐ
// 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;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
#include "Staff.h"
#include "Card.h"
#include "CourseInfo.h"
UMyGameInstance::UMyGameInstance()
{
SchoolName = TEXT("ํ๊ต");
}
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("=========="));
}
๐ Student(h, cpp)
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "LessonInterface.h"
#include "Student.generated.h"
/**
*
*/
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);
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Student.h"
#include "Card.h"
UStudent::UStudent()
{
Name = TEXT("์ดํ์");
Card->SetCardType(ECardType::Student);
}
void UStudent::DoLesson()
{
// ์์๋ฐ๋ ๊ฒ์ด Person์ด๊ธฐ ๋๋ฌธ์ Super ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
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);
}
๐ฉ ์ ๋ฆฌ
1. ๋์จํ ๊ฒฐํฉ์ด ๊ฐ์ง๋ ์ฅ์ : ํฅํ ์์คํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์์ฝ๊ฒ ๋์ฒ ๊ฐ๋ฅ
2. ๋์จํ ๊ฒฐํฉ์ผ๋ก ๊ตฌํ๋ ๋ฐํ ๊ตฌ๋ ๋ชจ๋ธ์ ์ฅ์
- ํด๋์ค๋ ์์ ์ด ํด์ผ ํ ์์ ์๋ง ์ง์ค ๊ฐ๋ฅ
- ์ธ๋ถ์์ ๋ฐ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ํฅ๋ฐ์ง ์์
- ์์ ์ ๊ธฐ๋ฅ์ ํ์ฅํ๋๋ผ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ํฅ์ ์ฃผ์ง ์์
3. ์ธ๋ฆฌ์ผ C++์ ๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ํ์ฉ
- ๋ช ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง๋๊ฐ?
- ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋๊ฐ? (MULTICAST ์ฌ์ฉ ์ ๋ฌด ๊ฒฐ์ )
- ์ธ๋ฆฌ์ผ ์๋ํฐ์ ํจ๊ป ์ฐ๋ํ ๊ฒ์ธ๊ฐ? (DYNAMIC ์ฌ์ฉ ์ ๋ฌด ๊ฒฐ์ )
- ์ด๋ฅผ ์กฐํฉํด ์ ํฉํ ๋งคํฌ๋ก ์ ํ
๐ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ๋์์ธ ํจํด์ ์ค๊ณํ ๋ ์ ์ฉ
'โ๏ธ ์์ง > ๐ซ ์ธ๋ฆฌ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unreal] ์ธ๋ฆฌ์ผ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ2 - ๊ตฌ์กฐ์ฒด์ TMap (0) | 2024.05.04 |
---|---|
[Unreal] ์ธ๋ฆฌ์ผ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ1 - Array์ Set (0) | 2024.05.04 |
[Unreal] ์ปดํฌ์ง์ (0) | 2024.05.03 |
[Unreal] ์ธํฐํ์ด์ค (0) | 2024.05.03 |
[Unreal] ํต์ ๋ฉ๊ฐ์ค์บ (1) | 2024.05.01 |