이번에 공모전 개발을 진행하면서 유니티를 하게 되었다.
유니티는 안해봐서 사전 공부가 필요해 보인다.
따라서 유니티를 알아보고자 한다.
유니티로 프로젝트를 하기전에 블랙박스 문제를 해결해 보고자 한다.
항상 새로운 내용을 공부할 때 꼭 하는 습관이 있다.
나무위키를 읽는 것 나무위키-유니티

유니티는 게임을 포함한 다양한 3D 및 2D 인터랙티브 콘텐츠를 제작할 수 있는 통합 개발 환경(Integrated Development Environment, IDE)이자 게임 엔진
흠.. IDE...? 통합 개발 환경...? IDE = IntelliJ 같은거..?
조금 깊게 고민해봐야겠다.
IDE(Integrated Development Environment)는 이름 그대로 개발에 필요한 여러 도구를 하나의 환경으로 '통합'해 놓은 소프트웨어

대표적으로는 IntelliJ, Android Studio 가 있다.
일반적인 IDE 특징은 아래를 포함한다.
우리가 웹 개발을 할 때 생각해보자.
에디터는 VS code를 사용하고, 프레임워크는 Nest.js, 포함이 되어있지만 런타임은 Node.js
이렇게 필요한 환경과 언어등을 조합해서 사용한다
하지만 IDE는 모든게 묶여 있는 소프트웨어라고 볼 수 있다.
다만 유니티는 다른 IDE와 차이점이 있다.
우리가 Java로 개발을 할 때 꼭 IntelliJ를 안쓰고 Vs code를 쓰거나 다른 IDE를 사용해 개발을 할 수 있다. 즉 IDE는 편리한 환경을 제공하는 것이지 강제되는 것은 아니다.
하지만 유니티는 무조건 유니티 IDE에서 진행 해야한다.
유니티는 하나의 시스템? 플랫폼?으로 볼 수 있을 것 같다.
개발 환경, 시스템, 런타임이 IDE에 묶여 시스템을 구성한다
유니티는 프레임워크나 런타임만 따로 제공하는 것이 아니라 IDE에 전부 통합하여 제공한다라는 느낌으로 이해했다.
따라서 어쩔 수 없이 유니티 IDE는 강제된다. (C# 코드 부분 빼고)
IntelliJ와 같은 IDE는 '코드 중심(Code-centric)'으로 설계되었음!!
프로젝트의 핵심은 .java 같은 소스 코드 파일들이고, IDE는 이 코드들을 효율적으로 작성하고 관리, 빌드하는 데 집중한다!!!
소스 코드만 있다면 다른 IDE로 옮겨도 프로젝트를 이어나갈 수 있다!!
반면
유니티 에디터는 '콘텐츠 중심(Content-centric)'으로 설계되었음!!
유니티 프로젝트의 핵심은 C# 코드뿐만 아니라, 씬(.unity), 프리팹(.prefab), 머티리얼(.mat), 애니메이션(.anim) 등 수많은 에셋들과 시각적, 공간적 관계 그 자체라고 볼 수 있다!!
우선 사용하는 기술을 보면
아래의 기술을 사용한다고 나무위키에 나와있다.
이 부분을 자세하게 이해보자.
전체구조는 다음과 같이 계층 구조를 이루고 있다.

만약 우리가 "회전한다"라는 코드를 작성했다고 하자.
Update() 함수 안에서 transform.Rotate(0, 1, 0); 코드가 실행되고. "이 오브젝트를 Y축으로 1도 회전시켜줘" 라는 '지시'가 수행된다.아하!
너무 복잡하다!!
하지만!! 추상화를 통해 아주 편하게 사용할 수 있도록 유니티를 만들었기 때문에 우리는 맨 위 스크립트 계층만 보면 된다!!!
아래 계층의 작업은 알아서 수행된다!!!
실제로는
C# 코드 → (컴파일) → CIL (중간 언어)
게임 실행 → Mono VM (JIT 컴파일러)가 CIL
(빌드 시) IL2CPP가 CIL을 C++ 코드로 변환
요런 복잡한 과정을 거쳐서 실행 된다고 한다!!!
복잡한 원리는 알아서 잘 된다고 생각하고.
우리가 개발을 진행하는 스크립트 계층을 이해하기 위해서 유니티의 핵심 구성 요소를 알아 보았다.
1. 게임 오브젝트 (Game Object)
씬(Scene) 안에 존재하는 모든 '물체'. 화면에 보이는 캐릭터, 배경, 아이템, 눈에 보이지 않는 카메라, 조명, 게임 관리자 등도 모두 게임 오브젝트이다. 씬을 구성하는 가장 기본 단위라고 할 수 있다.
2. 컴포넌트 (Component)
게임 오브젝트에 붙여서 특정 기능이나 속성을 부여하는 '부품'이다. 게임 오브젝트 자체는 빈 껍데기일 뿐, 컴포넌트를 붙여야 비로소 의미를 갖게 된다.
Transform: 모든 게임 오브젝트가 반드시 갖는 기본 컴포넌트로, 위치(Position), 회전(Rotation), 크기(Scale) 정보를 담는다.
Rigidbody: 물리 법칙(중력, 힘, 충돌)을 적용받게 한다.
Collider: 다른 물체와 충돌을 감지할 수 있는 물리적 형태를 부여한다.
Script: 개발자가 C#으로 작성한 코드로, '스페이스바를 누르면 점프'와 같은 고유한 행동을 정의한다.
약간 클래스와 메서드 관계 아닐까??
3. 씬 (Scene)
게임의 특정 장면이나 레벨을 담는 '작업 공간'
'메인 메뉴 씬', '1단계 씬' 등으로 나누어 관리한다 (페이지?)
4. 에셋 (Asset)
개발에 사용하는 모든 '재료'
3D 모델, 이미지, 사운드 파일, C# 스크립트 코드, 폰트 등이 모두 에셋에 해당.
5. 프리팹 (Prefab)
자주 사용되는 게임 오브젝트를 모든 컴포넌트 설정과 함께 저장해 둔 '템플릿'
복붙용인듯
기타 : Hierarchy
씬(Scene)에 있는 모든 게임 오브젝트의 목록과 구조를 보여주는 창
실제로 해보면서 공부해야할 듯!