[UE5] Lena: Dev Diary #6 - 재장전 기능 및 애니메이션 구현

ChangJin·2024년 6월 20일
0

Unreal Engine5

목록 보기
72/114
post-thumbnail

2024.06.21

깃허브!풀리퀘!
https://github.com/ChangJin-Lee/SimpleShooter https://github.com/ChangJin-Lee/Project-Lena/pull/5

이번 포스팅에서는 재장전 기능과 재장전 애니메이션을 구현한 과정을 다룹니다. Gun 클래스를 기반으로 한 블루프린트에서 탄약집 교체를 시각적으로 구현하는 방법을 소개합니다.


진행상황

  • ✅ 탄환 수 관리 시스템 구현
  • ✅ HUD에서 탄환 수 표시
  • ✅ 아이템 획득 시스템 구현
  • Pickup_Item 클래스 추가
  • ✅ 재장전 기능 구현
  • ✅ 재장전 애니메이션 추가
  • BP_Rifle 블루프린트 수정
  • ✅ 문제 해결 과정 설명
  • ⬜ 게임 BGM 변경
  • ⬜ 총 피격 이펙트 변경
  • ⬜ 총구 발사 이펙트 변경
  • ⬜ 퍼즐 기믹 추가


재장전 기능 구현

재장전 시스템 추가

  • Gun 클래스에 재장전 기능을 추가했습니다. 플레이어가 총을 발사할 수 있는 탄환 수를 추적하고, 탄환이 부족할 때 재장전할 수 있도록 했습니다.
  • 재장전 애니메이션을 트리거하고, 애니메이션이 완료되면 탄환 수를 갱신하도록 했습니다.
int ABase_Character::GetAmmo()
{
    return GunArray[WeaponActiveIndex]->GetAmmo();
}

void ABase_Character::AddAmmo_5mm()
{
    int MaxAmmo = GunArray[WeaponActiveIndex]->GetMaxAmmo();
    Ammo_5mm += MaxAmmo;
}

AGun* ABase_Character::GetWeapon()
{
    return GunArray[WeaponActiveIndex];
}

bool ABase_Character::ReloadGun()
{
    int MaxAmmo = GunArray[WeaponActiveIndex]->GetMaxAmmo();
    int CurrentAmmo = GunArray[WeaponActiveIndex]->GetAmmo();

    if (!GunArray[WeaponActiveIndex])
        return false;

    if (CurrentAmmo < MaxAmmo)
    {
        GunArray[WeaponActiveIndex]->SetAmmo(FMath::Min(MaxAmmo, CurrentAmmo + Ammo_5mm));
        Ammo_5mm = FMath::Max(0, Ammo_5mm - (MaxAmmo - CurrentAmmo));
    }

    return true;
}
void AGun::SetAmmo(int AmmoCount)
{
    Ammo = AmmoCount;
}

int AGun::GetAmmo()
{
    return Ammo;
}

bool AGun::IsEmpty()
{
    return Ammo <= 0;
}

int AGun::GetMaxAmmo()
{
    return MaxAmmo;
}

재장전 애니메이션 추가

BP_Rifle 블루프린트 수정

  • BP_Rifle 블루프린트를 수정하여 M4A1에 magazine 이라는 이름의 탄약집 메시를 Add Static Mesh Component로 추가했습니다.
BP_Rifle의 블루프린트 내용
  • 기존의 탄약집 부분을 Hide Bone by Name을 통해 숨겼습니다. 이렇게 하면 탄약집이 분리가 됩니다.
탄약집이 선택된 모습. 드래그하여 아래로 조금 이동한 모습
  • 각 AnimNotify는 Reload Montage에서 적절한 부분에 추가해주었습니다.
재장전 몽타주
  • ALS_AnimBP라는 Animation Blueprint에서 몽타주를 사용해 노티파이와 타이밍을 설정하여 재장전 애니메이션을 구성했습니다.
블루프린트 노드 설정
AnimNotify remove magAnimNotify drop mag
AnimNotify take magAnimNotify place mag


문제 해결 과정

문제:

  • 그러나 이렇게 구현을 하고 재생을 해보니 재장전 애니메이션 실행 중 총이 공중에 떠 있는 현상이 발생했습니다.
총이 공중에 떠 있는 문제

원인:

  • 원인은 M4A1 Skeletal Mesh를 새로 추가한 WeaponSocket에 부착하도록 만들었던 것이 문제였습니다.

  • 그리고 BP_Rifle인 Actor가 부착된게 아니라 Skeletal Mesh가 부착된 것이라서 재장전 할때 총알 수의 계산도 어려웠습니다.

해결:

  • Base_Character 블루프린트에서 총을 장착할 때 attach component to component가 아닌 actor to component로 변경하여 BP_Rifle을 장착했습니다.

  • 그리고 WeaponSocket의 소켓 위치에 BP_Rifle을 추가하는것이 아니라 LHS_ik_hand_r 소켓 위치에 추가했습니다.

Actor Attach Component로 총 블루프린트를 부착
총이 공중에 떠 있는 문제 해결

재장전 애니메이션 트리거

  • BP_Hero_Character 블루프린트에서 R 버튼을 눌렀을 때 몽타주가 실행되도록 설정했습니다.
  • 총을 들고 있으며 탄환이 있을 경우에만 재장전 애니메이션이 실행되도록 조건 설정했습니다.
  • 애니메이션 실행 전 IsArmed 변수를 false로 설정하여 총을 쏠 수 없게 하고, 재장전 후 Reload Gun 함수로 탄환 수 갱신했습니다.
재장전 애니메이션 트리거 설정

결론

이번 포스팅에서는 재장전 기능과 재장전 애니메이션을 구현하며 발생한 문제와 해결 과정을 상세히 다뤘습니다. 특히, 애니메이션 실행 중 발생한 총의 위치 문제를 해결하기 위해 사용된 방법들을 통해 많은 것을 배울 수 있었습니다. 다음 포스팅에서는 더욱 발전된 기능들을 다룰 예정이니 많은 기대 부탁드립니다.


참고 자료

이번 포스팅이 도움이 되셨길 바랍니다. 다음 포스팅도 많은 기대 부탁드립니다!

profile
게임 프로그래머

0개의 댓글