Unreal Engine 5/C++와 Unreal Engine으로 3D 게임 개발

C++ Actor 클래스 생성 및 삭제하기

iiblueblue 2025. 1. 21. 12:01
⊙ Actor와 Object의 차이를 이해한다.
⊙ 새로운 Actor 클래스를 생성하는 방법을 안다.
⊙ 생성한 Actor 클래스를 삭제하는 방법을 안다.

 

Actor(AActor)와 Object(UObject)의 차이

Actor는 지금까지 학습하면서 정말 많이 들어본 단어이다. 그리고 Object는 들어본적은 있지만 그렇게 친숙하게 다가오는 단어는 아니다. 두리뭉실하게 Actor와 비슷한 말인가? 아니면 그냥 물체 처럼 보이는 모든게 Object인가? 라고 생각했을 뿐이다. 하지만 이 둘엔 엄밀한 차이가 있고 관계가 있다.

 

Object(UObject)란?

UObject는 언리얼 엔진에서 모든 클래스의 최상위 부모다. 그말인 즉슨 Actor도 UObject의 자식이라는 말이 된다. 둘의 관계가 첫 문장부터 아주 명확해졌다.

하지만 UObject는 화면에 보이지 않는 추상적인 부분을 처리하는 역할이다. 추상적인 부분이라 하면 데이터나 로직 등을 생각할 수 있겠다. 예를 들어 플레이어 능력치(HP, 경험치), AI 정보, 게임 설정 값, 임시 계산 로직 등이 해당한다.

또한 추상적이기 때문에 스스로 월드(레벨)에 배치될 수 없다.

  • 모든 클래스의 최상위 부모
  • 스스로 월드에 배치될 수 없음
  • 화면에 보이지 않는 추상적인 부분을 담당(데이터, 로직 등)

 

Actor(AActor)란?

앞에서 이미 이야기 했지만 AActor는 Uobject를 확장(상속)한 클래스다. 둘은 서로 부모 자식 관계다.

또 Object와 다르게 월드에 배치(Spawn)할 수 있다. 실제 게임 세계에서 보이고 상호작용하는 캐릭터, 적 몬스터, 조명, 파티클 효과 등 주로 AActor을 기반으로 제작한다.

그러기 위해서는 여러가지 기능을 가진 컴포넌트가 필요하다. 존재할 수 있다는 것은 위치(트랜스폼), 회전, 크기 등 공간적 정보를 자지고 있다는 것을 말한다. 또한 Actor는 메시, 파티클, 사운드 등 여러 컴포넌트를 추가로 붙일 수 있다.

  • UObject를 확장(상속)한 클래스
  • 월드에 배치(Spawn)할 수 있음
  • 실제 게임 세계에 보이고 상호작용 하는 부분을 담당(캐릭터, 적 몬스터, 조명, 파티클 효과 등)
  • 위치, 회전, 크기 등 공간적 정보를 가짐
  • 여러 컴포너트를 추가 가능

 

Actor와 Object의 차이점

구분 UObject AActor
기본 개념 언리얼 엔진에서 모든 클래스의 최상위 부모 UObject를 확장하여 월드에 배치 가능한 클래스
월드와의 관계 월드(레벨)에 배치할 수 없음 월드(레벨)에 배치 가능
주요 역할 데이터 및 로직 관리 게임 세계에서 보이고 상호작용하는 요소
공간 정보 위치, 회전, 크기 등의 공간 정보 없음 위치, 회전, 크기 등의 트랜스폼 정보를 가짐
컴포넌트 컴포넌트 사용 불가 메시, 파티클, 사운드 등 다양한 컴포넌트를 추가 가능
사용 예시 - 플레이어 능력치
- AI 정보
- 게임 설정 값 등
- 캐릭터
- 적 몬스터
- 무기
- 조명
- 파티클 효과
추상적/구체적 추상적 개념을 처리 구체적, 시각적으로 표현되며 월드와 상호작용

 


 

새로운 Actor 클래스 생성

이제 드디어 Actor 클래스를 생성하고 월드에 배치해보자. 이번에는 블루프린트가 아닌 C++ 클래스로 생성해보는 액터다.

Actor 클래스 생성하기

언리얼 에디터 상단 메뉴에서 Tools → New C++ Class를 선택한다. 클릭하면 팝업창 하나가 뜨게 되는데 이 창에서는 내가 만들 C++ 클래스의 부모 클래스를 고를 수 있다.

Common 클래스에서는 일반적으로 개발자들이 많이 사용하는 클래스들이 모여있다. 우리가 사용할 Actor도 여기 있다. 그 외에는 Character, Pawn 등 어디서 들어본 클래스들이 많이 보인다. 만약 Common Class에 원하는 클래스가 없다면 All Classes를 선택하여 원하는 클래스를 부모로 할 수 있다.

이 곳에서는 모든 클래스 중에서 원하는 클래스를 고를 수 있다.

 

원하는 클래스를 고른 후 public과 private을 고른 후 클래스의 이름을 정해준다. public과 private의 차이는 아래서 설명하도록 하겠다.

마지막으로 Create Class를 눌러주면 클래스가 완성되게 된다.

 

동시에 Visual Studio에 아래와 같은 메시지가 뜨게 되는데 이는 프로젝트에 벼경이 생겼으니 다시 로드하라는 안내로 겁먹지 말고 모두 다시 로드를 눌러주면 된다.

 

이렇게하면 정상적으로 새로운 Actor 클래스를 생성할 수 있다. Visual Studio에는 cpp 파일과 h 파일이 생성되고 언리얼 에디터를 열면 아래와 같이 C++ Class가 생성된 것을 확인할 수 있다.

 

한 가지 의문이 들 수 있다. 어차피 C++ 클래스를 생성하는 것이라면 이전에 Visual Studio만 이용해 개발할 때처럼 내가 직접 cpp 파일과 h 파일을 만들어서 추가하면 안되는 걸까?

결론적으로 이야기하면 가능하다. 단, 매우 번거로운 처리가 동반된다. 앞으로 나올 아래의 내용을 보면 알 수 있겠지만 cpp와 h파일을 만들면 그냥 빈 파일만 생성되는 것이 아니다. 안에는 언리얼에서 C++ 클래스를 사용하기 위한 다양한 매크로와 전처리가 포함되어 있는 것을 볼 수 있는데 언리얼에서 사용하기 위한 처리를 직접 해야하는 불편함이 있다. 따라서 위와 같은 방법으로 C++ 클래스를 추가하는 것을 권장한다.

 

생성된 클래스 살펴보기

언리얼 에디터에는 C++ Classes 폴더 → 프로젝트 명 폴더  → Public을 확인하면 생성한 C++ 클래스 파일을 확인할 수 있다.

 

그렇다면 Visual Studio에서는 무엇이 생기고 어디에 생겼는지, 생성된 클래스를 확인해보자.

새로 생긴 cpp 파일과 h 파일이 어디있는지 처음엔 안보였다. 하지만 Source 폴더를 하나하나 열며 찾다 보면 Public에는 헤더 파일이, Private에는 cpp 파일이 잘 존재하는 것을 확인할 수 있다. 이렇게 생성된 이유는 내가 생성할 때 public을 선택하고 생성하여서 그렇다.

Public 생성과 Private 생성의 차이

시간을 좀 거슬러 올라가서 아까 Class Type를 선택하는 바로 이 시점에서 나는 Public을 선택했다. 만약 Private을 선택했다면 무엇이 다른 것일까?

 

솔루션 폴더에서 Source 아래 프로젝트 명으로 적힌 폴더를 모듈이라고 한다. 여기서는 ch3_unreal3dgame이 모듈이라고 할 수 있겠다. 지금은 하나의 모듈만 솔루션 탐색기에 보이고 있지만 사실 프로젝트 안에는 여러개의 모듈을 보유할 수 있다. 그리고 Public과 Private은 이 모듈들 간에 서로 사용할 수 있고 없고의 차이를 말한다.

 

Public으로 생성했을 때

  • 헤더 파일은 Public 폴더에, cpp 파일은 Private 폴더에 생성된다.
  • 프로젝트의 다른 모듈에서 쉽게 #include 할 수 있어 편리하다.

Private로 생성했을 때

  • 헤더 파일과 cpp 파일 모두 Private 폴더에 저장된다.
  • 해당 모듈에서만 접근 가능하게 되며 특정 로직이나 구현을 캡슐화해서 외부에 노출하고 싶지 않을 때 사용한다.

 

규모가 커질수록 이러한 구조를 잘 활용하여 모듈 간 경계를 명확하게 하고 코드 접근 범위를 정리하는 것이 중요해진다. 하지만 아직은 연습하는 단계이기 때문에 모두 Public으로 생성하는 것으로 하자.

 


 

Actor 클래스 삭제

"Content Browser에서 삭제하면 됩니다!" 하고 끝이면 좋았겠지만 이런 방법으로는 Actor 클래스를 삭제할 수 없다. 몇 가지 단계의 삭제 후 파일을 완전히 삭제할 수 있다. 만약 이런 방법으로 삭제하지 않는다면 클래스가 제대로 삭제되지 않아서 빌드에 꼬임이 발생하거나 클래스 미삭제 오류 등이 발생할 수 있다.

삭제하는 메뉴조차 없는 것을 볼 수 있다.

 

결론적으로 Visual Studio에서 한번 삭제해주어야 하고 실제 프로젝트 폴더에 가서 물리적으로 파일을 삭제 해주어야 완전히 삭제할 수 있다.

Visual Studio에서 파일 제거

먼저 언리얼 에디터를 종료해준다. 이렇게 파일이 생기고 변경이 생기는 과정에서는 언리얼 에디터가 켜져 있는 것이 좋지 않다.

그리고 Solution Explorer에서 삭제할 클래스를 찾은 후 우크릭하여 Remove(제거) 해주면 된다. 헤더파일과 cpp 파일 모두 제거해야 한다. 제거한 후 모두 저장을 한번 눌러 저장해준다.

파일을 삭제했지만 사실 아직 파일은 완전히 삭제되지 않았다. 솔루션에서만 제거된 것일 뿐 실제 파일은 아직 남아있는 것이다.

 

프로젝트 폴더에서 물리적 파일 삭제

윈도우 탐색기에서 프로젝트 파일로 들어간다. 그리고 모든 C++ 소스가 들어있다고 했던 Source 폴더에 들어간다. 프로젝트 이름을 누르면 Public과 Private 폴더가 보이는데 어디서 많이 봤던 폴더이니 이제 어디에 뭐가 있는지 알 수 있을 것이다.

Private에는 cpp 파일이, Public에는 h 파일이 각각 존재하는데 모두 물리적으로 삭제해준다. 이렇게까지 해야 완전히 C++ 클래스 파일을 삭제할 수 있다.

 

다 삭제한 후 다시 Visual Studio로 들어가 Visual Studio를 빌드해 에디터를 재실행하면 된다.

 

정리하면 이렇다.

  1. 언리얼 에디터를 종료한다.
  2. Visual Studio에서 cpp 파일과 h 파일을 제거하고 저장한다.
  3. 프로젝트 폴더에서 물리적으로 파일을 삭제한다.

 


 

배운 내용 정리

  • Actor와 Object에는 부모 자식의 관계이며 둘 사이에는 차이가 있다.
  • C++ 클래스를 생성하기 위해서는 Tools → New C++ Class를 선택한 후 부모 클래스를 결정하고 Public과 Private 설정, 그리고 이름을 결정한다.
  • Public으로 선언하면 헤더 파일은 Public에 cpp 파일은 Private에 저장되지만 Private로 선언하면 두 파일 모두 Private에 저장된다. 이는 모듈의 접근여부를 결정할 수 있는 설정이다.
  • Actor 클래스를 삭제하기 위해서는 특정 순서에 따라 삭제를 진행해야 한다. 그렇지 않으면 빌드 오류나 클래스 미삭제 오류가 발생한다.