콜리전 채널과 프리셋 세팅을 우선 해준다.
// MyWeapon.h
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void PostInitializeComponents() override;
private:
UFUNCTION()
void OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
public:
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* Weapon;
UPROPERTY(VisibleAnywhere)
class UBoxComponent* Trigger;
};
// MyWeapon.cpp
AMyWeapon::AMyWeapon()
{
// 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; // 무기는 Tick이 필요없다
Weapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WEAPON"));
Trigger = CreateDefaultSubobject<UBoxComponent>(TEXT("TRIGGER"));
static ConstructorHelpers::FObjectFinder<UStaticMesh> SW(TEXT("StaticMesh'/Game/ParagonGreystone/FX/Meshes/Heroes/Greystone/SM_Greystone_Blade_01.SM_Greystone_Blade_01'"));
if (SW.Succeeded())
{
Weapon->SetStaticMesh(SW.Object);
}
Weapon->SetupAttachment(RootComponent);
Trigger->SetupAttachment(Weapon); // 안하면 트리거가 따라가지 않을 수 있음
// 만들어둔 콜리전 프리셋 설정
Weapon->SetCollisionProfileName(TEXT("MyCollectible"));
Trigger->SetCollisionProfileName(TEXT("MyCollectible"));
Trigger->SetBoxExtent(FVector(30.f, 30.f, 30.f)); // 충돌 박스 생성
}
void AMyWeapon::PostInitializeComponents()
{
Super::PostInitializeComponents();
// 트리거 작동(충돌체크 발생)시 실행할 메소드를 콜백으로 넘겨줌
Trigger->OnComponentBeginOverlap.AddDynamic(this, &AMyWeapon::OnCharacterOverlap);
}
void AMyWeapon::OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UE_LOG(LogTemp, Log, TEXT("Overlapped"));
AMyCharacter* MyCharacter = Cast<AMyCharacter>(OtherActor);
if (MyCharacter)
{
FName WeaponSocket(TEXT("hand_l_socket"));
// 충돌된 캐릭터(MyCharacter)의 WeaponSocket에 현재 컴포넌트를 붙여준다(MyWeapon)
AttachToComponent(MyCharacter->GetMesh(),
FAttachmentTransformRules::SnapToTargetNotIncludingScale,
WeaponSocket);
}
}
MyWeapon C++ 클래스를 맵에 몇개 배치해두고 위로 지나다니면 충돌 처리시 소켓에 붙게 된다.
'언리얼 엔진 > 언리얼 엔진4 입문' 카테고리의 다른 글
[UE4 입문] UI 실습 (0) | 2022.09.03 |
---|---|
[UE4 입문] 스탯 매니저 (0) | 2022.09.02 |
[UE4 입문] 소켓 실습 (0) | 2022.09.02 |
[UE4 입문] 충돌 기초 (0) | 2022.09.02 |
[UE4 입문] 블렌드 스페이스 (0) | 2022.09.02 |