728x90
반응형
아이템에 캐릭터가 닿으면 충돌처리를 통해 아이템을 줍는 동작에 대해 알아보자.
아이템과 캐릭터가 충돌 할 때 특정 쿼리를 통해 Action이 있어야하므로, 엔진에서 콜리전 세팅을 통해 캐릭터와만 충돌하도록 캐릭터 외에는 다 무시하고 캐릭터만 겹치도록 아이템 충돌 preset을 설정하고, 캐릭터도 마찬가지로 아이템은 겹침, 나머지는 블록되도록 preset을 설정한다.
콜리전과 관련된 자세한 내용은 언리얼 엔진 문서를 참조해보자.
https://www.unrealengine.com/ko/blog/collision-filtering
// 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
반응형
'개발 · 컴퓨터공학' 카테고리의 다른 글
Learning Unreal 4 언리얼 공부일지 - Hp bar 만들기 (0) | 2022.02.02 |
---|---|
Learning Unreal 4 언리얼 공부일지 - GameInstance로 데이터 만들어 사용해보기 (0) | 2022.01.30 |
Learning Unreal 4 언리얼 공부일지 - 언리얼의 소켓 (0) | 2022.01.28 |
Learning Unreal 4 언리얼 공부일지 - 충돌 감지 해보기 (0) | 2022.01.27 |
Learning Unreal 4 언리얼 공부일지 - 블렌드 스페이스가 뭐지 (0) | 2022.01.26 |