공부/Unreal

24.07.15

월러비 2024. 7. 17. 14:40
  • 멀티캐스트 델리게이트 예제
    • 함수 추가
    • 브로드 캐스트
  • 이벤트
    • 확인, 브로드 캐스트, 클리어 - 외부에서 콜 안된다.
  • 블루프린트
    • 블루프린트 콜 에이블
    • 블루프린트 네이티브 이벤트
    • 블루프린트 임플리먼테이블 이벤트
  • 캐릭터
    • 게임플레이 스테틱스 : 스폰 이미터 에드
    • 게임플레이 스테틱스 : 겟 플레이어 캐릭터

05 예제, 멀티캐스트 델리게이트 - 멀티 트리거

여러개의 오브젝트에 하나의 트리거로 작동시키기

  • 멀티캐스트는 '리턴'이 없다.
  • 델리게이트 헤더파일 - 델리게이트 함수 정의 및 파라미터 지정 - 델리게이트 자료형 변수 선언 - 델리게이트 cpp 파일 - 오버랩 함수 정의 - 델리게이트 변수에 값이 들어왔는지 확인 - 여러개의 값이 들어올것이니 랜덤 값(어느것을 호출할것인지 지정용)과 색상 지정 - 어느것에 적용할것인지의 값과 색상을 주고 ‘전부 실행’
//cpp
CheckFalse(OnMultiLightOverlap.IsBound());

//RandomIntegerInRange : 범위 안에서 랜덤값 생성
int32 index = UKismetMathLibrary::RandomIntegerInRange(0, 2);

FLinearColor color = FLinearColor::MakeRandomColor();

//멀티캐스트는 '리턴'이 없다.
//Broadcast : 델리게이트 다중 실행 함수다.
OnMultiLightOverlap.Broadcast(index, color);

연결할 함수 정의

  • 헤더 파일 - 연결할 함수 선언 - cpp 파일 - 모든 조명을 기본 색으로 초기화 - 지정된 값의 조명 하나만 지정된 색으로 변경 - ‘월드’에 지정된 클래스로 상속된 클래스가 배치되어있는지 확인하고 저장 - 있는지 확인 - 함수 연결
//cpp
//초기화
for (int32 i = 0; i < 3; i++)
{
	Lights[i]->SetLightColor(FLinearColor::White);
}

//정해진 색 하나만 색을 변경한다.
Lights[InIndex]->SetLightColor(InColor);

//델리게이트 함수가 있는 액터를 월드에서 탐색 후 Null 체크
AC05_MultiTrigger* trigger = CHelpers::FindActor<AC05_MultiTrigger>(GetWorld());
CheckNull(trigger);

trigger->OnMultiLightOverlap.AddUFunction(this, "OnLight");
  • 헤더 파일 - 연결할 함수 선언 - cpp 파일 - 모든 박스를 기본 색, 움직임 제거, 위치 등을 초기화 - 지정된 값의 박스 하나만 지정된 색으로 변경 - 지정된 값의 박스만 움직임 활성화 - ‘월드’에 지정된 클래스로 상속된 클래스가 배치되어있는지 확인하고 저장 - 있는지 확인 - 함수 연결
//cpp
//초기화 : 검정, 시뮬레이트, 월드좌표
for (int32 i = 0; i < 3; i++)
{
	Materials[i]->SetVectorParameterValue("Color", FLinearColor::Black);
	Meshes[i]->SetSimulatePhysics(false);
	Meshes[i]->SetWorldLocation(WorldLocations[i]); //처음에 저장한 월드 좌표로 위치를 맞출거다.
}

//들어온 위치 하나만 색을 바꿀거고, 떨어뜨릴거다.
Materials[InIndex]->SetVectorParameterValue("Color", InColor);
Meshes[InIndex]->SetSimulatePhysics(true);

//델리게이트 함수가 있는 액터를 월드에서 탐색 후 Null 체크
AC05_MultiTrigger* trigger = CHelpers::FindActor<AC05_MultiTrigger>(GetWorld());
CheckNull(trigger);

trigger->OnMultiLightOverlap.AddUFunction(this, "OnPhysics");

멀티캐스트 델리게이트

  • 실글캐스트 델리게이트의 기능 대부분을 그대로 갖고 있다.
  • 이벤트는 특수한 유형의 멀티캐스트 델리게이트다.
    • 이벤트와 델리게이트의 차이 : 멀티캐스트 델리게이트는 아무 클래스에서나 해당 델리게이트의 함수를 호출할 수 있지만, 이벤트는 해당 이벤트를 선언한 클래스만이 이벤트의 Broadcast(), IsBound(), Clear() 함수를 호출할 수 있다.
  • 오브젝트 레퍼런스만 갖고 있다.
  • 구조체와 함께 사용 가능하다.
  • 쉽게 복사 할 수 있다.
  • 반환값을 사용할 수 없다.

 

06 예제, 이벤트 - 이펙트 소환 이벤트

  • 이벤트 : 클래스 내부에서만 ‘콜’ 할 수 있다.
    • 정의도 클래스 내부에 있다.
    • ‘연결’은 외부에서도 할 수 있다.

이벤트 선언

  • 헤더파일 - 클래스 내부에 이벤트 델리게이션 메크로를 지정한다. : 이벤트 이름, 소유자 타입(이벤트가 선언된 클래스 명), 파라미터 등을 지정한다. - 델리게이트 이벤트 자료형 변수 선언 - cpp 파일 - 연결된 함수가 있는지 확인 - 이벤트가 실행될 랜덤 값 생성 및 저장 - 연결 함수 전부 실행(랜덤한 값을 파라미터로 주고)
//header
private:
DECLARE_EVENT_OneParam(AC06_EventTrigger, FExplosionEvent, int32);

public:
FExplosionEvent OnExplosionEvent;

//cpp
CheckFalse(OnExplosionEvent.IsBound());

int32 index = UKismetMathLibrary::RandomIntegerInRange(0, 2);

OnExplosionEvent.Broadcast(index);

이벤트 연결

  • 헤더 파일 - 연결할 함수 선언 - cpp 파일 - 함수 정의 : ‘파티클 소환 함수’ 호출(월드, 파티클, 위치 를 받는다.) - 함수 연결 - 블루프린트 디본값에 파티클을 넣는다.
//header
private:
	UFUNCTION()
		void OnExplosion(int32 InIndex);
	
//cpp
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), Particles[InIndex], GetActorLocation());

AC06_EventTrigger* trigger = CHelpers::FindActor<AC06_EventTrigger>(GetWorld());
CheckNull(trigger);

trigger->OnExplosionEvent.AddUFunction(this, "OnExplosion");

블루프린트와 C++의 변수 및 함수 구별

  • BlueprintCallable : 블루프린트에서 호출 가능하다고 알리는 매크로다.
  • Native : 미리 정의했으니, 필요하다면 직접 ‘재정의’ 해서 쓰라는 것이다.
  • Implement : 코드에서는 호출만 할 것이니 필요한 내용이 있다면 직접 정의하라는 것이다.
    • 블루프린트의 Update 함수

코드로 정의된 함수를 블루프린트에서 호출

  • 블루프린트에서 호출할 함수 또는 변수는 반드시 ‘protected’ 또는 public으로 선언해야한다.
    • 블루프린트 클래스가 C++ 클래스에서 상속받아 파생된 클래스이기 때문이다.
  • 헤더 파일 - 블루프린트 호출 가능 함수 선언 - cpp 파일 - 함수 정의 - 블루프린트 파일 - 함수 검색 후 연결
//header
protected:
	//블루프린트에서 '호출'이 가능한 함수다.
	UFUNCTION(BlueprintCallable)
		void PrintColor(FLinearColor InColor);

코드 정의 함수와 블루프린트 함수 호출 순서 확인

  • 같은 함수가 호출되어도 블루프린트 함수가 가장 먼저 호출된다.
    • 이유 : 코드상의 BeginPlay 함수가 실행될때 Super::BeginPlay() 가 실행되고 다음 코드가 실행되기 때문이다.
      • 블루프린트 함수를 Super가 실행될때 호출된다.
  • 헤더 파일 - 블루프린트 호출 함수 선언 - cpp 파일 - 함수 정의 - 블루프린트 파일 - 함수 검색
//header
public:
	UFUNCTION(BlueprintCallable, Category = "Color")
		void ChangeColor(FLinearColor InColor);

//cpp
CLog::Print("Begin Play");

코드로 정의하고 다른 클래스에서 호출하여 플레이어 매테리얼 색 변경

  • cpp 파일 - 메테리얼 가져와서 배열로 저장 - 메테리얼 배열 수만큼 반복한다. - 메테리얼 생성해서 저장한다. - 메쉬에 메테리얼을 세팅한다. - 블루프린트와 연결된 함수를 정의한다. - 함수를 호출할 클래스 - 함수 정의 - 플래이어를 가져와서 저장한다. - 캐릭터에서 정의한 색 변경 함수를 호출한다. - 플레이어 블루프린트 파일 - 코드로 정의한 함수 호출 - 오버라이드 블루프린트 파일 - 딜레이 걸고 색 변경 함수 호출
  • 결과 : 처음 플레이어 블루프린트에서 호출한 색으로 변경 후, 딜레이 시간 후 오버라이드에서 호출한 색으로 변경된다.
//cpp
//가져온 메쉬에서 메테리얼 '들을' 가져온다.
TArray<UMaterialInterface*> materials = GetMesh()->GetMaterials();
for (int32 i = 0; i < materials.Num(); i++)
{
	UMaterialInstanceDynamic* temp = UMaterialInstanceDynamic::Create(materials[i], this);
	GetMesh()->SetMaterial(i, temp);

	Materials.Add(temp);
}

for (UMaterialInstanceDynamic* material : Materials)
{
	material->SetVectorParameterValue("BodyColor", InColor);
}

//Onother cpp
ACPlayer* player = Cast<ACPlayer>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
CheckNull(player);

player->ChangeColor(FLinearColor::White);

다이나믹 델리게이트

  • 블루프린트와 함수를 공유하는 델리게이트다.

'공부 > Unreal' 카테고리의 다른 글

24.07.18  (1) 2024.07.23
24.07.17  (1) 2024.07.23
24.07.12  (0) 2024.07.15
24.07.11  (1) 2024.07.14
24.07.10  (1) 2024.07.12