총알 UI
UCLASS()
class SESAC_NETWORK_API UCMainUI : public UUserWidget
{
GENERATED_BODY()
public:
// 총알 위젯이 추가될 패널
UPROPERTY(BlueprintReadWrite, Category = "UI", meta = (BindWidget))
class UUniformGridPanel* IMG_CrossHair;
// 총알 위젯 클래스
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "Bullet")
TSubclassOf<class UUserWidget> BulletUIFactory;
// 총알 위젯 추가 함수
void AddBullet();
}
#include "Components/UniformGridPanel.h"
void UCMainUI::AddBullet()
{
auto bullet = CreateWidget(GetWorld(), BulletUIFactory);
BulletPanel->AddChildToUniformGrid(bullet, 1, BulletPanel->GetChildrenCount());
}
class ASeSAC_NetworkCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 최대 총알 개수
UPROPERTY(EditAnywhere, Category = "Bullet")
int32 MaxBulletCount = 10;
// 남은 총알 개수
int32 BulletCount = MaxBulletCount;
}
void ASeSAC_NetworkCharacter::InitUIWidget()
{
if (MainUIWidget)
{
MainUI = Cast<UCMainUI>(CreateWidget(GetWorld(), MainUIWidget));
MainUI->AddToViewport();
MainUI->ShowCrossHair(false);
BulletCount = MaxBulletCount;
// 총알 추가
for (int i = 0; i < MaxBulletCount; ++i)
MainUI->AddBullet();
}
}
void ASeSAC_NetworkCharacter::Fire(const FInputActionValue& Value)
{
// 총을 들고 있지 않을때 또는 총알이 없을 경우 처리하지 않는다.
if (!bHasPistol or BulletCount <= 0) return;
// 총알 제거
MainUI->PopBullet(--BulletCount);
// 총쏘기 애니메이션 재생
auto anim = Cast<UCNetPlayerAnimInstance>(GetMesh()->GetAnimInstance());
anim->PlayFireAnimation();
// 총쏘기
FHitResult hitInfo;
FVector startPos = FollowCamera->GetComponentLocation();
FVector endPos = startPos + FollowCamera->GetForwardVector() * 10000;
FCollisionQueryParams params;
params.AddIgnoredActor(this);
bool bHit = GetWorld()->LineTraceSingleByChannel(hitInfo, startPos, endPos, ECC_Visibility, params);
if (bHit)
{
// 맞는 부위에 파티클 표시
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), GunEffect, hitInfo.Location);
}
}
Reload (재장전)
// 재장전에서 사용할 입력 액션
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input)
UInputAction* ReloadAction;
// 재장전 입력 처리 함수
void ReloadPistol(const FInputActionValue& Value);
UCLASS()
class SESAC_NETWORK_API UCMainUI : public UUserWidget
{
GENERATED_BODY()
public:
// 모든 총알UI 제거
void RemoveAllAmmo();
};
void UCMainUI::RemoveAllAmmo()
{
for (auto& bullet : BulletPanel->GetAllChildren())
BulletPanel->RemoveChild(bullet);
}
void ASeSAC_NetworkCharacter::ReloadPistol(const FInputActionValue& Value)
{
// 총 소지중이 아니라면 아무 처리하지 않는다.
if (!bHasPistol) return;
// 총알 개수 초기화
BulletCount = MaxBulletCount;
// 총알 UI 제거
MainUI->RemoveAllAmmo();
// 총알 UI를 다시 셋팅
for (int i = 0; i < MaxBulletCount; ++i)
MainUI->AddBullet();
}
Reload Animation (재장전 애니메이션)
UCLASS()
class SESAC_NETWORK_API UCNetPlayerAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
// 재장전 몽타주
UPROPERTY(EditDefaultsOnly, Category = "Anim")
class UAnimMontage* ReloadMontage;
// 재장전 애니메이션 재생
void PlayReloadAnimation();
// 재장전 애니메이션 노티파이 이벤트
UFUNCTION()
void AnimNotify_OnReloadFinish();
}
void UCNetPlayerAnimInstance::PlayReloadAnimation()
{
if (bHasPistol and ReloadMontage)
Montage_Play(ReloadMontage);
}
void UCNetPlayerAnimInstance::AnimNotify_OnReloadFinish()
{
player->InitAmmoUI();
}
UCLASS(config=Game)
class ASeSAC_NetworkCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 총알 UI 초기화할 함수
void InitAmmoUI();
}
void ASeSAC_NetworkCharacter::ReloadPistol(const FInputActionValue& Value)
{
// 총 소지중이 아니라면 아무 처리하지 않는다.
if (!bHasPistol) return;
// 재장전 애니메이션 재생
auto anim = Cast<UCNetPlayerAnimInstance>(GetMesh()->GetAnimInstance());
anim->PlayReloadAnimation();
}
void ASeSAC_NetworkCharacter::InitAmmoUI()
{
// 총알 개수 초기화
BulletCount = MaxBulletCount;
// 총알 UI 제거
MainUI->RemoveAllAmmo();
// 총알 UI를 다시 셋팅
for (int i = 0; i < MaxBulletCount; ++i)
MainUI->AddBullet();
}
플레이어 체력 (HP)
UCLASS(config=Game)
class ASeSAC_NetworkCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 플레이어 체력
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "HP")
float MaxHP = 3;
// 현재 체력
UPROPERTY(BlueprintReadOnly, Category = "HP")
float HP = MaxHP;
}
UCLASS()
class SESAC_NETWORK_API UCMainUI : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "HP")
float HP = 1;
}
'Development > Unreal Lab' 카테고리의 다른 글
[SeSAC, Unreal Network] 2025. 04. 08 (0) | 2025.04.08 |
---|---|
[SeSAC, Unreal Network] 2025. 04. 07 (0) | 2025.04.07 |
[SeSAC, Unreal Network] 2025. 04. 03 (0) | 2025.04.03 |
[SeSAC, Unreal Network] 2025. 04. 02 (0) | 2025.04.02 |
[SeSAC, Unreal] 2025. 03. 18 (0) | 2025.03.18 |