본문 바로가기
게임프로그래밍/TheZombie

게임 개발 - UI(4)

by 설련 2022. 2. 4.

원래는 진도를 확확 나가버릴 생각이었는데

가정사로 인해서 어제 만든 아이콘을 적용시켜보았다.

 

갈수록 짧아지는 개발 분량에 대해서 스스로 자괴감이 들 정도지만 내일부터는 좀 더 분발해보도록 할 예정.

 

간단하게 아이콘을 받아서 그대로 적용하는 역할이다.

class THEZOMBIES_API UUIWidget : public UUserWidget
{
    GENERATED_BODY()
 
    UPROPERTY(Meta = (WidgetBind))
        class UProgressBar* HPbar;
 
    UPROPERTY(Meta = (WidgetBind))
        class UProgressBar* SPbar;
 
    UPROPERTY(Meta = (WidgetBind))
        class UTextBlock* HP;
    
    UPROPERTY(Meta = (WidgetBind))
        class UTextBlock* SP;
 
    UPROPERTY(Meta = (WidgetBind))
        class UTextBlock* CurrentEquipNum;
 
    UPROPERTY(Meta = (WidgetBind))
        class UTextBlock* MaxEquipNum;
 
    UPROPERTY(Meta = (WidgetBind))
        class UImage* WeaponImage;
 
    UPROPERTY(Meta = (WidgetBind))
        class UGridPanel* WeaponPanel;
 
public:
    UFUNCTION()
    void SetHPbarPercentage(float Percentage);
 
    UFUNCTION()
    void SetSPbarPercentage(float Percentage);
 
    UFUNCTION()
    void EquipWeapon(class AWeapon* CurWeapon);
};
 
//위젯에 EquipWeapon을 적용
 
void UUIWidget::EquipWeapon(AWeapon* CurWeapon) {
    WeaponImage->SetBrushResourceObject(CurWeapon->GetIcon());
    WeaponPanel->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
}
//감춰두었던 Panel을 오픈시킨다.
 
void ACurrentUseWidget::ShowUIWidget(class UPlayerStatus* PlayerStatus) {
    if (CrossHair)
        CrossHair->RemoveFromViewport();
 
    CrossHair = CreateWidget(GetWorld(), CrossHairClass);
    CrossHair->AddToViewport();
 
 
    if (StateUI)
        StateUI->RemoveFromViewport();
 
    StateUI = CreateWidget(GetWorld(), StateUIClass);
    PlayerStatus->OnSetHP.AddDynamic(Cast<UUIWidget>(StateUI), &UUIWidget::SetHPbarPercentage);
    PlayerStatus->OnSetSP.AddDynamic(Cast<UUIWidget>(StateUI), &UUIWidget::SetSPbarPercentage);
    PlayerStatus->OnEquipWeapon.AddDynamic(Cast<UUIWidget>(StateUI), &UUIWidget::EquipWeapon);
    StateUI->AddToViewport();
}
 
//그리고 계속해서 HUD에 접근하게 되면 여러 Cast를 거쳐야 하므로 이 또한 델리게이트를 통해 보내준다.
//이것들은 여러 함수를 동시 참조할 가능성이 있는 행동이기 때문에 멀티캐스트로 시동
 
void UPlayerStatus::DoFarmingWeapon(){
    if (FocusingWeapon.Num()) {
        //if (Cast<AWeapon*>(FocusingWeapon[0])) {}
        //무기일 경우
        
        //무기의 종류 판별
 
        //종류에 따라 배치, if Main Rifle & Sub Rilfe != nullptr, 인벤토리
        if (MainWeapon == nullptr) MainWeapon = Cast<AGun>(FocusingWeapon[0]);
        else if (SubWeapon == nullptr) SubWeapon = Cast<AGun>(FocusingWeapon[0]);
        //else 무기 전송, state 세팅
        CurWeapon = Cast<AWeapon>(FocusingWeapon[0]);
        OnDoFarmingCurrentWeapon.Broadcast(CurWeapon);
        OnEquipWeapon.Broadcast(CurWeapon);
 
        //자원일 경우(탄창, 소모품 등)
        //그대로 인벤토리에 전송
        //TArray의 데이터 자료형을 변경할 필요가 있음.
    }
}
 
//무기를 착용함과 동시에 델리게이트를 사용한다.
 
class THEZOMBIES_API AItem : public AActor
{
    GENERATED_BODY()
        //CurrentCount(현재수량), MaxCount(최대수량), Durability(내구도), FlavorText(플레이터 텍스트)
 
public:    
    // Sets default values for this actor's properties
    AItem();
 
protected:
    // Called when the game starts or when spawned
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Infomation)
        int32 CurrentCount;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Infomation)
        int32 MaxCount;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Infomation)
        int32 Durability;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Infomation)
        FText FlavorText;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Icon)
        class UTexture* Icon;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh)
        class USkeletalMeshComponent* Body;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh)
        class UBoxComponent* Interaction;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Owner)
        class ATheZombiesCharacter* MyOwner;
 
    UFUNCTION()
        void BindInteractionCharacter(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
 
    UFUNCTION()
        void UnBindInteractionCharacter(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
 
    virtual void BeginPlay() override;
 
public:
    FORCEINLINE class USkeletalMeshComponent* GetBody() const { return Body; }
    FORCEINLINE class UTexture* GetIcon() const { return Icon; }
    // Called every frame
    virtual void Tick(float DeltaTime) override;
 
    void SetInteractionCollision(bool bUseCollision);
    void SetOwner(class ATheZombiesCharacter* NewOwner);
};
 
//아이콘은 인벤토리에도 쓰일 가능성이 크기 때문에 AItem 클래스에 내부 변수로 둔다.

'게임프로그래밍 > TheZombie' 카테고리의 다른 글

게임 개발 - AI(2)  (0) 2022.02.04
게임 개발 - 몬스터, AI(1)  (0) 2022.02.04
게임 개발 - UI(3)  (0) 2022.02.04
게임 개발 - UI(2), HP/SP  (0) 2022.02.04
게임 개발 - 본IK  (0) 2022.02.04

댓글