개발 · 컴퓨터공학 / / 2022. 1. 29. 13:22

Learning Unreal 4 언리얼 공부일지 - 충돌을 이용한 아이템 습득

728x90
반응형

아이템에 캐릭터가 닿으면 충돌처리를 통해 아이템을 줍는 동작에 대해 알아보자.

 

아이템과 캐릭터가 충돌 할 때 특정 쿼리를 통해 Action이 있어야하므로, 엔진에서 콜리전 세팅을 통해 캐릭터와만 충돌하도록 캐릭터 외에는 다 무시하고 캐릭터만 겹치도록 아이템 충돌 preset을 설정하고, 캐릭터도 마찬가지로 아이템은 겹침, 나머지는 블록되도록 preset을 설정한다.

 

콜리전과 관련된 자세한 내용은 언리얼 엔진 문서를 참조해보자.

https://www.unrealengine.com/ko/blog/collision-filtering

 

언리얼 엔진 4 의 콜리전 필터링

무엇이 충돌하는지를 선택하는 것은 매우 중요하지만 까다로울 수 있으며, UE4 개발 도중 꽤 오래 논의를 거쳤던 문제입니다. 저희 시스템이 처음에는 약간 복잡해 보일 수는 있지만, 매우 강력

www.unrealengine.com

 

// MyWeapon.h

UCLASS()
class UNREALINTRODUCTION_API AMyWeapon : public AActor
{
	/.../
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	virtual void PostInitializeComponents() override;

private:
	// Overlap되었을 때 호출되는 함수
	UFUNCTION()
	void OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

public:
	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* Weapon;

	// Trigger Box 컴포넌트
	UPROPERTY(VisibleAnywhere)
	class UBoxComponent* Trigger;
};

Weapon 헤더에 Overlap 함수와 Trigger 컴포넌트를 추가한다.

 

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;

	Weapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WEAPON"));
    // Trigger 컴포넌트 할당
	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를 mesh에 attach
	Trigger->SetupAttachment(Weapon);

	Weapon->SetCollisionProfileName(TEXT("NoCollision"));
    // 충돌 설정
	Trigger->SetCollisionProfileName(TEXT("MyCollectible"));
    // trigger box 크기 설정
	Trigger->SetBoxExtent(FVector(30.f, 30.f, 30.f));
}

void AMyWeapon::PostInitializeComponents()
{
	Super::PostInitializeComponents();

	// Overlap시 실행되는 함수를 Trigger에 할당
	Trigger->OnComponentBeginOverlap.AddDynamic(this, &AMyWeapon::OnCharacterOverlap);
}

// Overlap 함수 정의
void AMyWeapon::OnCharacterOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	UE_LOG(LogTemp, Log, TEXT("Overlapped"));

	// Overlap되었을 때 Character의 socket에 mesh를 attach
	AMyCharacter* MyCharacter = Cast<AMyCharacter>(OtherActor);
	if (MyCharacter)
	{
		FName WeaponSocket(TEXT("hand_l_socket"));

		AttachToComponent(MyCharacter->GetMesh(),
			FAttachmentTransformRules::SnapToTargetNotIncludingScale,
			WeaponSocket);
	}
}

Weapon cpp파일에는 weapon과 character가 overlap되었을 때 socket에 weapon의 mesh를 attach하는 함수를 정의하고, 해당 함수를 trigger에 할당한다.

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유