[Unreal] TPS 게임 만들기 실습 - (2)

박민주·2022년 8월 27일
0

Unreal

목록 보기
4/29

언리얼 게임잼을 준비하면서 인생 언리얼 교과서의 Chapter 03 실습 중이다.

UProjectileMovementComponent

  • 발사체 형태의 물리 기능을 제공하는 컴포넌트

UPROPERTY 매크로

  • 메모리 관리 및 리플렉션 등을 위해 사용

VisibleAnywhere 접근 권한

  • 컴포넌트의 디테일 속성을 수정 가능하되 컴포넌트 자체를 변경하지는 못하도록 함

총알을 만들어보자

부모 클래스는 Actor 클래스

총알 헤더파일

public:
	// 발사체의 이동을 담당할 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = Movement)
	class UProjectileMovementComponent* movementComp;
	// 충돌 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = Collision)
	class USphereComponent* collisionComp;
	// 외관 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = BodyMesh)
	class UStaticMeshComponent* bodyMeshComp;

총알 생성자

  • 외관을 담당하는 스태틱메시 컴포넌트 추가
  • 스태틱메시에도 충돌체가 있는데, 이미 충돌체 컴포넌트를 별도로 사용하고 있어서 스태틱메시의 충돌체는 비활성화
ABullet::ABullet()
{
	PrimaryActorTick.bCanEverTick = true;
	
	// 1. 충돌체 등록
	collisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("CollisionComp"));
	// 2. 충돌 프로파일 설정
	// -  충돌 프로파일 BlockAll: 모든 물체와 부딪혀 튕길 수 있도록 함 
	collisionComp->SetCollisionProfileName(TEXT("BlockAll")); 
	// 3. 충돌체 크기 설정
	collisionComp->SetSphereRadius(13);
	// 4. 루트로 등록
	RootComponent = collisionComp;

	// 5. 외관 컴포넌트 등록하기
	bodyMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMeshComp"));
	// 6. 부모 컴포넌트 지정
	bodyMeshComp->SetupAttachment(collisionComp);
	// 7. 충돌 비활성화
	// - 위에서 이미 충돌체를 등록해주었으므로 StaticMesh에 있는 충돌체는 꺼줌
	bodyMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	// 8. 외관 크기 설정
	bodyMeshComp->SetRelativeScale3D(FVector(0.25f));
}

프로젝타일 무브먼트 컴포넌트

  • 특정 컴포넌트에 대한 이동 기능 지원
  • 프로젝타일 무브먼트 컴포넌트 추가

위에서 스태틱메시의 충돌체는 비활성화해주었기 때문에
스태틱메시만 날아가면 아무런 충돌도 발생하지 않음

따라서 충돌체인 캡슐 컴포넌트가 날아가야 하고 스태틱메시는 캡슐 컴포넌트의 자식으로 들어가야 함

총알 생성자

	// 발사체 컴포넌트
	movementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("MovementComp"));
	// movement 컴포넌트가 갱신시킬 컴포넌트 지정
	// - 스태틱메시 컴포넌트의 부모가 collisionComp 이므로 스태틱메시도 같이 업데이트 될 것
	movementComp->SetUpdatedComponent(collisionComp);

총알의 속성 할당

  • movementComp를 통해 총알의 속도나 반동과 관련된 설정들을 해줄 수 있다

총알 생성자

	// 초기속도
	movementComp->InitialSpeed = 5000;
	// 최대속도
	movementComp->MaxSpeed = 5000;
	// 반동 여부
	movementComp->bShouldBounce = true;
	// 반동 값
	movementComp->Bounciness = 0.3f;

언리얼 에디터로 돌아가서 Blueprint 만들어주고 스태틱 메시 할당

배치한 다음에 플레이 해보면 날아가는 총알을 볼 수 있다..
사진 상 아주 조그마하게 나옴.. 작고 귀여운..

발사 구현

입력 -> Fire 액션 바인딩

내가 만들 거에서는 총이 필요 없으므로 총 붙이는 건 패스

발사 기능 구현

TPSPlayer의 헤더파일

// 총알 공장
	UPROPERTY(EditDefaultsOnly, Category = BulletFactory)
	TSubclassOf<class ABullet> bulletFactory;

TSubclassOf 템플릿 클래스는 템플릿에 등록된 ABullet 유형의 클래스,
혹은 블루프린트 클래스를 언리얼 에디터로부터 할당받을 수 있음

TPSPlayer의 블루프린트 디테일에서 아래와 같이 설정

발사 함수

  • 나는 총을 쓰지 않기 때문에 SK_Mannequin 메시의 소켓을 지정
void ATPSPlayer2::InputFire()
{
	// 총알 발사 처리
	// - 플레이어 메시의 중간지점에서 발사할 것임
	ConstructorHelpers::FObjectFinder<USkeletalMesh>
		TempMesh(TEXT("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'"));
	if (TempMesh.Succeeded())
	{
		FTransform firePosition = GetMesh()->GetSocketTransform(TEXT("FirePosition"));
		GetWorld()->SpawnActor<ABullet>(bulletFactory, firePosition);
	}
}

발사 함수 바인딩

void ATPSPlayer2::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
	PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &ATPSPlayer2::InputFire);
}

메시에다가 FirePosition 소켓 추가

진짜 제발

위 구조처럼 되어 있는데 Body Mesh Comp의 Scale이 너무 커서
임의로 바꿔주었는데 계속 요상한 크기로 Bullet이 나와가지고 헤맸다.
원인은 Collision Comp가 Body Mesh Comp랑 크기가 안맞고 혼자 커서 요상한 크기로 된 거였음...

언리얼 쉽지 않네요

profile
Game Programmer

0개의 댓글