데미지 적용
이제 실제로 데미지를 적용시켜주자.
데미지는 hit 한 순간에 적용되어야 하므로 우리가 만들었던 OnHit 함수에서 ApplyDamage 함수를 호출하게 된다.
먼저 해당 함수의 인풋 매개 변수를 체크해보자.
데미지 받은 액터, 기본 데미지, 컨트롤러, 데미지 입히는 액터, 데미지 타입을 필요로 하는 것을 알 수 있다.
우선 데미지 받은 액터는 OnHit 함수의 OtherActor에 해당하여 쉽게 할당이 가능하다.
다음으로 기본 데미지는 우리가 줄 데미지 수치로, 헤더에서 따로 선언해주자.
일단 초기 데미지로 50을 선언해주었다.
이제 컨트롤러다.
컨트롤러의 경우 다소 복잡하다.
우선 컨트롤러의 대상은 컴포넌트의 소유주이다.
따라서 GetOwner()를 통해 접근할 수 있다고 생각하지만, 현재 클래스는 단순한 발사체이다.
발사체를 컨트롤하게 되는 것은 폰에 해당하는 탱크나 터렛이므로 엉뚱한 곳을 가리키게 되는 셈이다.
따라서 발사체가 스폰되는 곳인 베이스폰으로 돌아가서 베이스폰으로 Owner를 지정해주어야 한다.
여기서 auto를 사용하였는데 auto를 사용하면 간단하게 알맞은 타입을 지정해준다.
auto에 마우스를 대보면 현재 auto 타입 변수가 어떤 타입인지 알 수 있다.
다음으로 데미지를 입히는 액터이다.
이는 발사체 자체이므로 this를 사용하면 된다.
마지막으로 데미지 타입이다.
이번 케이스의 경우 데미지 타입을 설정할 필요까지는 없지만, 필요로 하므로 무조건 할당자체는 해야한다.
여기서 타입을보면 TSubClassOf 이므로 UClass 타입을 필요로하는 것을 알 수 있다.
UClass 타입을 얻는 것은 StaticClass 함수를 이용하여 해당 데미지 타입에 대한 UClass 타입을 얻는 것이 가능하다.
우리가 TSubClassOf을 통해서 어떠한 값을 얻는 것을 원하는 것이 아니기에, 해당 함수를 통해 타입만 간단히 넘겨주는 것이 가능하다.
ApplyDamage 함수를 적용하기 앞서, 간단한 체크를 거쳤다.
데미지를 받는 액터가 있는지 체크해야하며, 데미지를 받는 액터가 자기 자신이거나, 소유주인 탱크나 터렛인 경우를 체크하도록 해주었다.
이제 데미지 이벤트가 생겼으니, 델리게이트가 실행되어 콜백 함수가 호출될 것이다.
해당 콜백 함수에서 받은 데미지를 확인하고, 현재 체력에서 받은 만큼의 데미지를 감소시킨 후의 체력을 출력해보자.
이제 컴파일하고 출력로그를 보면 맞을 때마다 체력이 감소되는 문구를 볼 수 있다.
하지만 문제가 있는데, 발사체가 사라지지 않고 남아있는 탓에 계속해서 히트 이벤트가 발생하여 체력이 엄청난 속도로 줄어드는 것이다.
이를 방지하기 위해서 히트한 발사체는 파괴되어야한다.
이는 히트가 발생한 곳에서 Destroy 함수를 통해 간단히 할 수 있다.
이제 히트가 발생하고 데미지를 준 발사체는 파괴되기 때문에 히트 이벤트가 추가로 발생하지 않는다.
따라서 깔끔해진 출력 로그창을 볼 수 있다.
'Unreal > Udemy 강의' 카테고리의 다른 글
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-29 (0) | 2024.04.09 |
---|---|
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-28 (0) | 2024.04.09 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-26 (0) | 2024.04.08 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-25 (0) | 2024.04.08 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-24 (0) | 2024.04.08 |