언리얼 5

230912 무기 구현 / 몬스터 AI

슬뷔 2023. 9. 12. 10:56

언리얼엔진 기능

데칼 

데칼을 넣으면 박스형태가 보이고, 데칼영역안에 물체가 있으면 박스에 겹치면 어떤 그림을 그리게 하게 한다.

ex ) 총알 자국, 발자국, 수류탄 던지면 바닥에 크레이터 생성

 

effect -> 새폴더 -> Decal -> Decal Actor 상속 받은 BPC_Crater 생성 ->  BPC_Crater가 사용할 머테리얼 생성 MT_Crater

MT_Crater -> 도메인 Deferred Decal, 블랜드 Translucent 

MT_Crater -> 베이스 컬러 ( float 4 생성 ) 단순한 색상 표현

* 숫자 4 +  누르면 float 4 생성된다. 

MT_Crater -> Textture Object ( 표현하고 싶은 그림 ) -> Texture Sample

* Texcoord ( 그림 그리려는 데칼 안의 UV 값 )

MT_Crater -> Texture Sample 의 알파값 -> 오파시티에 저장 

BPC_Crater -> 디테일 -> 페이드인 / 아웃

BPC_Player_C -> 디테일 -> 데칼 수신을 받지않는다 ( 데칼영역 가도 데칼이 입혀지지 않는다 )

 

충돌

1. 구충돌

 


무기 구현

플레이어는 몸만 있고 착용할 무기가 각각 자기만의 고유 몽타주를 갖고 있어서 플레이어가 장착.

역으로 무기에서 플레이어로 몽타주를 돌려줘서 알맞은 애니메이션이 재생되게 한다.

충돌도 무기에 달아서 역으로 플레이어에게 알려주는 구조

SkeletonMeshActor를 상속받아서 Weapon_Base 를 제작.

Weapon_Base를 상속 받는 BPC_Sword 제작

 

시작하자마자 캐릭터에 무기 부착

1. 우선 손위치에 그저 스폰만 됨

BPC_Player_C -> 이벤트 그래프

 

단점

-> 스폰을 하는 순간, 어태치 시키기도 전에 BeginPlay 가 시작되어 Owner 를 저장하기 전이라 null 이 나온다.

 

해결?

이팩트는 지연이팩트를 사용했다.

1. 스폰시킬 때, 소유주를 미리 알려줄 수 있다

2. Public 으로 전환

Public 으로 전환

3.

(1) BPC_Sword 에서 Set Weapon Owner 함수 제작

(2) BPC_Sword 에 IA_Fire 생성해서 연결

(3) BPC_Player_C 이벤트 그래프 연결

 

몬스터 행동 패턴 ( AI )

몬스터 상속구조

Monster_Base

 

1. struct.h 에서 구조체 생성

USTRUCT(Atomic, BlueprintType)
struct FMonInfo
	: public FTableRowBase
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float CurHP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float MaxHP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float CurMP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float MaxMP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Att; // 공격력

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float DetectRange; // 탐지 범위

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float AttRange; // 공격 사거리
};

2. enum.h 에서 몬스터 enum 값 생성

UENUM(BlueprintType)
enum class EMON_TYPE : uint8
{
	MON_MELEE,
	MON_RANGE,
	MON_BOSS,
};

3. 몬스터 -> Table -> 마우스 우클릭 -> 기타 -> 데이터 테이블 -> FMonInfo -> DT_Monster

* FMonInfo 를 가져오려면 struct.h 에서 FMonInfo 가 FTableRowBase 를 상속 받아야한다.

* FTableRowBase 를 쓰려면 #include "Engine\DataTable.h" 참조해야한다.

4. Monster_Base.h / Monster_Base.cpp 추가

UCLASS()
class UNREAL_3TH_API AMonster_Base : public ACharacter
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Info")
	FMonInfo		m_Info;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Info")
	EMON_TYPE		m_MonType;
}
void AMonster_Base::BeginPlay()
{
	Super::BeginPlay();
	
	// 데이터 입력
	UDataTable* pDataTable = LoadObject<UDataTable>(nullptr, TEXT("/Script/Engine.DataTable'/Game/BlueprintClass/Monster/Table/DT_Monster.DT_Monster'"));

	// 데이터 테이블 안에서 몬스터 타입에 맞는 행 정보를 가져와서
	if (IsValid(pDataTable))
	{
		FMonInfo* pInfo = nullptr;

		if (EMON_TYPE::MON_MELEE == m_MonType)
			FMonInfo* pInfo = pDataTable->FindRow<FMonInfo>(FName(TEXT("MELEE")), TEXT(""));

		else if (EMON_TYPE::MON_RANGE == m_MonType)
			FMonInfo* pInfo = pDataTable->FindRow<FMonInfo>(FName(TEXT("RANGE")), TEXT(""));

		// 몬스터의 m_Info 값을 넣어준다.
		if(nullptr != pInfo)
			m_Info = *pInfo;
	}
}