| 단축키 | 설명 |
|---|---|
| Ctrl + 클릭 | 함수, 클래스, 변수 이름 위에 마우스를 올리고 Ctrl을 누른 채 클릭하면, 해당 항목이 정의된 위치(헤더 파일 또는 소스 파일)로 이동 |
| Alt + F12 (Peek Definition) | 전체 파일로 이동하지 않고, 하단에 미리보기 창을 열어 정의 내용을 확인 가능 |
| F12 (Go to Definition) | 선택한 항목의 정의된 위치로 바로 이동합니다. 마우스 없이도 빠르게 탐색 가능 |
로컬 Windosw 디버거로 언리얼 엔진 실행






Tick과 SetupPlayerInputComponent는 부모 클래스의 기능을 그대로 호출 ➡ 헤더 파일에서는 해당 선언을 삭제해도 됨protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere)
int32 FullHP;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
int32 AttackCount;
private:
int32 CurrentHP;
int32 CurrentHP;
UPROPERTY로 선언⭕ 왜 FullHP는 UPROPERTY() 붙였을까?
: 보통 FullHP는 설정값(기본 체력)
❌ CurrentHP에는 왜 안 붙였을까?
CurrentHP는 런타임 중에만 변경되고 에디터에서 수정할 필요가 없는 값이기 때문UPROPERTY() 안 붙여도 됨⚠️ 예외
CurrentHP에도 이런 이유로 UPROPERTY() 붙일 수 있음
BlueprintReadOnlyReplicated| 변수 | UPROPERTY 필요? | 이유 |
|---|---|---|
FullHP | ⭕ 보통 붙임 | 초기값 설정, 에디터/블루프린트 노출 |
CurrentHP | ❌ or ⭕ 상황에 따라 | 런타임 내부 사용만이면 생략, 그 외엔 붙임 |
public과 private 접근 지정자를 구분하여 코드 가독성과 캡슐화 개선| 접근 지정자 | 접근 가능 대상 | 주로 넣는 멤버 예 | 판단 기준 질문 |
|---|---|---|---|
🔵 public | 누구나 (외부 클래스 포함) | 외부에서 접근해야 하는 값, 함수 인터페이스 등 | 외부 클래스가 직접 접근해야 해? |
🟡 protected | 자식 클래스까지만 | 자식 클래스에서 사용하는 설정 값, 재정의될 변수 등 | 자식 클래스만 접근하면 돼? |
🔴 private | 자기 클래스 내부만 | 내부 상태 관리용 변수, 외부에 숨겨야 하는 값 | 자기 클래스에서만 써야 안전해? |
🟡 protected
BeginPlay()는 엔진에서 자동으로 호출되는 함수로, 자식 클래스에서 Super::BeginPlay() 호출 후 추가 로직을 작성할 수 있도록 protected로 지정FullHP, AttackCount는 게임 로직상 자식 클래스에서 값을 읽거나 수정할 가능성이 있으므로 protected에 두기🔴 private
CurrentHP는 외부나 자식 클래스가 직접 접근해서 변경하면 안 되므로 private으로 설정TakeDamage() 같은 함수를 통해 간접적으로 접근하도록 설계public;
void Attack();
void Hit(int32 Demage);
void IncreaseKillCount();
UPROPERTY(EditAnywhere)
int32 FullHP;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
int32 AttackCount;
UPROPERTY(EditAnywhere)
int32 Strength;
public:
virtual void Attack();
Attack 함수는 플레이어와 적 각각 다르게 동작해야 함virtual 키워드를 사용하여 가상 함수로 선언👩 virtral
virtual로 선언된 함수는 자식 클래스에서 재정의(override) 할 수 있음👶 override
virtual 함수를 자식 클래스에서 다시 정의하는 것🧩 예시
#include <iostream>
using namespace std;
class Animal {
public:
virtual void sound() {
cout << "동물이 소리를 냅니다" << endl;
}
};
class Dog : public Animal {
public:
void sound() override { // ← 이게 오버라이드
cout << "멍멍!" << endl;
}
};
int main() {
Animal* a = new Dog();
a->sound(); // "멍멍!" 출력
delete a;
}
🧠 정리
| 용어 | 뜻 |
|---|---|
virtual | 부모 함수에 붙여서 자식에서 오버라이드 가능하게 만듦 |
override | 자식 함수에 붙여서 부모 함수 재정의하고 있다는 걸 명확히 표시 |
look과 move가 Vector2 타입인 이유이 두 입력이 2차원 방향 정보를 다루기 때문
1️⃣ move가 Vector2인 이유
방향키(WASD)나 조이스틱은 좌우(X), 상하(Y) 방향 입력을 동시에 받을 수 있음
(예) W + D 누르면 (1, 1) → 대각선으로 이동
move는 2D 평면상 이동 방향을 나타내는 벡터
2️⃣ look이 Vector2인 이유
마우스나 오른쪽 스틱 입력으로 카메라를 좌우(X), 상하(Y) 로 움직임
(예) 마우스를 위로 올리면 look.y가 양수
이것도 2차원 방향을 의미하므로 Vector2