해결된 질문
작성
·
91
0
안녕하세요 득우님, 2-15강에서 적군을 처치한 score UI가 제대로 업데이트 되지 않아서 질문을 남기게 되었습니다.
강의대로 따라한 결과, Controller 블루프린트에서 GameOver와 GameClear event는 제대로 동작하여서 게임의 승리와 죽음시 관련 UI들은 잘 spawn됩니다.
하지만, 적군 NPC 처리시 적군 처리 count가 업데이트가 안됩니다. 그러나 적군 처리시 text widget의 숫자의 색깔이 변하는 것으로 보아, WBP_PlayerScore의 custom event들은 잘 트리거 되지만, 아래 그림의 빨간 화살표가 가르키는 New Score 변수가 업데이트 되지 않는다는 것으로 유추해 보았습니다.
그래서 만약 제가 생각한 가정이 맞다면 다음과 같은 궁금증이 생겼습니다.
1. WBP_PlayerScore의 custom event를 트리거하는 부분은 어디에 있는지
2. 각 WBP_PlayerScore의 custom event에 Input으로 들어가는 "New Score"라는 변수는 어떻게 접근하는지
3. Controller에서는 Custom event를 트리거할때 Kismet 접두사가 붙은 C++함수로 컨트롤 했는데, PlayerScore의 custom event도 같은 방식인건지
감사합니다!
답변 1
1
안녕하세요. 마지막 예제는 C++외에도 블루프린트와 함께 활용할 수 있도록 한번 구성해보았습니다.
ABPlayerController를 상속받은 BP_ABPlayerController에 SetScore를 호출하는 이벤트를 다음과 같이 구성했습니다.
ABPlayerController의 헤더에 다음과 같은 블루프린트 이벤트를 선언했습니다. 이는 Cpp에는 내용이 없고 블루프린트에 선언한 OnScoreChangedCpp 이벤트에 대응되는 함수입니다.
UFUNCTION(BlueprintImplementableEvent, Category = Game, Meta = (DisplayName = "OnScoreChangedCpp"))
void K2_OnScoreChanged(int32 NewScore);
UFUNCTION 매크로에 의해 블루프린트에서는 OnScoreChangedCpp라는 이름의 이벤트로 나타나지만 Cpp 코드에서는 K2_OnScoreChanged 함수를 호출해주어야 합니다.
K2_OnScoreChanged 함수 호출은 다음과 같이 GameScoreChanged 함수 호출을 통해 발생되며, GameScoreChanged 함수는 점수를 관장하는 주체인 게임 모드를 통해 발동됩니다.
void AABGameMode::OnPlayerScoreChanged(int32 NewPlayerScore)
{
CurrentScore = NewPlayerScore;
AABPlayerController* ABPlayerController = Cast<AABPlayerController>(GetWorld()->GetFirstPlayerController());
if (ABPlayerController)
{
ABPlayerController->GameScoreChanged(CurrentScore);
}
if (CurrentScore >= ClearScore)
{
bIsCleared = true;
if (ABPlayerController)
{
ABPlayerController->GameClear();
}
}
}
이렇게 해서 블루프린트 이벤트 호출이 발생하면 다음의 블루프린트 로직에 의해 문의주신 UI의 SetScore함수(이벤트)가 발동되도록 설계했습니다.
친절한 설명 감사드립니다 득우님!