Unreal 개발자를 위한 Unity 사용 가이드

Tutorial

·

intermediate

·

+10XP

·

30 mins

·

(26)

Unity Technologies

Unreal 개발자를 위한 Unity 사용 가이드

이 가이드는 Unreal 엔진 개발자가 Unity 엔진과 에디터, 다양한 워크플로에 익숙해지도록 지원하기 위해 작성되었습니다.

Languages available:

1. 시작하기

Unity를 시작하기 전에 먼저 필요에 맞는 올바른 버전의 엔진을 설치해야 합니다. 스탠드얼론 애플리케이션인 Unity Hub를 사용하면 Unity 프로젝트와 설치 항목을 간편하게 검색, 다운로드 및 관리할 수 있습니다. 'Installs' 페이지에서 'Add' 버튼을 클릭하면 최신 버전의 Unity를 이용할 수 있습니다.



프로그래밍 환경 설정


Unity 프로그래밍에 권장되는 IDE(Integrated Development Environment, 통합 개발 환경)는 Visual Studio이며, 최신 버전의 Unity는 Visual Studio Professional 2019와 함께 제공됩니다. 그러나 Unity에서는 모든 스크립트를 Unity 에디터를 통해 컴파일하므로 IDE 사용 조건이 엄격하지는 않습니다. 따라서 원하는 코드 에디터를 사용할 수 있으며, 이미 Unity 통합 기능이 제공되는 툴도 많습니다.


Unity는 Intellisense, 자동 완성 등 유용한 기능과 중단점, 감시점 등 디버깅 툴이 있는 Visual Studio를 권장합니다. Visual Studio는 사전 설치되므로 추가 설정이 필요 없습니다. 자세히 알아보려면 공식 가이드에서 팁을 확인해 보세요.


2. 에디터

Unity를 처음 열면 Unreal과 유사한 레이아웃이 표시됩니다. 두 에디터 모두 완전히 커스터마이즈 가능한 모듈식 창으로 구성되어 있습니다. 덕분에 인터페이스에서 탭과 패널을 옮기거나 크기를 조절하고, 교체할 수도 있습니다. 아래에서는 Unity의 주요 뷰와 이에 상응하는 Unreal 에디터의 요소를 소개합니다.



씬 뷰(뷰포트)


씬(Scene) 뷰는 Unity에서의 뷰포트(Viewport)로, 씬을 시각적으로 탐색하며 편집할 수 있습니다. 게임 오브젝트를 선택하면 눈에 익은 3D 변형 핸들이 나타나며, 툴바 좌측 상단에 있는 버튼으로 유형을 선택할 수 있습니다. 툴바를 활용하면 피벗 옵션을 선택하고 월드/로컬 방향 간 전환도 가능합니다. 툴바 중앙에 있는 플레이, 일시 중지, 프레임 건너뛰기 버튼으로 에디터에서 직접 게임을 테스트할 수 있습니다.


씬 뷰 우측 상단에 있는 씬 기즈모는 뷰의 방향을 나타냅니다. 축을 클릭하면 뷰가 해당 축에 정렬되고, 중앙의 육면체를 클릭하면 직교 뷰와 원근 뷰가 교대로 바뀝니다.



게임 뷰(에디터에서 플레이)


기본적으로 씬 뷰 뒤에 탭으로 표시되는 Unity의 게임(Game) 뷰에서는 Unreal의 '에디터에서 플레이(Play in Editor)' 기능을 제공합니다.


Unreal의 에디터에서 게임을 실행하면 활성화된 뷰포트에서 플레이됩니다. Unreal이 플레이어 폰(Pawn)에 빙의(Possess)하면 뷰포트가 게임 뷰와 같은 역할을 합니다. 빙의를 해제하면 게임이 실행되는 동안 레벨을 편집할 수 있습니다.


Unity에서는 이러한 두 모드가 씬 뷰와 게임 뷰로 분리되어 있습니다. 게임 뷰는 게임 빌드처럼 커서를 캡처하고 입력에 반응합니다. 씬 뷰로 전환하면 런타임 시 업데이트가 가능하며, 빠른 반복 작업을 위해 씬 뷰와 게임 뷰를 나란히 배치하는 편이 일반적입니다.




계층 창(월드 아웃라이너)


Unreal에서는 활성화된 서브레벨의 모든 액터(Actor)가 월드 아웃라이너(World Outliner)에 나열됩니다. 액터의 가시성 정리와 필터링, 설정 등에 활용하는 기능입니다.


Unity의 월드 아웃라이너라고 할 수 있는 계층(Hierarchy) 창에는 동일한 검색 및 가시성 기능이 있으며, 활성화된 씬을 관리하거나 새로운 게임 오브젝트를 추가하는 기능도 지원됩니다.



프로젝트 창(콘텐츠 브라우저)


Unity의 프로젝트(Project) 창에는 프로젝트에서 사용 가능한 모든 에셋이 표시되며, Unreal의 콘텐츠 브라우저(Content Browser)와 같은 기능을 합니다. 검색 기능이 지원되며, 에셋을 더 쉽게 찾을 수 있도록 검색 내용을 필터링하거나 저장할 수 있습니다. 또한, 프로젝트에서 사용되는 모든 외부 패키지 에셋은 Project Assets 아래 별도 폴더에 표시됩니다.



인스펙터(디테일)


인스펙터(Inspector) 창은 Unreal의 Details(디테일) 패널과 동일한 기능을 제공합니다. 게임 오브젝트나 프리팹을 클릭하면 컴포넌트 프로퍼티를 보고 편집할 수 있습니다.


새 창을 열어 에셋 설정을 편집하는 Unreal과 달리, Unity에서는 프로젝트 창에서 에셋을 선택하면 인스펙터에 에셋과 관련된 정보와 설정이 표시됩니다.



콘솔(메시지 뷰/출력 로그)


콘솔(Console) 창은 프로젝트 창 뒤에 탭으로 표시되며, 게임과 에디터의 디버그를 출력합니다. C#의 'Debug' 클래스를 사용하면 다음 함수로 다양한 메시지를 출력할 수 있습니다.


  • Log()

  • LogWarning()

  • LogError()


콘솔의 상단 메뉴 바에서는 이러한 메시지를 지우거나 필터링하고 '오류 발생 시 일시 정지' 기능을 활성화할 수 있습니다. debug 함수에서는 게임 오브젝트를 메시지에 연결할 수 있는 Context 인수도 사용할 수 있습니다. Context 인수가 포함된 메시지를 더블 클릭하면 씬 뷰와 계층 창에서 해당 게임 오브젝트에 초점이 맞춰집니다.


Debug.Log("Just a Log!");


Debug.LogWarning("Uh oh, a Warning!");


Debug.LogError("Oh no! An Error!");


Modes 패널은 어디에 있나요?


Unity에는 Unreal의 모드(Modes)와 같은 탭은 없으며, 오브젝트 배치는 대부분 프로젝트 창에서 바로 이뤄집니다. 폴리지 페인팅이나 랜드스케이프 조형 같은 특별한 상호 작용은 보통 별도의 툴 창에서 실행되거나, 씬에서 관련 오브젝트가 선택되면 그에 따라 실행됩니다.


추가 참고 사항


  • 툴바에서 Edit > Project Settings...를 선택하면 Project Settings에 액세스할 수 있습니다. 여기에서 입력, 물리, 충돌 레이어, 에디터 동작 등의 항목을 편집할 수 있습니다.


  • Editor PreferencesEdit > Preferences를 선택하여 설정할 수 있습니다. 여기에서 외부 툴, 단축키, 색상을 변경할 수 있습니다.


  • Window 메뉴 옵션에서는 Unity 프로젝트에서 사용 가능한 모든 툴 창을 찾을 수 있습니다. 여기에는 기본 엔진 창(씬, 인스펙터, 계층)과 플러그인 또는 프로젝트 코드로 추가된 모든 창이 포함됩니다. 닫힌 탭을 복구하려는 경우 여기에서 원하는 탭을 찾을 수 있습니다.

이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.

이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.


3. 프로젝트 및 에셋

Unity 프로젝트는 Unreal 프로젝트와 유사한 방식으로 설정되지만, 에셋을 관리하는 방식은 큰 차이가 있습니다.


에셋 저장 위치


Unity에서는 '콘텐츠'와 '소스'를 분리하는 대신, 소스 코드를 포함한 모든 에셋이 'Assets' 폴더에 저장됩니다.



예외적으로, Unity의 패키지 관리자에서 설치된 패키지를 저장할 때는 Unreal의 Plugins 폴더와 유사한 'Package' 폴더를 사용합니다.


에셋 저장 방식


Unreal에서 에셋은 UAssets로 저장되는데, 다양한 소스와 파일 유형의 에셋을 통일된 하나의 유형으로 임포트할 수 있는 Unreal 고유의 에셋입니다. UAssets는 에셋 자체에 필요한 데이터뿐 아니라 텍스처 필터링, 메시 충돌과 같은 엔진 관련 데이터를 모두 저장합니다. 즉, Unreal에서는 프로젝트 구조에 원본 에셋을 실제로 저장하지는 않습니다.


Unity에서는 소스 파일을 연결된 에셋에 대한 엔진 및 에디터별 데이터를 포함하는 개별 '.meta' 파일과 함께 프로젝트에 바로 저장합니다. 내부적으로 Unity는 임포트한 에셋을 게임에 바로 사용할 수 있는 최적화된 형식으로 처리하며, 엔진은 실제로 런타임 시 이 형식을 사용합니다. 이렇게 처리된 에셋은 Library 폴더에 저장됩니다. 이 폴더는 캐시 역할을 수행하며 소스 컨트롤에 추가할 필요가 없습니다.



지원되는 에셋 포맷


Unity는 다음과 같은 다양한 파일 포맷을 지원합니다.


이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.

이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.


씬(맵)


Unity의 은 Unreal의 맵(Map) 파일에 해당되며 특정 레벨에 대한 데이터를 포함합니다.


에디터에서 작업하면 보통은 일종의 .scene 파일을 편집하는 것입니다(프리팹 모드에서 개별 프리팹을 편집하는 경우는 예외. 프리팹 모드 사용 섹션 참조). Unreal처럼 동시에 여러 씬을 로드할 수 있습니다.

씬 파일은 기본적으로 컴퓨터에 Unity 에셋으로 등록되어 있어 편리합니다. 덕분에 컴퓨터의 파일 탐색기에서 씬 파일을 클릭해 곧바로 Unity 에디터를 열 수 있습니다.


4. 액터와 게임 오브젝트, 컴포넌트 비교

게임 오브젝트 및 액터


Unreal에서는 액터가 게임 월드에 존재하는 기본 엔티티입니다. 이는 Unity의 게임 오브젝트에 해당합니다. 액터와 게임 오브젝트는 모두 컴포넌트가 적용되고, 트랜스폼(Unity의 경우에는 Transform 컴포넌트)을 사용하여 월드에서 이동, 회전 및 스케일이 가능하다는 점에서 유사합니다.


하지만 Unity와 Unreal의 큰 차이점은 다음과 같습니다.


Unreal의 액터


Unreal에는 폰(Pawn)이나 캐릭터(Character)와 같이 특화된 액터가 있습니다. Unreal의 액터는 코드를 통해 확장과 특화를 거쳐 액터 자체에 특별한 기능을 추가할 수 있습니다.


Unity의 게임 오브젝트


반면 Unity의 게임 오브젝트는 봉인된 클래스이며 확장과 특화가 불가능합니다. 게임 오브젝트의 동작은 전적으로 자체 컴포넌트를 바탕으로 정의됩니다. 플레이어 캐릭터 폰 대신, 플레이어 캐릭터 컴포넌트가 포함된 게임 오브젝트를 사용합니다.


게임 오브젝트는 메뉴 바의 'GameObject' 메뉴를 이용하거나 계층 창 상단의 더하기 버튼(+)을 클릭하여 생성할 수 있습니다. 그러면 선택된 게임 오브젝트가 씬으로 인스턴스화됩니다. 인스턴스화된 게임 오브젝트를 다른 게임 오브젝트 주변으로 옮기거나 연결할 수 있습니다.



컴포넌트는 어떻게 다른가요?


Unity와 Unreal 모두 컴포넌트를 사용하지만, 게임 오브젝트의 작동 방식 때문에 조금 다르게 구현됩니다.


Unreal의 컴포넌트
Unreal에는 액터 컴포넌트와 씬 컴포넌트, 두 가지 유형의 컴포넌트가 있습니다. 액터 컴포넌트는 단순히 액터에 동작을 추가하며, 씬 컴포넌트에도 트랜스폼이 있고 월드에서 액터의 자식으로 존재합니다.

스태틱 메시(Static Mesh) 컴포넌트는 일반적인 씬 컴포넌트로, 하나의 액터에 여러 스태틱 메시 컴포넌트가 연결되어 월드에 더 복잡한 셰이프를 만듭니다.


Unity의 컴포넌트


Unity 컴포넌트는 액터 컴포넌트처럼 작동합니다. 월드에 물리적으로 존재하지 않는다는 뜻입니다. 일반적으로 Unity에서 트랜스폼을 가지는 유일한 엔티티는 게임 오브젝트입니다. 계층 창에서 한 게임 오브젝트를 다른 게임 오브젝트로 드래그하여 계층 구조를 만들면 씬 컴포넌트와 같은 기능을 사용할 수 있습니다.



예: 양쪽 엔진에서 집 만들기


두 엔진에서 집을 만드는 상황을 생각하면 이 차이를 확실하게 알 수 있습니다.


  • Unreal이라면 바닥, 벽, 지붕 등의 정적 메시 컴포넌트가 포함된 '집' 액터를 만들 것입니다.

  • Unity에서는 '집'이라는 부모 게임 오브젝트를 만들 것입니다. 이때 바닥, 벽, 지붕에 대한 별도의 자식 게임 오브젝트를 추가하며, 게임 오브젝트마다 고유의 Mesh Renderer 컴포넌트를 적용합니다.

Unity에서 컴포넌트 추가


컴포넌트를 게임 오브젝트에 추가하려면 메뉴 바의 Component 메뉴를 이용하거나 인스펙터에서 Add Component 버튼을 선택합니다.

Add Component 버튼을 클릭하면 추가할 컴포넌트 검색에 사용할 검색 위젯이 표시됩니다. 여기에서 New Script 버튼을 선택하면 새 컴포넌트 스크립트를 즉시 생성하여 게임 오브젝트에 추가할 수도 있습니다.



런타임 시 컴포넌트를 추가할 수도 있습니다. AddComponent<T>() 함수를 사용하면 되는데, 여기서 'T'는 추가할 컴포넌트 유형입니다.


5. 블루프린트와 프리팹

소개


Unreal의 블루프린트(Blueprint) 기능은 프로젝트에 고유한 컴포넌트와 프로퍼티가 적용된 액터 인스턴스를 생성하는 데 사용됩니다. 생성한 블루프린트는 에셋으로 저장되어 마음대로 배치하고 생성할 수 있습니다.


Unity의 프리팹


Unity에서는 프리팹이 이와 유사한 기능을 합니다. 프리팹은 에셋으로 저장되는 게임 오브젝트의 계층 구조입니다. 프리팹은 프로젝트 창에서 씬 뷰로 직접 드래그 앤 드롭하거나 스크립트에서 레퍼런스를 통해 생성할 수 있습니다.

프리팹 에셋이 업데이트되면 모든 씬에 배치된 프리팹의 인스턴스 또한 모두 업데이트됩니다. 그러나 씬에서 프리팹 인스턴스의 프로퍼티가 변경되는 경우, 해당 인스턴스는 수정된 프로퍼티를 유지합니다.




프리팹 모드를 사용하여 프리팹 편집


블루프린트에 편집용 에셋 창이 따로 있는 것처럼, Unity도 프리팹 모드에서 씬 외부의 프리팹 에셋을 볼 수 있습니다. 덕분에 로컬 조정을 수행하고 자식 게임 오브젝트를 추가할 수 있습니다. 프로젝트 창에서 프리팹을 더블 클릭하거나, 계층 구조에서 프리팹 인스턴스 옆의 오른쪽 화살표를 클릭하여 프리팹 모드에 액세스할 수 있습니다.



노드에는 어떤 차이가 있나요?


비주얼 스크립팅 시스템이 내장된 블루프린트와 달리, 프리팹에는 스크립팅 기능이 전혀 없습니다.

프리팹의 모든 동작은 포함된 게임 오브젝트의 컴포넌트에서 유래됩니다. 커스텀 동작은 C# 스크립트를 작성하여 생성됩니다.


네스티드 프리팹(자식 액터)


Unreal 블루프린트의 자식 액터(Child Actor) 컴포넌트는 한 액터를 다른 액터의 컴포넌트로 사용할 수 있는 유용한 컴포넌트입니다. 따라서 두 개의 블루프린트가 별도로 존재하지만, 본질적으로는 연결된 상황이 만들어집니다(예: 검 프랍을 들고 있는 플레이어 캐릭터).


원본에 대한 링크를 유지하면서 하나의 프리팹을 다른 프리팹에 배치할 수 있는 Unity의 네스티드 프리팹(Nested Prefab) 기능과 비슷합니다. 따라서 자식 프리팹을 업데이트하면 중첩된 다른 모든 프리팹에서도 자동으로 업데이트됩니다.


6. Unity의 스크립팅

Unreal 스크립팅과의 유사성


로우 레벨 동작에 C++를 사용하고 스크립팅에 블루프린트를 사용하는 Unreal과 달리, 모든 Unity 스크립팅은 C#으로 수행됩니다. 하지만 Unreal과 마찬가지로, Unity 스크립팅은 주로 프레임 업데이트 및 오버랩과 같은 게임 이벤트를 주로 처리합니다.

예시는 다음과 같습니다.


이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.

이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.


Unity의 이벤트 실행 방법 및 시점에 대한 자세한 내용은 Unity 매뉴얼의 이벤트 함수 실행 순서를 참조하세요.


Monobehaviour를 사용하는 스크립팅 컴포넌트


앞서 설명한 바와 같이, 게임 오브젝트는 봉인된 클래스이므로 액터에서 지원하는 커스텀 동작을 지원하지 않습니다. 대신 모든 동작이 게임 오브젝트의 컴포넌트를 바탕으로 이뤄집니다. Unity의 MonoBehaviour 클래스를 확장하여 컴포넌트 클래스를 생성할 수 있습니다. MonoBehaviour는 모든 컴포넌트 스크립트의 기본 클래스이며, 이를 통해 코드를 게임 오브젝트에 연결할 수 있습니다.


예제: Unity용 컴포넌트 스크립트 검토


수신한 이벤트를 기반으로 다양한 메시지를 기록하는 컴포넌트의 스크립트를 살펴보겠습니다.


[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

이 스크립트는 Monobehaviour를 확장하는 매우 일반적인 C# 클래스로 설정되지만, 몇 가지 주목할 만한 사항이 있습니다.


직렬화된 필드


스크립트를 살펴보면 클래스 바디 상단에서 컴포넌트가 시작될 때와 충돌할 때 기록할 문자열 변수 2개를 정의하고 있습니다. 그러나 두 문자열 변수는 코드 내 어디서도 정의되지 않습니다. 이는 해당 변수가 직렬화되어 있으며, 에디터에서 인스펙터로 설정할 프로퍼티로 사용할 수 있기 때문입니다.



이는 Unreal에서 UProperties를 사용하는 것과 매우 유사합니다. Unity에서는 변수 선언 위에 [Serialize Field] 속성을 추가하여 인스펙터에서 변수를 표시할 수 있습니다. 기본적으로 public 변수는 직렬화되고 private 변수는 직렬화되지 않으므로 public 변수에는 속성을 사용할 필요가 없습니다.

hitLimit 변수에서 볼 수 있듯이, 직렬화된 변수도 여전히 초기화가 가능합니다. 이는 인스펙터에 변수가 표시될 때 기본값 역할을 합니다.


이벤트 메서드


해당 선언 아래에는 Unity가 특정 이벤트에 대한 응답으로 호출하게 될 함수가 있습니다.


  • Start() 함수는 컴포넌트의 게임 오브젝트가 씬에 활성화되면 곧바로 호출됩니다.

  • OnCollisionEnter() 함수는 게임 오브젝트의 콜라이더가 Rigidbody 컴포넌트가 연결된 무언가에 충돌할 때마다 호출됩니다.

  • Update() 함수는 프레임마다 호출됩니다.

참고: Update() 함수가 필요 없으면 스크립트에서 제거하는 게 좋습니다. 그러면 Unreal에서 CanActorEverTick을 false로 설정하는 것처럼 프레임마다 불필요한 호출을 방지할 수 있습니다.


UObject에 해당하는 것은 어디 있나요?


Unreal의 기본 오브젝트 클래스는 UObject 클래스로, 이를 확장해 일반 액터/컴포넌트 패턴 외부에 오브젝트를 생성할 수 있습니다. 이러한 오브젝트는 월드에 생성되지 않지만 다른 오브젝트/액터가 계속 참조할 수 있으며, 레벨을 변경하지 않고 데이터를 포함할 때 유용합니다.


Unity의 오브젝트 클래스


Unity의 기본 오브젝트 클래스는 UnityEngine.Object 클래스입니다. C# Object 클래스인 System.Object와 혼동하지 않도록 주의하세요. 이 클래스에서는 게임 오브젝트 및 Monobehaviour용 기본 기능을 다양하게 제공하지만, UObject와 같은 방식으로 확장되지는 않습니다. 보통 바로 확장할 수는 없는 클래스입니다.


ScriptableObjects 사용


데이터 오브젝트를 씬에서 생성하지 않고 만드는 기능은 Unity의 ScriptableObjects에서 지원합니다. UObject와 마찬가지로 데이터를 저장하고 게임 오브젝트 전반의 종속성을 줄입니다.


하지만 ScriptableObjects를 Unity 내에서 에셋으로 인스턴스화할 수도 있습니다. Unreal의 데이터 에셋(Data Asset)과 유사하며, 게임 오브젝트에서 정적 데이터를 완전히 분리할 수 있는 강력한 기능입니다.


예제: 게임 내 물약 상점


게임 내에 물약을 판매하는 상점을 만든다고 가정해 보겠습니다. 각 물약은 물약의 형상 및 사용 시 물약의 동작을 제어하는 ​​스크립트를 저장하는 프리팹입니다. 플레이어가 상점에 접근하면 판매하는 30가지 물약의 이름과 가격, 설명이 표시된 메뉴를 볼 수 있습니다. 이 UI 데이터를 프리팹에 저장하면 Unity는 UI에서 필요한 이름과 가격 정보를 얻기 위해 30개의 물약 프리팹을 모두 메모리에 로드해야 할 것입니다. 하지만 이렇게 하면 UI에는 전혀 필요하지 않은 물약의 모든 비주얼 및 스크립트 데이터를 로드해야 합니다.


이렇게 불필요한 데이터를 전부 로드하지 않기 위해 이름, 가격, 설명 및 물약의 시각적 효과와 동작이 포함된 프리팹에 대한 레퍼런스를 포함하는 ScriptableObject를 사용하여 게임플레이 데이터와 UI 데이터를 분리할 수 ​​있습니다. 그러면 간단한 설명 데이터를 UI 전체에서 빠르게 로드하고 공유할 수 있으며, 더 복잡한 프리팹은 플레이어가 실제로 게임에서 해당 프리팹을 사용할 때만 로드됩니다.


일반 스크립팅 사용 사례


Unreal과 Unity에서 공통적으로 나타나는 활용 사례와 패턴은 다음과 같습니다.


오브젝트 인스턴스 생성


Unreal에서는 CreateActor 블루프린트 노드나 UWorld::SpawnActor() C++ 함수를 통해 오브젝트 인스턴스를 생성합니다. 양쪽 모두 이름이나 포지션 같은 클래스 레퍼런스와 초기화 데이터를 전달합니다.


Unity에서는 프리팹 레퍼런스 및 시작 위치/방향을 가져오는 Instantiate() 함수를 통해 게임 오브젝트가 인스턴스화됩니다. 빈 게임 오브젝트만 필요하다면 'new GameObject()'를 사용하여 새 게임 오브젝트 인스턴스를 간단히 인스턴스화할 수도 있습니다.


유형 간 캐스팅


Unreal에서 타입캐스팅은 대부분 생성된 Blueprint 캐스팅 노드 또는 C++의 Cast<Type>()함수를 통해 수행됩니다.


Unity에서는 "as" 키워드로 캐스트하거나 c 스타일 캐스팅을 사용합니다. 두 경우 모두 캐스트가 실패할 경우 결과는 null입니다.


[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

오브젝트 파괴 및 비활성화


두 엔진 모두 가비지 컬렉션이 있으므로 사용하지 않는 레퍼런스를 정리할 수 있습니다.


Unreal에는 여러 오브젝트 유형에 오브젝트 삭제를 표시하는 명시적인 Destroy 함수가 있습니다.


Unity의 기본 UnityEngine.Object 클래스에는 오브젝트 레퍼런스를 전달하면 오브젝트를 파괴하는 정적 Destroy 함수가 있습니다. 이 함수는 게임 오브젝트와 컴포넌트를 비롯해 기본 UnityEngine.Object 클래스에서 상속된 모든 오브젝트에 사용할 수 있습니다. SetActive(false)로도 게임 오브젝트를 비활성화할 수 있습니다.

컴포넌트도 개별적으로 비활성화할 수 있으며, 코드 실행은 계속 가능하지만 Update 및 OnCollisionEnter와 같은 Unity 이벤트 메서드가 호출되지 않도록 방지합니다.


컴포넌트 액세스


Unreal에서 액터에 연결된 컴포넌트를 찾으려면 블루프린트에서 GetComponentByClass 노드를 사용하거나 C++에서 FindComponentByClass 함수를 사용하면 됩니다. 두 방법 모두 클래스 유형을 바탕으로 일치하는 컴포넌트를 찾습니다. 하지만 C++와 블루프린트 모두 이름으로 컴포넌트를 정의할 수 있으므로, 액터의 유형을 알고 있다면 이름으로 간단하게 컴포넌트에 액세스할 수 있습니다.


Unity에서는 게임 오브젝트에서 찾은 유형의 첫 번째 컴포넌트를 반환하는 제네릭 함수 GetComponent<T>()를 사용하여 이를 수행할 수 있습니다. Unreal과는 달리 이름에 따라 자동으로 게임 오브젝트의 컴포넌트에 액세스할 수 없습니다. 이 문제를 해결하기 위해 주로 Start 메서드에서 GetComponent를 한 번만 호출하고 그 결과를 변수에 저장할 수 있습니다. GetComponent를 자주 호출하면 게임 오브젝트의 모든 컴포넌트에서 반복하여 성능에 영향을 미칠 수 있으므로, 가능하다면 레퍼런스를 저장해야 코드를 쉽게 최적화할 수 있습니다.


태그 활용


Unreal에는 오브젝트 간의 태그를 비교하여 빠르게 식별하는 데 사용할 수 있는 GameplayTag 시스템이 있습니다.



Unity에는 자체적인 게임 오브젝트용 태그 시스템이 있습니다. 인스펙터의 드롭다운 태그 메뉴로 새 태그를 선택하거나 생성할 수 있습니다. 이후 GameObject.tag 또는 GameObject.CompareTag()를 통해 이 데이터에 액세스할 수 있습니다.


프로젝트 설정에서 태그를 편집하려면 Edit > Project Settings... > Tags and Layers 메뉴를 이용하면 됩니다.


게임 오브젝트 및 컴포넌트 검색


Unreal에서는 월드에서 GetAllActorsOfClass로 액터 유형을 검색하고, 검색 결과를 필터링할 수 있습니다.


Unity에서는 GameObject.Find(문자열 이름)를 사용하여 이름으로 게임 오브젝트를 찾을 수 있습니다. GameObject.FindWithTag(문자열 태그)를 사용하여 태그로 검색할 수도 있습니다.


컴포넌트 유형별로 오브젝트를 찾으려면 제네릭 함수 FindObjectsOfType<T>()을 사용할 수 있으며, 여기서 T는 찾으려는 컴포넌트 클래스입니다. 이 함수는 검색 결과가 포함된 배열을 반환합니다.


두 엔진 모두 월드에서 오브젝트를 찾기 위한 호출은 리소스 소모가 클 수 있으므로, 프레임마다 호출되는 코드에서 사용해서는 안 됩니다.


레이캐스팅(트레이싱)


Unreal에서 레이캐스트와 셰이프캐스트는 Trace 함수로 처리됩니다. 셰이프와 레이트레이싱 양쪽 모두에 채널 기반 또는 오브젝트 유형 기반 트레이싱이 지원됩니다. 캐스트는 충돌에 대한 모든 관련 정보와 함께 Hit Result 구조체를 출력합니다.


Unity에서 활용할 수 있는 몇 가지 레이캐스팅용 함수는 다음과 같습니다.


이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.

이 표는 튜토리얼 상단의 Materials 섹션에서도 다운로드할 수 있습니다.


또한, RaycastAll() 또는 SpherecastAll() 함수를 사용하여 첫 충돌 외에도 모든 충돌을 반환할 수 있습니다. 성능이 중요한 경우에는 가비지를 할당하지 않는 버전의 함수를 사용할 수도 있습니다(예: Physics.OverlapSphereNonAlloc).


입력 및 입력 관리


Unreal에서는 입력 액션/축(Input Actions/Axis) 설정으로 액션을 생성할 수 있습니다. 이러한 설정을 통해 점프, 가속 등의 플레이어 액션에 대한 바인딩을 다양하게 정의할 수 있습니다. 이후 해당 입력 액션을 함수에 바인드하여 코드가 입력에 반응하도록 구현할 수 있습니다.


Unity는 Input.GetAxis() 함수를 사용하여, 정의된 에서 코드를 읽을 수 있는 유사한 시스템을 사용합니다. 이러한 설정은 Edit > Project Settings... > Input Manager > Axes에서 찾을 수 있습니다.



Input.GetAxis("Horizontal")는 기본적으로 A/S 키와 컨트롤러의 왼쪽/오른쪽 아날로그 축에 바인딩됩니다.


데드존, 민감도, 반전 같은 옵션을 축별로 설정할 수 있습니다. 축이라고 부르기는 하지만, Input.GetButtonDown() 함수를 사용하면 디지털 입력도 지원합니다. Input.GetKeyDown() 함수를 사용하여 명시적 키를 쿼리할 수도 있습니다.


비동기 코드(지연/타임라인)


Unreal에서는 딜레이 및 타임라인 노드를 사용하여 간편하게 이벤트 타이밍을 제어하고 시간에 따라 프로퍼티를 수정할 수 있습니다.


Unity에서는 이러한 지연 실행을 코루틴(Coroutine)으로 처리할 수 ​​있습니다. 코루틴은 일반적인 코드 실행과는 독립적으로 실행되는 특수 함수로, "yield" 명령을 사용하여 원하는 대로 지연하거나 중지할 수 있습니다. 모든 코루틴 함수는 IEnumerator를 반환해야 하며, 이를 통해 yield를 사용하여 중지 또는 지연을 반환할 수 있습니다.


아래 예시에서는 5초 지연 후 로그를 출력합니다.


[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

이벤트 시스템


Unreal에서는 블루프린트의 이벤트 디스패처(Event Dispatcher) 시스템 또는 C++ 델리게이트(Delegates)를 활용하여 클래스에 대한 커스텀 이벤트를 생성하고 바인드할 수 있습니다.


Unity에서는 몇 가지 방법으로 이벤트를 생성하고 바인드할 수 있습니다. 가장 최근의 예시로는, UnityEvents 시스템으로 인스펙터 창에서 이벤트에 핸들러를 바인드할 수 있습니다.


코드에서 직렬화된 이벤트를 정의하면 "직렬화된 필드" 섹션에서 설명한 것과 같이 인스펙터에 노출된 필드가 표시됩니다. 이벤트에 반응할 게임 오브젝트를 인스펙터의 필드로 드래그 앤 드롭할 수 있습니다.


Unity는 보다 가벼운 이벤트 시스템을 원하는 사용자를 위해 일반 C# 이벤트와 함께 델리게이트도 지원합니다.



7. 기타 엔진 프로퍼티

물리 및 충돌


Unreal에는 기본 컴포넌트에 시뮬레이션과 충돌 프로퍼티가 직접 내장되어 있으며, 이를 통해 컴포넌트가 상호 작용하는 채널과 물리 머티리얼 및 질량과 같은 데이터를 관리합니다. 컴포넌트에서 사용하는 시각적 메시가 충돌 경계를 정의합니다.


Unity의 빌트인 물리 엔진은 리지드바디 컴포넌트와 콜라이더 컴포넌트로 물리 시뮬레이션을 제어합니다. 게임 오브젝트 셰이프에 따라 특화된 콜라이더는 다음과 같습니다.


  • 박스

  • 스피어

  • 캡슐

  • 메시

리지드바디는 게임 오브젝트 시뮬레이션의 동역학 관계를 담당하고, 콜라이더는 셰이프 프로퍼티를 제공합니다. 상호 작용하는 물리적 레이어가 프로젝트 수준에서 정의됩니다.



기본 애니메이션


Unreal에서는 애니메이션 시퀀스/몽타주(Animation Sequence/Montage)를 사용하여 스켈레탈(Skeletal) 애니메이션을 생성하며, 주로 애니메이션 블루프린트 및 스테이트 머신(State Machine)으로 이 애니메이션을 제어합니다.


Unity의 메카님 애니메이션 시스템이 이와 유사하게 작동합니다. 이를 사용하면 스크립트로 제어할 수 있는 상태 머신을 사용하여 다양한 애니메이션 클립을 임포트하고 재생을 제어할 수 있습니다.



멀티 오브젝트 애니메이션 및 시네마틱



Unreal에서 시네마틱과 멀티 오브젝트 애니메이션을 제어하는 주요 툴은 레벨 시퀀서(Level Sequencer)입니다.


Unity에서는 타임라인(Timeline) 툴이 이러한 역할을 담당합니다. 레벨 시퀀서 에셋과 마찬가지로, 타임라인 에셋은 프로퍼티 애니메이션 컬렉션입니다. 타임라인은 다양한 시스템과 연동되며, 몇 가지 예를 들면 다음과 같습니다.


  • 애니메이션

  • 파티클 효과

  • 사운드

  • 카메라

  • 트랜스폼

  • 머티리얼

UI(사용자 인터페이스)


Unreal에서 UI는 대부분 언리얼 모션 그래픽 UI 디자이너(UMG, Unreal Motion Graphics UI Designer)로 제어됩니다. UMG는 자체 UI 시스템으로, UMG를 통해 계층 구조에서 UI 오브젝트를 생성할 수 있으며, 오브젝트마다 데이터와 이벤트를 자체적으로 처리하게 만들 수 있습니다. UMG는 단일 에셋에서 UI 배치와 스크립팅을 지원하는 위젯(Widget)이라는 특별한 블루프린트를 사용합니다.



Unity에도 Unity UI(Unity User Interface)라는 자체 UI 시스템이 있으며 캔버스(Canvas) 컴포넌트를 기반으로 작동합니다. UMG와 달리 이 시스템에는 별도의 에셋이 필요하지 않습니다. UI별 컴포넌트와 게임 오브젝트를 사용하여 렌더링과 상호 작용, 레이아웃을 제어할 수 있습니다. 모든 UI 게임 오브젝트는 계층 구조에서 캔버스 컴포넌트가 추가된 다른 게임 오브젝트 아래에 배치되어 UI 렌더링 및 상호 작용 방식을 관리합니다.


이 UI에 동작을 추가하려면 C# 스크립팅을 사용하거나, 버튼과 같은 컴포넌트의 경우 UnityEvents를 인스펙터 창에 드래그 앤 드롭하면 됩니다.


8. FAQ

저는 원래 프로그래머가 아닙니다. Unity에 Unreal의 블루프린트 비주얼 스크립팅(Blueprint Visual Scripting)에 해당하는 기능이 있나요?


현재 Unity에 블루프린트 같은 빌트인 비주얼 프로그래밍은 없습니다. 하지만 블루프린트 사용법을 알고 있다면, Unity의 C# 스크립팅이 보기보다 어렵지는 않을 것입니다. Unity에서의 기본 스크립팅에 대해 알아볼 수 있는 다양한 튜토리얼예제 프로젝트가 마련되어 있습니다.


그래도 비주얼 스크립팅이 꼭 필요한 분들을 위해, Unity의 방대한 플러그인 생태계에는 Bolt와 같이 유용한 동시에 뛰어난 지원도 제공되는 비주얼 스크립팅 시스템이 몇 가지 있습니다. 이런 시스템을 사용하면 블루프린트 같은 워크플로를 재현할 수 있습니다.


9. 자세히 알아보기

이 튜토리얼이 Unreal과 Unity라는 두 엔진의 핵심적인 차이를 이해하는 데 도움이 되었기를 바랍니다.

Unity를 더 자세히 배워 보며 이해하는 데 도움이 되는 리소스를 살펴보세요.


  • Unity 사용자 매뉴얼 — Unity에 관한 모든 내용을 기초부터 설명합니다. 엔진과 에디터의 모든 기능을 확인할 수 있습니다.


  • Unity Learn — 완벽한 가이드가 제공되는 과정부터 간단한 튜토리얼까지 모두 살펴볼 수 있는 Unity 공식 학습 콘텐츠입니다.

  • Unity YouTube 채널 — 다양한 동영상 튜토리얼과 함께 Unity 기능을 선보이는 최신 동영상 콘텐츠입니다.

Complete this tutorial