일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 게임개발
- 파이썬서버
- R
- 레베카
- VUE
- 알고풀자
- 디자드
- 으
- 미니프로젝트
- 카렌
- 프린세스메이커
- 데이터베이스
- Express
- Enhanced Input System
- EnhancedInput
- 정글사관학교
- 스마일게이트
- JWT
- Ajax
- 언리얼뮤지컬
- 스터디
- node
- 언리얼프로그래머
- flask
- 마인크래프트뮤지컬
- 프메
- Jinja2
- Bootstrap4
- Unseen
- 언리얼
- Today
- Total
Showing
[Unreal] 델리게이트를 활용하여 Bullet으로 enemy 제거 본문
델리게이트는 A에 Function을 등록해두었다가, A가 불리면 등록해둔 Function을 호출할 수 있는 기능이다. 참고로, Delegate 와 Function의 매개 변수 구성이 같아야 한다.
OnComponentBeginOverlap에 함수를 등록하여 총알이 enemy에 닿을 경우에 enemy를 제거하는 기능을 수행하도록 코드를 작성해보도록 한다.
Delegate 와 Function의 매개 변수 구성이 같아야 하므로, 블루프린트를 참고하여도 되고 아니면
sphereComponent->OnComponentBeginOverlap 이렇게 코드를 작성하고 OnComponentBeginOverlap에 커서를 올려 f12를 누르면 C:\Program Files\Epic Games\UE_5.2\Engine\Source\Runtime\Engine\Classes\Components\PrimitiveComponent.h로 타고 들어가게 된다.
PrimitiveComponent.h 에서 OnComponentBeginOverlap를 전체 검색하면, 인자들을 찾아볼 수 있다.
DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SixParams(
FComponentBeginOverlapSignature, UPrimitiveComponent,
OnComponentBeginOverlap, UPrimitiveComponent*,
OverlappedComponent, AActor*, OtherActor,
UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool,
bFromSweep, const FHitResult &, SweepResult);
bullet.h 에 같은 인자구성을 한 UFUNCTION()를 만들어준다.
UFUNCTION() //델리게이트에 붙일 함수 제작
void OnBulletOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OhterBodyIndex, bool bFromSweep,
const FHitResult& SweepResult);
bullet.cpp
sphereComp의 OnComponentBeginOverlap (델리게이트)와 OnBulletOverlap (함수)를 연결헤준다.
OnComponentBeginOverlap(사장님)가 ABullet::OnBulletOverlap(일꾼, 대리자)에게 일을 시키는 원리이다.
void ABullet::BeginPlay()
{
Super::BeginPlay();
//AddDynamic -> Dynamic 동적, bind
sphereComponent->OnComponentBeginOverlap.AddDynamic(this, &ABullet::OnBulletOverlap);
}
//OnComponentBeginOverlap(사장님)가 ABullet::OnBulletOverlap(일꾼, 대리자)에게 일을 시킴
참고로, 블루프린트 cast는 상당히 성능이 좋지 않다. 따라서 웬만하면 형변환은 c++를 사용하는 것이 낫다.
만들어둔 OnBulletOverlap에서 필요한 내역들을 상세 코딩해준다.
void ABullet::OnBulletOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OhterBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
//OtherActor가 존재하는데 어떠한 Actor랑 Overlapped 함
AEnemyActor* enemy = Cast<AEnemyActor>(OtherActor);
//OtherActor를 AEnemy 클래스로 취급해서, (형변환)
//enemy 주소에 넣어봄
//만약에 enemy 주소가 비어있지 않다면,
if (enemy != nullptr) {
OtherActor->Destroy();
//OtherActor는 enemy이다.
}
}
총알에 부딪힌 enemy가 정상적으로 제거되는 것을 확인할 수 있다!
'Unreal' 카테고리의 다른 글
[Unreal] 이중 포문을 활용한 총알 패턴 적용 (1) | 2023.10.27 |
---|---|
[Unreal] UI Change Control (0) | 2023.10.27 |
[Unreal] 언리얼 좌표계 Pitch, Roll, Yaw 이해와 짐벌락 이슈 해결 (0) | 2023.10.23 |
[Unreal] Meta Human 제작 후 언리얼 3D 캐릭터에 입히기 (0) | 2023.10.20 |
[언리얼] Unreal C++로 Player를 쫓아오는 Enemy 구현 (0) | 2023.10.19 |