UE4

[UE4] 아이템 상자 제작

Honey Badger 2022. 11. 11. 02:38

콜리전 설정

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