본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 64. 에너미에게 무기 쥐어주기


목차

  1. 에너미에게 무기 쥐어주기
  2. 충돌 없애기
  3. 에너미 사망시 무기 없애기

1. 에너미에게 무기 쥐어주기

 

캐릭터에 무기를 쥐어주는 것도 방패를 쥘때랑 비슷하다. 소켓을 만들고 그것에 무기를 달아주면 된다.

 

다만 한가지 다른 점은 무기는 방패와 달리 실제 상호작용을 할 것이고 그렇기 때문에 단순한 스태틱매시가 아닌 블루프린트 클래스를 부착해주어야 한다.

 

에너미 헤더파일로 들어가자

 

UPROPERTY(EditAnywhere)
TSubclassOf<class AWeapons> WeaponClass;

 

헤더 파일에 선언을 한뒤 이걸 어디서 생성하고 어떻게 부착시켜야 할까?

 

방패와 달리 무기는 월드에 생성을 한 뒤 부착을 시도할 것이고 월드에 생성을 하기 위해서는 게임이 시작되어야 할 것이다.

 

BeginPlay()에서 생성하고 부착해보자.

 

UWorld* World = GetWorld();
if (World && WeaponClass)
{
	World->SpawnActor<AWeapons>(WeaponClass);
}

 

무기를 생성했고 이제 부착하면 된다. 무기 클래스에는 캐릭터에 부착하는 함수를 만들어두었기 때문에 그것을 그대로 쓰면 된다.

 

UWorld* World = GetWorld();
if (World && WeaponClass)
{
	AWeapons* DefaultWeapon = World->SpawnActor<AWeapons>(WeaponClass);
	DefaultWeapon->Equip(GetMesh(), FName("RightHandSocket"), this, this);
	EquippedWeapon = DefaultWeapon;
}

 

무기를 부착하였다. 이제 다음 작업을 해보자. 무기를 들고 다니다 다른 곳에 부딪히면 문제가 발생할 수 있다. 무기에는 콜리전 박스가 있어 무기 자체의 콜리전은 불필요하고 이것을 제거해야 한다.


2. 충돌 없애기

 

Item.cpp 파일로 들어가자

ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);

 

콜리전을 없애주면 된다.

 

 

이제 이렇게 무기를 잘 들고 있는 것을 볼 수 있다.


3. 에너미 사망시 무기 없애기

 

현재 에너미가 죽으면 무기가 그대로 남는다. 에너미가 사라지면 무기도 사라지게 하자.

 

무기 클래스는 EquippedWeapon 변수에 저장해놓아서 이를 파괴하면 된다. 에너미의 Die() 함수에서 Destroy() 함수를 실행하면 되겠지만 에너미가 죽자마자 바로 실행하는 것이 아닌 에너미가 사라지면 그때 같이 사라지게 할 것이고 그렇게 하기 위해서는 Destroy() 함수의 실행 시점을 에너미가 사라진 후로 해야할 것이다.

 

그렇게 하기 위해서는 Destroyed() 라는 또 다른 함수를 오버라이드 해서 사용하면 된다. 이 함수는 개체가 사라지면 (파괴되면) 호출되는 함수라고 한다.

 

UCLASS()
class PRACTICE_API AEnemy : public ABaseCharacter
{
	GENERATED_BODY()

public:

virtual void Destroyed() override;

// 생략
}

 

void AEnemy::Destroyed()
{
	if (EquippedWeapon)
	{
		EquippedWeapon->Destroy();
	}
}

 

이렇게 하면 올바른 타이밍에 클래스 파괴가 가능해진다.

 

이제 무기도 들었으니 다음에는 에너미가 실제로 공격을 하게 만들어보자