콜리전 설정
ItemBox라는 이름으로 오브젝트 체널을 하나 생성한 후 프리셋도 하나 생성해서 기본 반응은 무시, MyCharacter와의 콜리전 반응만 겹침으로 설정해준다. 캐릭터의 ItemBox에도 마찬가지로 겹침 반응을 설정해야 한다. (콜리전 켜짐 메뉴의 값은 Query Only로 지정하고 오브젝트 유형은 ItemBox로 지정해준다. )
델리게이트
언리얼에서 제공하는 BoxComponent에는 Overlap Event를 처리할 수 있게 OnComponentBeginOverlap이라는 이름의 멀티캐스트 다이내믹 델리게이트가 선언되어 있다. 유형과 인자를 모두 복사해 매크로 설정과 동일한 멤버 함수를 선언하고 이를 해당 델리게이트에 바인딩한다. 그럼 위에서 설정한 겹침(Overlap)이벤트가 발생할 때마다 바인딩한 내 멤버 함수가 호출된다.
<델리게이트에 바인딩할 멤버 함수 선언>
private:
UFUNCTION()
void OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
구현
1. ItemBox 생성자 : StaticMesh, BoxComponent 생성 후 관계설정, 박스크기조절, 박스 에셋적용, 위치조정, 콜리전 설정, 아이템박스 획득 시 적용할 무기 클래스 지정.
AMyItemBox::AMyItemBox()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = false;
//박스 오브젝트 생성 (콜라이더, 스태틱메쉬) & 파티클
Trigger = CreateDefaultSubobject<UBoxComponent>(TEXT("TRIGGER"));
Box = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BOX"));
RootComponent = Trigger;
Box->SetupAttachment(RootComponent);
Trigger->SetBoxExtent(FVector(40.0f, 42.0f, 30.0f));
//스태틱메쉬 에셋 불러온 후 적용
static ConstructorHelpers::FObjectFinder<UStaticMesh> SM_BOX(TEXT("StaticMesh'/Game/InfinityBladeGrassLands/Environments/Breakables/StaticMesh/Box/SM_Env_Breakables_Box1.SM_Env_Breakables_Box1'"));
if (SM_BOX.Succeeded())
{
Box->SetStaticMesh(SM_BOX.Object);
}
Box->SetRelativeLocation(FVector(0.0f, -3.5f, -30.0f));
//콜리전 설정
Trigger->SetCollisionProfileName(TEXT("ItemBox"));
Box->SetCollisionProfileName(TEXT("NoCollision"));
//기본 클래스 값 지정
WeaponItemClass = AMyWeapon::StaticClass();
}
2. Character클래스에 SetWeapon함수 만들기 : 기존에 만든 무기장착 코드 함수로 만들어 외부에서 호출가능하게 만들기.
bool AMyCharacter::CanSetWeapon()
{
return (nullptr == CurrentWeapon); //캐릭터에 무기가 있는지 판단 -> 없으면 true 반환
}
void AMyCharacter::SetWeapon(AMyWeapon* NewWeapon) //캐릭터에 무기 장착하는 함수
{
if (nullptr != NewWeapon && nullptr == CurrentWeapon)
{
FName WeaponSocket(TEXT("FX_weapon_base"));
NewWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
NewWeapon->SetOwner(this);
CurrentWeapon = NewWeapon;
}
}
3. 위에서 선언한 델리게이트 연결 함수 정의하기.
void AMyItemBox::OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
auto ABCharacter = Cast<AMyCharacter>(OtherActor);
if (nullptr != ABCharacter && nullptr != WeaponItemClass)
{
if (ABCharacter->CanSetWeapon())
{
auto NewWeapon = GetWorld()->SpawnActor<AMyWeapon>(WeaponItemClass, FVector::ZeroVector, FRotator::ZeroRotator); //무기액터 월드에 소환후
ABCharacter->SetWeapon(NewWeapon); //캐릭터에 장착
Box->SetHiddenInGame(true, true);//박스 숨기기
SetActorEnableCollision(false); //더이상 아이템 획득 못하도록 콜리전 봉인
}
}
}
'UE4' 카테고리의 다른 글
[UE4] CSV 데이터 불러오기 (0) | 2022.11.11 |
---|---|
[UE4] 이펙트 구현하기 (0) | 2022.11.11 |
[UE4] 무기 액터 제작 (0) | 2022.11.09 |
[UE4] 캐릭터 에셋에 붙어있는 무기제거 (0) | 2022.11.08 |
[UE4] 스켈레톤 & 소켓 시스템 (0) | 2022.11.03 |