[UE5] TIL - 10 <컴포넌트 구성하기>

ChangJin·2024년 3월 22일
0

Unreal Engine5

목록 보기
37/114
post-thumbnail

2024-03-21

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
블루프린트에서 플레이어안에 있는 Capsule Colider에 Spring Arm이랑 Camera를 추가해서 3인칭 fps 게임을 만들 수 있는데 블루프린트에서 직접하는게 아니라 c++ 코드로 생성하는 법을 배웠다. components를 직접 불러서 만들고 셋업하니까 되게 신기하고 재밌었다. 블루프린트에서 하던 작업을 코드로 진행하는 느낌이다.

TIL

  • 스프링 암 컴포넌트
  • 컴포넌트 구성하기

스프링 암 컴포넌트

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-spring-arm-components-in-unreal-engine?application_version=5.1

  • Spring Arm (스프링 암) 컴포넌트를 추가하고 거기에 카메라 컴포넌트를 부모설정하여 게임플레이 상황에 따라 카메라와의 거리가 늘었다 줄었다 할 수 있다.

  • 원래는 블루프린트에서 직접 추가해서 사용하는데 C++ 코드로도 추가해줄 수 있다.

  • 카메라를 스프링 암의 끝에 달고 카메라 자체는 잘 안건들인다고 한다.


컴포넌트 구성하기

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/adding-components-to-an-actor-in-unreal-engine?application_version=5.0

https://wergia.tistory.com/130

  • 액터에 컴포넌트를 추가하는 방법이다.

  • 지금 프로젝트에서Tank, Tower는 BasePawn을 각각 상속한다

  • Tank는 월드 내에서 움직이고, 플레이어가 컨트롤할 수 있다

  • 그러나 Tower는 한 자리에 고정되어 있고 코드에 의해서 콘트롤된다.

  • 각각 하위 클래스르 만들어서 공통 부분은 상속하고 다른 부분은 각 클래스에 추가해주면 된다.

  • 직접 코드로 만들어 보았다. BasePawn을 상속하는 Tank 클래스를 생성했다.

  • Tank 블루프린트에서 스프링암에 카메라 추가해서 달아주면 카메라가 따라다닌다.

  • 평소에 블루프린트에서 직접 SpringArm과 Camera를 추가하는 방법으로 했는데 이번에는 코드로 추가한다!

  • 다음과 같이 Tank.h를 구성하고,

private:
	UPROPERTY(VisibleAnywhere, Category = "components", meta = (AllowPrivateAccess = "true"))
	USpringArmComponent* springarm;

	UPROPERTY(VisibleAnywhere,Category = "components", meta = (AllowPrivateAccess = "true"))
	UCameraComponent* camera;
  • 다음과 같이 Tank.cpp를 구성했다.
ATank::ATank()
{
	camera = CreateDefaultSubobject<UCameraComponent>(TEXT("camera"));
	springarm = CreateDefaultSubobject<USpringArmComponent>(TEXT("springArm"));
	springarm->SetupAttachment(camera);
	RootComponent->SetupAttachment(springarm);
}
  • 그 다음 라이브 코딩을 돌렸는데..
  • 에러가 발생했다..
  • 삶이 쉽지 않음을 알 수 있다.
  [1/3] Compile Tank.cpp
  D:\Github\ToonTank\ToonTanks\Source\ToonTanks\Tank.cpp(7): error C2084: 'ATank::ATank(void)' 함수에 이미 본문이 있습니다.
  D:\Github\ToonTank\ToonTanks\Source\ToonTanks\Tank.h(17): note: '{ctor}'의 이전 정의를 참조하십시오.
  [2/3] Compile ToonTanks.init.gen.cpp
  [3/3] Compile Tank.gen.cpp
  • 문제는 간단했다. ATank 지정자를 만들지 않았고, SetAttachment의 사용이 부적절했다. 코드를 바꾸고 문제를 해결했다.
  • 아 그리고 Tank.h에서 굳이 헤더파일을 import 할 필요가 없다. 그냥 전방선언으로 선언해두고 cpp 파일에 헤더파일 추가하면 됨!
class TOONTANKS_API ATank : public ABasePawn
{
	GENERATED_BODY()

public:
	ATank();

private:
	UPROPERTY(VisibleAnywhere, Category = "components")
	class USpringArmComponent* springarm;

	UPROPERTY(VisibleAnywhere,Category = "components")
	class UCameraComponent* camera;
	
};
ATank::ATank()
{
	springarm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
	springarm->SetupAttachment(RootComponent);

	camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
	camera->SetupAttachment(springarm);
}
  • 문제 해결!!!
profile
게임 프로그래머

0개의 댓글