2024-03-21
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
블루프린트에서 플레이어안에 있는 Capsule Colider에 Spring Arm이랑 Camera를 추가해서 3인칭 fps 게임을 만들 수 있는데 블루프린트에서 직접하는게 아니라 c++ 코드로 생성하는 법을 배웠다. components를 직접 불러서 만들고 셋업하니까 되게 신기하고 재밌었다. 블루프린트에서 하던 작업을 코드로 진행하는 느낌이다.
Spring Arm (스프링 암) 컴포넌트를 추가하고 거기에 카메라 컴포넌트를 부모설정하여 게임플레이 상황에 따라 카메라와의 거리가 늘었다 줄었다 할 수 있다.
원래는 블루프린트에서 직접 추가해서 사용하는데 C++ 코드로도 추가해줄 수 있다.
카메라를 스프링 암의 끝에 달고 카메라 자체는 잘 안건들인다고 한다.
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;
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
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);
}