콜리전 설정

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 |