오늘은 예정이였던 배경음악까지는 넣진못했고 2단점프와버튼 하나를 추가해 점프를 실행하는것까지만 작업했다.
2단점프는 언리얼에선 매우 간단하게 구현할수있었다 애초에 기본적인 조작이 캐릭터컨트롤러에 만들어져있고
캐릭터 스크립트에서 JumpMaxCount의값을 조절하면 해결이됬다.
다만 1단점프와 2단점프가 점프력이 똑같으니 너무 높게뛰는것같아서 2단점프일때만 일시적으로 점프력을 낮추게 수정해봤다.
코드는 다음과같다.
//캐릭터 CPP
void APlayCharacter::Jump()
{
if(GetCharacterMovement()->IsFalling())
GetCharacterMovement()->JumpZVelocity = 800.f;
bPressedJump = true;
JumpKeyHoldTime = 0.0f;
}
void APlayCharacter::StopJumping()
{
bPressedJump = false;
GetCharacterMovement()->JumpZVelocity = 1000.f;
ResetJumpState();
}
점프카운트를 조건으로하려했으나 튕기는 발판을 밟고 뛰어올랐을때는 점프카운트가 증가하지는않지만 1단점프를 한것과 동일하게 취급하길래 1단점프 상태를 구분하기에 제일 쉬운방법으로는 IsFalling을 체크하는것같아서 이렇게 처리했다.
다음은 UI작업인데 UI은 추후에 수정을 용이하게 하기위해서 버튼과 HUD를 각각 위젯블루프린트를 따로따로 만들어서 구성하는 방법으로 진행할 예정이다. 지금은 별도의 버튼이미지용 리소스가없어서 기본버튼상태로 작업했다.
HUD를 화면에 노출할때는 이전에 강좌에서 플레이어에 Hp바를 달때랑은 좀 달랐다.
코드는 다음과같다.
//게임모드 헤더
public:
UPROPERTY(EditAnywhere,BlueprintReadOnly, Meta=(AllowPrivateAccess=true))
TSubclassOf<UUserWidget> HUD_Class;
UPROPERTY(EditAnywhere,BlueprintReadOnly, Meta=(AllowPrivateAccess=true))
UUserWidget* CurrentWidget;
//게임모드 CPP
static ConstructorHelpers::FClassFinder<UMainHUD> WBP_MainHUD(TEXT("WidgetBlueprint'/Game/BluePrints/UI/WBP_MainHUD.WBP_MainHUD_C'"));
if(WBP_MainHUD.Succeeded())
{
HUD_Class = WBP_MainHUD.Class;
CurrentWidget = CreateWidget(GetWorld(),HUD_Class);
if(CurrentWidget)
CurrentWidget->AddToViewport();
}
AddToViewport에는 Zorder를 매개변수로 넣을수있는데 이값에따라 어떤 UI를 상단에 노출시킬지 조절가능한거 같다.
버튼액션의 경우 이전에 강좌에서 사용하던 델리게이트를 사용하며 유니티에서 버튼에 AddLitener처럼 OnPressd라는 델리게이트에 이벤트를 할당해주면된다.
TSubclassOf는 UClass 유형의 안정성을 유지하는 템플릿클래스라고 한다. 항상 <>안의 타입의 파생클래스만 할당받기를 원하거나 혹은 에디터에서 할당할때 선택지를 제한할때 쓸수있다.
버튼이벤트 할당코드는 다음과같다.
//버튼 헤더
public:
class UButton* GetActionButton(){return Button_Action;}
private :
UPROPERTY(meta=(BindWidget))
class UButton* Button_Action;
//HUD 헤더
public:
UPROPERTY(meta=(BindWidget))
class UInputButton* Button_Jump;
//캐릭터 CPP
void APlayCharacter::BeginPlay()
{
Super::BeginPlay();
ADefaultGameModeBase* GameMode = Cast<ADefaultGameModeBase>(UGameplayStatics::GetGameMode(GetWorld()));
if(GameMode)
{
UMainHUD* MainHUD = Cast<UMainHUD>(GameMode->CurrentWidget);
if(MainHUD)
MainHUD->Button_Jump->GetActionButton()->OnPressed.AddDynamic(this,&APlayCharacter::Jump);
}
}
원래는 HUD의 CPP쪽에서 이벤트할당을 처리할 생각이였는데 UserWidget의 경우 액터와 다르게 BeginPlay같은 함수가 없어서 어느 시기에 처리해야 온전히될지를 잘 알수가 없어서 일단 캐릭터에서 처리하도록 작업했다 이부분은 좀 더 공부해서 수정해야겠다.
InputButton쪽도 버튼을 HUD쪽에서 Get한다음이벤트할당하는게아니라 함수를 매개변수로 넘겨서 이벤트를 바로 등록할수 있게 해보고 싶었는데 잘안됬다. 이부분도 가능한 방법이있는지 좀공부해봐야겠다.
다음은 좌우이동과 연동될 UI추가와 효과음 이번에 안넣은 배경음을 넣어볼 예정이다.
Reference
'Unreal > [UE4] 플랫포머 제작 연습(C++)' 카테고리의 다른 글
7. 효과음적용(실패) (1) | 2023.11.14 |
---|---|
6. 버튼을사용한 캐릭터이동, 배경음악 (0) | 2023.11.13 |
4. 사라지는 발판 (0) | 2023.11.11 |
3. 움직이는발판 버그수정, 튕기는 발판 (1) | 2023.11.09 |
2. 애니메이션, 움직이는 발판 (0) | 2023.11.09 |