- 멀티캐스트 델리게이트 예제
- 이벤트
- 확인, 브로드 캐스트, 클리어 - 외부에서 콜 안된다.
- 블루프린트
- 블루프린트 콜 에이블
- 블루프린트 네이티브 이벤트
- 블루프린트 임플리먼테이블 이벤트
- 캐릭터
- 게임플레이 스테틱스 : 스폰 이미터 에드
- 게임플레이 스테틱스 : 겟 플레이어 캐릭터
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 : 코드에서는 호출만 할 것이니 필요한 내용이 있다면 직접 정의하라는 것이다.
코드로 정의된 함수를 블루프린트에서 호출
- 블루프린트에서 호출할 함수 또는 변수는 반드시 ‘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);
다이나믹 델리게이트