[81. Refining Pickups]

 

기존에 만든 폭발물과 동전 오브젝트는 단순히 Overlap 이벤트만 발생하면 사운드와 파티클이 발생한다.

 

Item 클래스의 겹침 이벤트에서 구현했던 부분을 Explosive와 Pickup 클래스로 빼주도록 하자.

 

[82. Refining Sprint]

 

Shift키를 눌러서 전력질주를 하면 추가적인 조작을 하지 않아도 전력질주 매커니즘이 작동하는 문제가 있다.

자동으로 이동하는 것은 아니지만 제자리에서 전력질주 애니메이션이 재생되고 스태미너도 감소된다.

 

이동 키가 눌렸는지를 판단해서 전력질주를 실행해야 하므로 bool 변수 두개를 만들고 MoveForward, MoveRight에서 처음에 항상 false로 설정하고 키가 눌렸으면 true로 바꿔준다.

스태미너 감소 및 캐릭터의 상태가 변경되는 곳에서 이동 키가 눌렸는지 체크하는 부분을 넣어주면 된다.

 

[83. Extending the Enemy Class #1]

 

기능이 따로 추가되거나 변경된것은 없고 Paragon: Minions 애셋을 받아서 Enemy를 상속받은 새로운 BP를 하나 더 만들었을 뿐이다.

 

[84. Extending the Enemy Class #2]

 

새로운 애셋이 추가되었다고 딱히 달라지는것은 없고 파생 블루프린트 클래스를 만들어서 거미를 만들었을 때처럼 속성을 정해주고 몽타주를 만들고 스테이트머신을 만들고 등등 하는것은 똑같다.

 

기존에 만들었던 폭발물을 이제는 플레이어가 아닌 적들에게도 피해를 입히도록 바꿔보고 싶다.

 

// Explosive.cpp
void AExplosive::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    Super::OnOverlapBegin(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);

    if (OtherActor)
    {
        // 캐스팅 실패시 nullptr 반환
        AMain* Main = Cast<AMain>(OtherActor);
        AEnemy* Enemy = Cast<AEnemy>(OtherActor);
        if (Main || Enemy)
        {
            if (OverlapParticles)
            {
                UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), OverlapParticles, GetActorLocation(), FRotator(0.f), true);
            }
            if (OverlapSound)
            {
                UGameplayStatics::PlaySound2D(this, OverlapSound);
            }

            UGameplayStatics::ApplyDamage(OtherActor, Damage, nullptr, this, DamageTypeClass);

            Destroy();
        }
    }
}

 

양쪽을 다 캐스팅해서 null이 아니라면 OtherActor의 TakeDamage를 호출할 수 있다.

폭발물은 컨트롤러가 없으므로 세번째 인자는 nullptr이다.

 

 

여기서 문제가 한가지 생긴다.

플레이어의 콜리전 볼륨은 캡슐 컴포넌트 하나라서 여태까지는 잘 몰랐지만 적의 경우 감지 범위도 콜리전 볼륨에 속하기 때문에 상당히 먼 거리에서도 충돌이 일어나서 터지게 된다.

이 부분은 콜리전 채널에 대한 반응을 조정함으로써 수정할 수 있다.

 

// Enemy.cpp
AEnemy::AEnemy()
{
    AgroSphere->SetCollisionResponseToChannel(ECollisionChannel::ECC_WorldDynamic, ECollisionResponse::ECR_Ignore);
}

 

감지 범위에 대한 WorldDynamic 충돌이 무시되었지만 ACharacter를 상속받은 플레이어, 적은 기본적으로 루트 컴포넌트가 캡슐이고 캡슐의 콜리전 오브젝트 타입은 Pawn이라서 정상적으로 폭발이 이뤄진다.

 

[정리]

 

  • 컴포넌트를 붙이는 메소드는 SetupAttachment와 AttachToComponent가 있는데 AttachToComponent는 생성자에서 사용하는것을 지양하길 권장한다.
  • 의도하지 않은 충돌을 피하고 싶다면 콜리전 채널을 잘 설정해야 한다.

'언리얼 엔진 > UE4 C++' 카테고리의 다른 글

[UE C++] Level Changing and Saving the Game #1  (0) 2022.09.15
[UE C++] Combat #10  (0) 2022.09.15
[UE C++] Combat #8  (0) 2022.09.14
[UE C++] Combat #7  (0) 2022.09.13
[UE C++] Combat #6  (0) 2022.09.13

+ Recent posts