10. 미사일 폭파시 데미지

1. Sphere Overlap


단순히 액터를 감지하고 데미지를 주면 벽 너머로 히트가 발생하게 된다. 그래서 Overlap으로 감지한 후, Line Trace로 액터 사이에 벽이 있는지 한번 더 감지한다.

매우 작은 벽에 막히는 경우는 어떻게?

벽 너머로 히트가 발생하는 문제
1. Projects/펄어비스 인턴/4주차/__Attachments/Pasted image 20260129110104.png

2. IHitInterface


class IHitInterface
{
public:
	virtual void OnHit(AActor* Instigator) = 0;
};
class AHitReactor : public APhysicsBox, public IHitInterface
{
	virtual void OnHit(AActor* Instigator) override;
};

IHitInterface를 통해 Hit 이벤트를 발동시킨다.

3. HitManager


![[]] 위와 같이 Grid 형태로 미사일이 착탄되는데, 단순히 데미지를 주게 되면 각각의 미사일이 액터에게 데미지를 주어 액터가 여러번 데미지를 받게 된다. 따라서 AHitManager 액터를 만들어서, 데미지를 주는 것을 이 매니저 액터가 책임지도록 하게 한다. ```cpp class AHitManager : public AActor { public: void AddInstigator(AActor* Instigator);

/**
* @brief 관리 대상에서 인스티게이터를 제거합니다.
* @param Instigator 제거할 액터.
* @param bDestroyIfEmpty true일 경우, 남은 인스티게이터가 없으면 매니저를 즉시 파괴(Decommission)합니다.
/
void RemoveInstigator(AActor
Instigator, bool bDestroyIfEmpty = true);

// 해당 Instigator가 목록에 존재할 경우 목록의 인덱스 반환
// 없을 경우 -1 반환
int GetInstigatorIndex(AActor* Instigator);

// 해당 HittedActors가 목록에 존재할 경우 목록의 인덱스 반환
// 없을 경우 -1 반환
int GetHittedActorIndex(IHitInterface* HittedActors);

bool DestroyIfEmpty();

void Hit(IHitInterface* Victim, AActor* Instigator);

private:
TArray<IHitInterface*> mHittedActors;

TArray<AActor*> mInstigators;
};


- **Hit가 여러번 되는 장면**
![1. Projects/펄어비스 인턴/4주차/__Attachments/스크린샷 2026-01-29 104519.png](/img/user/1.%20Projects/%ED%8E%84%EC%96%B4%EB%B9%84%EC%8A%A4%20%EC%9D%B8%ED%84%B4/4%EC%A3%BC%EC%B0%A8/__Attachments/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202026-01-29%20104519.png)

- **Hit가 한번만 되는 장면**
![1. Projects/펄어비스 인턴/4주차/__Attachments/스크린샷 2026-01-29 105531.png](/img/user/1.%20Projects/%ED%8E%84%EC%96%B4%EB%B9%84%EC%8A%A4%20%EC%9D%B8%ED%84%B4/4%EC%A3%BC%EC%B0%A8/__Attachments/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202026-01-29%20105531.png)