Unreal Engine
카메라 세팅
Awesome Red Tomato
2023. 7. 6. 17:43
버전: 4.26.2
프로젝트 생성
Games -> Blank -> C++, Maximum Quility, Raytacing Enable, Desktop/Console, No Starter Content
프로젝트를 생성하면 컨텐츠 브라우저에 위와 같이 GameModeBase 하나가 생긴다. 게임모드는 게임의 전반적인 형식과 룰을 담는 클래스다.
캐릭터를 따라다니는 카메라
// CharacterBase.h
private:
/** 캐릭터와 카메라 사이에 배치할 SpringArm */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
USpringArmComponent* SpringArm;
/** 캐릭터를 따라다니는 카메라 */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
UCameraComponent* Camera;
public:
/** SpringArm 컴포넌트 리턴 */
FORCEINLINE USpringArmComponent* GetSpringArm() const { return SpringArm; }
/** 카메라 컴포넌트 리턴 */
FORCEINLINE UCameraComponent* GetCamera() const { return Camera; }
// Sets default values
ACharacterBase::ACharacterBase()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// SpringArm 초기화
SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
SpringArm->SetupAttachment(GetRootComponent());
SpringArm->TargetArmLength = 300.0f; // 카메라와 캐릭터 사이 거리 = 300.0f
SpringArm->bUsePawnControlRotation = true; // 컨트롤러에 따라 회전
// Camera 초기화
Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
Camera->SetupAttachment(SpringArm, USpringArmComponent::SocketName);
Camera->bUsePawnControlRotation = false; // 카메라 회전을 막아놓는다.
}
FORCEINLINE
inline 은 별도의 코드 블록을 구현해 함수를 호출하지 않고 곧바로 구현 코드를 작성하는 방법이다. 일반적으로 #define 매크로보다 안전하다.
- inline: 컴파일 단계에서 처리됨. 수행 시 타입 검사가 적용됨.
- define: 전처리 단계에서 치환됨. 대치 시 어떠한 타입 검사가 이루어지지 않음.
inline int sum(int a, int b)
{
return a + b;
}
이 코드를 컴파일 할 경우, sum함수 호출 부분이 블록 안 코드로 대체될 것이다. 이는 함수 호출 시 발생하는 오버헤드를 줄이기 위함이다.
오버헤드: 특정 기능을 수행하는데 드는 처리시간, 메모리 자원 등
그럼 inline과 FORCEINLINE의 차이는 무엇일까.
C++에서 inline은 컴파일러에게 함수를 인라인화 할 것을 '요청'한다. 이는 명령이나 강제가 아니기에 복잡한 함수나 가상 함수는 컴파일러에서 인라인화를 해주지 않는다. 반면 FORCEINLINE은 말 그대로 Force + Inline, 강제로 인라인화 시킨다.