게임에서 하늘을 표현하는 방식으로는 Skybox와 SkyDome이 있다. 먼저 Skybox는 카메라가 볼 수 있는 하늘의 여섯 방면의 이미지를  Cube 형태로 배치해 표현한다. 플레이어가 하늘 박스안에 들어가 있는 듯한 느낌이다. 반면 SkyDome은 돔 형태의 메시에 하늘의 이미지 텍스처를 입혀 구현한다.

 

스카이박스

Images>Material 폴더안에 우클릭 Create>material만든후 Skybox로 저장한다.

인스펙터의 Shader 콤보박스를 눌러 Skybox>6 Sided를 선택한다.

그럼 다음과 같이  6 Sided를 설정할수 있는 뷰가 뜨는데 오른쪽 네모에 아래 폴더에서 그림을 끌어다 놓는다.

스카이박스 적용

Window>Rendering>Lighting을 선택하면 라이팅뷰가 열린다. 상단에서 Environment탭을 선택하고 Skybox Material 속성에 지금 만든 Skybox 머티리얼을 끌어다 놓는다.

 

텍스트를 씬뷰의 하늘 영역에 직접 드래그드롭해도 된다.

멋진 씬뷰를 볼 수 있다.

 

프로시저럴 스카이박스

유니티를 처음 열었을때 적용된 하늘은 프로시저럴 스카이박스다. 기본값인 Default>Skybox는 여러가지 설정값을 수정할 수 없으므로 별도의 머터리얼을 만들어야 한다.

Image>Material 폴더에 새로운 머터리얼을 만들고 SkyboxPC로 저장한다. Shader 속성을 Skybox>Procedural로 수정한다.

그럼 여러가지 속성을 변경해보자

뷰밑에 프리뷰를 보면서 하면 쉽다.

Window>Render>Light>Environment탭에서 SkyboxPC를 적용후

하이라키에서 Directional Light를 선택한후 Y Rotation을 적당히하면 

Y Ratation을 돌려 태양이 보이게 한다.

게임뷰에 태양을 볼수 있다.

x Roation으로 태양을 아래로

 

큐브맵 스카이박스

큐브맵(Cubemap) 은 환경에 대한 반사를 나타내는 여섯 개의 사각형 텍스처 컬렉션입니다. 여섯 개의 사각형은 오브젝트를 둘러싸는 가상 큐브면을 형성합니다. 각각의 면은 월드 축의 방향을 따른 뷰를 나타냅니다 (위, 아래, 좌, 우, 앞, 뒤).

큐브맵은 오브젝트의 반사나 “주변 환경”을 캡처하는 데 사용됩니다. 예를 들어, skyboxes  environment reflections는 주로 큐브맵을 사용합니다.

 

큐브맵화된 스카이박스와 반사

텍스처에서 큐브맵(Cubemap)을 생성하는 방법

큐브맵을 생성하는 가장 빠른 방법은 특별히 레이아웃된 텍스처에서 임포트하는 것입니다. 프로젝트 창에서 Texture를 선택하고 인스펙터 창에서 Import Settings를 확인합니다. Import Settings에서 Texture Type  Default, Normal Map 또는 Single Channel 로 설정하고 Texture Shape  Cube 로 설정합니다. 그러면 텍스처가 자동으로 큐브맵으로 설정됩니다.

큐브맵 텍스처 임포트 타입

일반적으로 사용되는 큐브맵 레이아웃 몇 가지가 지원되고, 대부분의 경우 Unity에서 자동으로 인식됩니다.

수직 및 수평 교차 레이아웃과 큐브맵 면의 행과 열이 다음 그림과 같이 지원됩니다.

일반적으로 사용되는 다른 레이아웃으로는 LatLong(위도-경도로, 원통형이라고도 함)이 있습니다. 파노라마 이미지는 다음과 같이 이 레이아웃에 포함되는 경우가 많습니다.

SphereMap(구형 환경 맵) 이미지 역시 자주 사용됩니다.

기본적으로, Unity는 임포트된 텍스처의 종횡비를 고려하여 위의 레이아웃 중 가장 적합한 것을 선택합니다. 텍스처를 임포트하는 경우, 스카이박스와 반사에 사용될 수 있는 큐브맵이 생성됩니다.

Glossy Reflection 옵션은 반사 프로브에서 사용될 큐브맵 텍스처에 유용하게 사용할 수 있습니다. 이것은 평활도가 서로 다른 표면의 반사를 시뮬레이션하는 데 사용할 수 있는 특별한 방법(스페큘러 컨볼루션)으로 큐브맵 밉 레벨을 처리했습니다.

평활도가 다른 표면의 반사 프로브에 사용된 큐브맵

레거시 큐브맵 에셋

Unity는 서로 다른 여섯 개의 textures에서 큐브맵을 생성하는 기능도 지원합니다. 메뉴에서 Assets > Create > Legacy > Cubemap 을 선택해야 합니다. 그런 다음, 인스펙터에서 여섯 개의 텍스처를 각각 빈 슬롯에 드래그해야 합니다.

레거시 큐브맵 인스펙터

프로퍼티:기능:

Right..Back Slots 각각의 큐브맵 면에 해당하는 텍스처입니다.
Face Size 각각의 큐브맵 면의 픽셀 단위 너비 및 높이입니다. 텍스처는 이 크기에 맞게 자동으로 스케일됩니다.
Mipmap 밉맵이 생성되어야 하는지 여부입니다.
Linear 큐브맵이 리니어 색상을 사용해야 하는지 여부입니다.
Readable 큐브맵이 스크립트가 픽셀 데이터에 액세스할 수 있도록 할지 여부입니다.

위와 같이, 큐브맵을 생성하려면 큐브맵 텍스처 임포트 타입을 사용하는 것이 좋습니다(상단 참조). 이는 큐브맵 텍스처 데이터가 압축될 수 있게 하며, 에지 보정과 글로시 반사 컨볼루션을 가능하게 합니다. 또한, HDR 큐브맵도 지원됩니다.

기타 기법

다른 유용한 기법으로는, 큐브맵을 스크립트를 사용하여 Unity 씬의 콘텐츠에서 생성하는 방법이 있습니다.  Camera.RenderToCubemap 함수는 씬 내의 원하는 임의의 포지션에서 여섯 면의 이미지를 기록할 수 있습니다. 이 함수의 스크립트 레퍼런스 페이지에 있는 코드 예제를 사용하면 이 작업을 쉽게 수행할 수 있도록 하는 메뉴 커맨드를 추가할 수 있습니다.

 

파노라마 스카이박스

스카이박스를 생성하기 위해 파노라마 셰이더는 단일 텍스처를 씬 주위에 구체 모양으로 감쌉니다.

선행 조건 텍스처

파노라마 스카이박스를 생성하려면 다음과 같이 위도-경도(원통형) 매핑을 사용하는 단일 2D 텍스처가 있어야 합니다.

텍스처가 2D인지 확인하려면 다음 단계를 따르십시오.

  1. 프로젝트 창에서 텍스처를 선택합니다.
  2. 인스펙터에서 Texture Shape 2D로 설정되었는지 확인합니다.

최고의 주변광을 생성하려면 텍스처가 HDR(High Dynamic Range)을 사용해야 합니다.

프로퍼티

프로퍼티설명

Tint Color 스카이박스에 적용할 컬러입니다. Unity는 기본 텍스처 파일을 변경하지 않고 형상을 변경할 수 있도록 텍스처에 이 컬러를 추가합니다.
Exposure 스카이박스의 노출을 조정합니다. 이를 통해 스카이박스 텍스처에서 색조 값을 수정할 수 있습니다. 값이 클수록 노출이 증가하여 더 밝게 보이는 스카이박스를 생성하고, 값이 작을수록 노출이 감소하여 더 어둡게 보이는 스카이박스를 생성합니다.
Rotation 양의 y축을 중심으로 하는 스카이박스의 회전입니다. 이 설정은 스카이박스의 방향을 변경하며, 스카이박스의 특정 섹션을 씬의 특정 부분 뒤에 배치하려는 경우에 유용합니다.
Spherical (HDR) 이 머티리얼이 하늘을 표현하기 위해 씬 주위를 구체 모양으로 감싸는 텍스처입니다. 입력 텍스처에서 큐브맵 에셋을 생성하는 방법은 큐브맵 에셋을 참조하십시오.
Mapping 이 머티리얼이 스카이박스 생성 시 텍스처를 투사하기 위해 사용하는 방법을 지정합니다. 사용 가능한 옵션은 다음과 같습니다.6 sided: 텍스처를 스카이박스에 매핑하기 위해 그물망 형식을 사용합니다.Latitude Longitude Layout: 텍스처를 스카이박스에 매핑하기 위해 원통형 감싸기 방식을 사용합니다.
Image Type 이 머티리얼이 스카이박스를 투사하는 y축 주위의 각도를 지정합니다. 사용 가능한 옵션은 다음과 같습니다.180: 양의 z축 방향에 피크가 있는 반구 모양으로 Spherical 텍스처를 그립니다. 이 머티리얼이 텍스처를 그리는 씬의 면을 변경하려면 Rotation 프로퍼티를 수정하십시오. 기본적으로 스카이박스의 뒷면은 검은색이지만, 이 머티리얼은 대신 뒷면에 Spherical 텍스처의 복제본을 그릴 수 있습니다. 이렇게 하려면 Mirror on Back을 활성화하십시오.360: 전체 씬 주위를 감싸는 완전한 구체 모양으로 텍스처를 그립니다.
- Mirror on Back 머티리얼이 스카이박스 뒷면의 Spherical 텍스처를 검은색으로 그리지 않고 복제할지 여부를 지정합니다. 이 옵션은 Image Type 180으로 설정된 경우에만 나타납니다.
Render Queue Unity가 게임 오브젝트를 그리는 순서를 결정합니다. Render Queue에 대한 자세한 내용은 SL-SubShaderTags를 참조하십시오.
Double Sided Global Illumination 라이트매퍼가 전역 조명을 계산할 때 지오메트리의 양면을 고려할지 여부를 지정합니다. true이면 프로그레시브 라이트매퍼를 사용할 때 후면이 전면과 동일한 이미션과 알베도를 사용하여 광원을 반사합니다.

조명 소개

이 페이지에서는 Unity에서 조명이 작동하는 방식을 설명합니다.

Unity의 조명은 현실 세계에서 빛이 동작하는 방식을 근사화합니다. Unity는 광원의 동작에 대한 세밀한 모델을 사용하여 더욱 사실적인 결과를 구현하거나, 단순화된 모델을 사용하여 더욱 세련된 결과를 구현합니다.

직접 조명과 간접 조명

직접광은 방출되어 표면에 한 번 닿은 후 센서(예: 눈의 망막 또는 카메라)에 직접 반사되는 광원입니다. 간접광은 표면에 여러 번 닿는 광원, 스카이 라이트 등을 포함하여 궁극적으로 센서에 반사되는 다른 모든 광원입니다. 사실적인 조명 결과를 얻으려면 직접광과 간접광을 모두 시뮬레이션해야 합니다.

Unity는 직접 조명, 간접 조명 또는 둘 다를 계산할 수 있습니다. Unity가 사용하는 조명 기술은 프로젝트의 설정 방식에 따라 다릅니다.

실시간 조명과 베이크된 조명

실시간 조명은 Unity가 런타임 시점에 계산하는 조명입니다. 베이크된 조명은 Unity가 조명 계산을 미리 수행하고 결과를 조명 데이터로 저장한 후 런타임 시점에 적용되는 조명입니다. Unity에서 프로젝트는 실시간 조명, 베이크된 조명, 또는 이 두 가지의 조합(혼합 조명)을 사용할 수 있습니다.

실시간 조명, 베이크된 조명, 혼합 조명을 제공하기 위한 Light 컴포넌트의 설정 방법은 광원 모드를 참조하십시오.

전역 조명

전역 조명은 직접 조명과 간접 조명을 모두 모델링하여 사실적인 조명 결과를 제공하는 기술 그룹입니다. Unity에는 직접 조명과 간접 조명을 결합하는 두 가지 전역 조명 시스템이 있습니다.

베이크된 전역 조명 시스템은 라이트매핑, 라이트 프로브, 반사 프로브로 이루어져 있습니다. 모든 렌더 파이프라인은 베이크된 전역 조명 시스템을 지원합니다. 베이크된 전역 조명 시스템의 각 기능에 대한 렌더 파이프라인 지원은 해당 기능에 대한 문서에 나와 있습니다.

실시간 전역 조명 시스템은 인라이튼을 사용하는 실시간 전역 조명으로 이루어져 있으며 라이트 프로브에 기능을 추가합니다. 빌트인 렌더 파이프라인은 실시간 전역 조명을 지원합니다. 고해상도 렌더 파이프라인(HDRP)과 유니버설 렌더 파이프라인(URP)은 실시간 전역 조명 시스템을 지원하지 않습니다. 인라이튼은 지원이 중단되었으며, 실시간 전역 조명 시스템은 Unity에서 곧 제거될 예정입니다. 자세한 내용은 Unity 블로그를 참조하십시오.

 

씬을 새로만들면 Directional Light가 기본으로 생성되지만,  필요에 따라 Point, Spot, Area Light를 추가할수 있다.

GameObject>Light로 조명을 생성할수 있다.

Light가 추가하면 그만큼 렌더링 계산이 늘어나기때문에 부하가 늘어날 수밖에 없다. 따라서 시각적인효과와 게임수행속도 사이의 균형을 맞추는데 신경써야한다.

유니티는 게임 속도를 저하하지 않고 실시간 조명의 효과를 낼 수 있는 라이트매핑및 라이트 프로브 기능을 제공한다.

 

실시간 라이트매핑 기능

유니티는 백그라운드로 라이트맵을 베이킹할 수 있는 기능이 있다. 개발중에 조명의 효과를 볼 수 있어 반복적인 작업에 매우 편리하다. 메뉴에서 Window>Rendering>Lighting 을 선택하면 라이팅뷰가 열린다.

 

Lighting Setting 에셋

라이팅뷰 New Lighting Settings버튼을 클릭해 에셋을 생성한다. 이름은 Play로 한다. Secenes폴더로 이동시킨다.

 

Auto Generate옵션

라이팅뷰 아래에 있는 오토제너레이션 옵션을 체크하면 실시간 라이트맵을 베이크한다. 아직은 라이트매핑을 위해 설정한 것이 없기때문에 문제가 되자 않지만 복잡해지면 에디터의 속도를 떨어트리는 원인이 된다. 

 

프리팹(Prefab)

사전적의미를 미리만들어 놓다는 뜻이다. 자주사용하는 객체를 부품처럼 만들어놓고 재사용할수 있다. 원본이 변경되면 자동으로 복사본들이 변경된다.

 

네스티드 프리팹

프리팹 하위에 프리팹을 추가할 수 있다.

OOP개념의 상속이 가능하다.

프리팹모드 기능으로 프리팹만 수정할 수 있는 별도의 인터페이스를 제공한다.

 

벽만들기

GameObject>3D Object>Cube를 선택해 씬뷰에 Cube모델을 생성후 이름을 Wall로 변경후 transform속성을 다음과 같이 변경. Position(0,3,0), Scale(50,6,1)

 

벽용 머터리얼제작

머터리얼을 하나만들어 Wall로 이름을 바꾼다. 모바일용이라면 부하를 줄이기위해 인스펙터뷰의 Shader속성을 클릭후 Mobile>Bumped Diffuse를 선택한다.

04.Image>Metal>Pattern 08>diffse텍스처를  Base슬롯으로 끌어다 연결한다. 

머터리얼을 wall에 적용한다.

타일링속성중 X를 10으로 한다

04.Image>Metal>Pattern 08>normal텍스처를 Wall>Shader컴포넌트의 Normalmap에 적용한다.

해보니 Shader가 모바일에서는 효과가 없고 Standard에서는 확실히 보였다.

Wall오브젝트를 끌어다 프로젝트의 Prefabs폴더에 넣는다.

Prefab은 하이라키뷰에서 파란색으로 표시된다.

 

Edit>ProjectSettings>Editor>Numbering Scheme에서 (1)에서 _1로 바꾼다.

 Wall을 Wall_1로 바꾼다.

Ctrl-D를 눌러 프리팹을 3개 복사한다.

 

스내핑기능

같은 위치에 4개의  Wall_1234가 있다.

wall_1이동시켜 Floor의 모서리에 붙일것이다. 이게 딱 떨어지게 하기 힘든데 스내핑기능을 사용할 거다.

툴바의 MoveTo를 선택한다.

 V를 누른후  Wall의 붙이고자하는 꼭지점을 잡고 Floor에 접근시키면 딱 붙게 된다.

이런식으로 wall2도 하고 wall3 4는 90로 회전시킨후 한다.

3D 모델에 텍스처를 적용하려면 머티리얼이라는 매개체가 필요하다. 머티리얼은 3D모델에 적용할 텍스처의 다양한 속성을 설정하는 역할을 한다. 텍스처의 재질, 반복간격, 표현방법등의 속성을 설정한다.

 

머티리얼의 자동 작용

diffuse 텍스처를 씬뷰나 하이라키뷰의 Floor에 끌어다 놓으면 자동으로 적용된다. 대신 diffuse텍스처가 있던 폴더에 자동으로 Material이라는 폴더가 생기고 그안에 머터리얼이 자동생성된다.

Floor를 선택하면 Inspedtor뷰에도 diffuse머터리얼이 적용되여 있는걸 볼수 있다.

이렇게 하면 편해보이지만 머티리얼 폴더및 파일이 여기저기 생겨 관리가 어렵다 새로생긴 머터리얼 폴더를 지우자. 그럼  Floor오브젝트가 분홍색으로 변경되어 오브젝트에 적용된 머터리얼이 끊긴걸 나타낸다

머터리얼 생성

Images폴더에 Materials폴더를 만들고 들어가 우클릭후 Create>Materal로 객체를 만들고 이름을 Floor로 바꾼다.

이후 인스펙터 우상 열쇠를 잠구고 Pattern10폴더의 diffuse를 끌어다 Albedo 왼쪽박스에 놓고 Normal을 Normal Map 왼쪽에 놓는다.다른곳에는 안들어 간다.   

Albedo왼쪽 동그라미를 누르면 텍스처를 선택할 수 있는 팝업창이 나와 선택할 수도 있다.

 

머터리얼 적용방법

완성된 머터리얼을 Floor 게임오브젝트에  끌어다 적용한다. 실제적으로는 Floor게임오브젝트의 Mesh Renderer  컴포넌트의 Materials 속성에 Floor머터리얼이 연결된 것이다.

 

Mesh Filter, Mesh Rendere 컴포넌트

Mesh Filter는 해당모델의 3차원 형상정보인 메시 데이터를 갖고 있고, 이 메시 데이터를 토대로 화면에 렌더링 처리를 하는 컴포넌트가 Mesh Rendere다.

 

타일링 속성

텍스처를 타일처럼 반복시키는 기능이 타일링 속성이다. 머터리얼의 인스펙터뷰의 Emission의 타일링 속성을 (10,10)으로 바꿔보자. Secondary Maps에서 타일링속성이 있지만 이건 특정부분을 세밀하게 표현하기 위한 영역이다.

셰이더및 물리 기반 셰이딩

Shader는 렌더링할 때 픽셀의 농담, 색조, 명암을 결정하는 프로그래밍 방식을 말한다. 쉽게 쓴다면 화면에 텍스처를 표현할때 재질감 또는 효과를 표현하는 기능이다. 세이더는 많은 지식을 요구한다.

유니티는 손쉽게 사용할수 있는 내장 쉐이더를 제공한다. 유니티는 여러가지 재질감을 하나의 쉐이더에서 표현할 수 있게 설계되어 있다. 

유니티의 기본쉐이더인 Standard 쉐이더는 물리기반 쉐이딩을 위해 다양한 옵션을 제공한다. 이 가운데 몇가지 중요한 머터리얼 파라미터는 다음과 같다.

 

렌더링모드

OPaque(불투명), Cutout(그물망표현), Fade(페이드인/아웃), Transparent(투명)의 네가지 설정을 통해 다양한 재질감을 표현할 수 있다.

 

알베도

빛을 반사하는 정도를 말하며, 반사율이라고 한다. 모든 물체는 고유의 빛반사율을 가진 것에서 착안했다. 가장 기본이 되는 텍스처를 연결하는 속성이다.

 

메탈릭속성

객체표면에 금속의 재질을 표현하기 위한 텍스처다. 1에 가까워질수록 금속에 가깝다.

 

노멀맵

3D모델링이 표면의 세밀한 입체감이나 질감을 표현하기 위해 많은 폴리곤을 소모하는걸 막기위한 텍스처의 일종, 텍스처의 엠보싱/음영 효과를 이용.

 

높이맵/ 하이트맵 (Height Map)

노멀맵과 비슷하나 텍스처로 높낮이를 표현하는 것이다. 좀 더 돌출시켜 사물을 가리는(Occlusion)효과를 낼 수 있다.

 

가려지는/오클루전(Occulusion)

흑백의 텍스처로 간접조명에  의해 생기는 명암을 더욱더 뚜렷이 표시해 사물의 입체감과 싶이감을 살리는데 사용. 일반적으로 3D 모델링툴 또는 서드파티툴에서 추출.

 

방출/이미션(Emission)

스스로 빛을 방출하는 속성.

 

디테일 마스크

Secondary Maps에 적용할 마스크를 설정하는 텍스처 슬롯이다.특정부분만 좀 더 세부적인 텍스처를 표현할때 사용한다.

텍스처란 3D모델의 표면에 매핑시킬 이미지 파일을 지칭한다. 3D모델에 입힐 옷이다.

유니티는 다양한 포맷의 이미지파일을 지원하며 크기는 2n승 형태(256x256, 1024x1024)일때 압축을 지원하며 속도가 빠르다.

프로젝트의 Metal Textures pack>Pattern10>diffuse를 선택한후

inspector창에서 Max Size를 1024에서 512로 변경하면 용량을 74%줄일수 있다.

게임레벨 (스테이지) 제작시 맨 먼저 작업하는 것 중 하나가 바닥인 Floor이다. 특별히 제작된 모델이 없을경우 유니티에서 기본제공하는 원시모델인 Plane또는 Cube를 사용한다.

GameObject>3D Object>Plane을 하나 만들고 F2를 눌러 이름을 Floor로 바꾼 후 리셋후 사이즈를 x:10, z:10으로 설정한다.

오브젝트를 만들면 위치가 (0,0,0)이 아니어서 리셋하려면 귀찮은데  Edit>Preferences에서  다음과 같이 설정하면 자동으로 (0,0,0)이 되므로 편리하다.

이 책에서 개발할 게임은 3인칭 시점  슈팅(TPS, Third Person Shooting)게임 이다.

1인칭시점 슈팅(FPS, First Person Shooing)게임게임과 더불어 인기가 많은 장르의 게임으로, 주인공과 적캐릭터가 전투를 벌이는 단순한 시나리오의 게임이다.

 

프로젝트 생성

3D 템플릿을 선택한후 이름을 SpaceShooter로 하고 프로젝트를 생성한다.

프로젝트뷰에 Scenes, Scripts, Prefabs, Images, Models, Sounds, Animations폴더를 만들어둔다. 

 

캐릭터모델 임포트하기

사용할 주인공 캐릭터는 MADFINGER Games사의 ShadowGun:Daedzone게임의 에셋을 사용한다. 현재는 에셋에서 다운받을수 없어서 일부를 다음 깃 허브에서 다운 받는다.

 

https://github.com/IndieGameMaker/IndieGameMaker

 

GitHub - IndieGameMaker/IndieGameMaker

Contribute to IndieGameMaker/IndieGameMaker development by creating an account on GitHub.

github.com

출판사에서 다운로드해도 되는것 같다.

다운로드후 Resources/Models폴더에 있는 Player.unitypackage를 프로젝트뷰 끌어와 설치할 수 있다. unitypackage는 에셋과 그 메타데이터를 저장한 압축파일이다.

새로 설치된 Player폴더를 Models폴더 밑으로 넣는다.

 

무료리소스 내려받기

책에서는 여러가지 리소스를 다운받는 법을 써 놨는데 그냥 깃에서 다운받으면 편하고 정확하다.

https://github.com/IndieGameMaker/SpaceShooter2021

Assets Store에서 yughues metal검색한후 내려받았는데 교재랑 같은 그림을 내려받았는데 내부 내용이 교재와 다르다 그냥 깃에서 다운받기를 권장한다.

하늘을 표시할 Skybox Volume2(Nebula)도 내려 받는다 

마지막으로  Barrel을 검색해 다운받는다.

리소스들을 import한후 Barrel은 Models폴더로 Sky와 Metal은 Images폴더로 정리한다.

에셋스토어에서 Add한 에셋들은 PackageManager에서도 Download 후 import할수 있다.

Scenes폴더 안의 SampleScene을 선택후 F2를 눌러 이름을 Play로 바꾼다.  Reload할껀지 물어보면 [Realod]를 눌러 갱신한다.

 

게임엔진은 유니티외에도 언리얼, 크라이, 하복, 게임브리오 소스엔진 등이 있다. 

유니티는 게임엔진으로 개발되었으니 게임 이외의 분양에서도 널리 사용되기에 리얼타임 3D 플랫폼이라는 부재를 달고 통합 멀티미디어엔진으로 발전되고 있다. 이것이 유니티를 공부하게 된 주된 이유이다.

 

아담이라는 단편 애니메이션이 유니티5로 제작되었고 Adam the Mirror라는 단편영화도 2017버전으로 제작되었다. 블레이드러너2049의 특수 효과에도 유니티가 활용됐다. 최근 유니티데모팀이 The Heritic이라는 고해상도 파이프라인 (HDRP)과 VFX의 장점을 잘 보여주는 단편영화를 선보인바 있다.

 

https://www.youtube.com/results?search_query=The+Heritic 

 

https://www.youtube.com/results?search_query=The+Heritic

 

www.youtube.com

 

유니티의 기본적인 인터페이스는 많은 창이 보인다.

각 창은 뷰라고도 불리고 다음과 같은 중용한 뷰가 있다.

프로젝트뷰 : 콘텐츠 제작에 필요한 모든 리소스들을 모아두고 만드는 곳.

씬뷰 :  프로젝트의 리소스를 재배치하여 3D 스테이지를 디자인하고 게임을 설계하는 뷰

하이라키뷰 : 씬뷰에 배열된 오브젝트들을 Transform Sort방식으로 정렬해서 보여준다. 오브젝트들은 메뉴에서 이동 복사 삭제가 가능하다. Preference창에서 Alphanumeric Sorting으로 변경 가능하다.

인스펙터뷰 : 선택된 게임오브젝트와 에셋의 속성창, 컴포넌트의 삽입 삭제가 가능하다.

게임뷰 : 개발 진행 중에 게임을 실행해 미리 볼 수 있는 뷰. 메인 카메라의 시야로 렌더링해서 보여준다.

콘솔뷰 : 디버깅시 로그를 출력하는 뷰, 메시지는 정보, 경고, 오류등이 있다.

툴바 : 화면이동, 객체이동, 회전, 스케일,  UI객체의 이동,회전, 스케일, 트랜스폼, 단축키QWERTY 

 

피봇/센터

화면 우상에 위치한 십자가같은 모양, 객체의 중심좌표 표시기준, Pivot은 모델링때 설정한 원점좌표가 표시되며 Center는 원점좌표가 무시되며 모델의 중앙에 표시된다. Center는 잘 안 쓰인다.

 

로컬/글로벌

글로벌 좌표는 3차원 공간의 절대 좌표를 의미하며 변하지 않는 절대 기준 좌표이다. 반면 씬뷰에 있는 객체를 중심으로 한 좌표를 로컬좌표라고 한다.

 

단축키

F : 게임오브젝트를 하이라키에서 선택하거나 씬뷰에서 선택한후 F키를 누르면 해당 객체가 포커싱된다.

FF : F키를 더블클릭하던가 Shift+F로 게임을 실행하는 중 이동하는 게임오브젝트를 자동으로 따라가게 할수 있다.

마우스휠 또는 AL + 마우스우클릭 + 마우스이동 : 씬뷰 Zoom

마우스 우클릭 + WASDQE : 시야각 변화

Shift+Space : 뷰가 최대화/최소화 된다.

유니티의 단축키는 Edit>Shortcuts에서 확인 편집할 수 있다.

유니티는 언리얼과 더불어 유명한 게임엔진중 하나 이다.

유니티를 이용해 하루면 재미있게 게임을 만들 수도 있다.

우리가 Microsoft사의 Word나 Excel을 필요한 기능만 사용해 이용한다. 사실 Excel은 자격증이 있을 정도로 다양한 기능을 제공한다. 아마 Word나 Excel를 공부만 한다면 끝까지 못 읽고 다들 포기할 것이다.

유니티도 마찬가지 이다. 엄청난 기능을 갖추고 있다. 이걸 다 읽고 게임을 만들겠다고 생각하면 오산이다. 그냥 고시공부하는게 좋을지도 모른다.그러나 점점 개념이 잡히면서 책을 읽는 속도가 늘어난다.

유니티를 이용해 하루만에도 게임을 만들수도 있지만 처음하시는 분들에게 유니티는 쉽지 않을수도 있다.

게임을 만들수 있다는 기대감으로 처음 유니티를 공부할때는 책을 따라하기 조차 쉽지 않았다. 포기하고 유튜브를 보기도 했다.  되도록 간단히 공부가 끝나면 직접 게임을 만들어보고 부족한 부분을 구글링하면서 배워보시기 바랍니다. 그럼 점점 머리속에서 유니티가 정리되는 걸 느끼실 겁니다.

 

유니티는 3D게임엔진이라 3차원 개념의 이해가 필요하나 그때 그때 공부하시면 됩니다.

복잡한 벡터나 선형대수의 계산은 유니티가 알아서 해주니 걱정 안하셔도 됩니다. 수학을 모르니 게임을 못배운다고 구박하는 선생님도 있지만 그런 사람을 위해 계산기 있다고 생각합니다. 잘 사용하면 됩니다. 필요한건 게임을 만들겠다는 목표의식과 이를 뒷받침해줄 인내와 끈기와 입니다.

유니티를 공부만 하지 마시고 직접 게임을 만들어 보시기 바랍니다.  쌈을 많이 해본 사람이 쌈을 잘하는거죠. ㅎㅎ

그리고 가능하면 무료학원이나 게임잼 같은데 가보세요. 짧은 기간이라도 괜찮습니다. 남들이 열심히 하는걸 보면 자극이 됩니다.

물로 프로 게임프로그래머가 되기 위해서는 눈감고도 할 수 있는 정도가 되어야 한다. 남의 돈 받는게 쉽지 않다. 사실 프로게이머가 되기 위해서는 유니티 이외에도 인공지능, 알고리즘, 자료구조, 통신, 컴퓨터사이언스, 데이터베이스, Directx, 게임물리, 수학 할게 산넘고 산이다. 잘 생각해보시기 바란다. 가성비로는 그냥 다른 프로그래밍 분야가 페이는 훨 나을수도 있다. 그러나 아마 이 글을 일고 계신분들은 게임을 사랑하시는 분들이라 판단이 쉽지 않겠지만 직업은 직업일뿐이다.

솔직히 게임시장이 크지만 게임엔진의 발달로 너무나 많은 게임이 나와 경쟁이 무지무지해 이미 레드오션입니다. 대형게임사는 외국것 들여다 팔기 급급하거나 기존게임을 현질로 우려먹는다던지 솔직히 정체시기라고 생각합니다. 여기에 짜증난 유저들이 Youtube대거 이동했습니다. Youtube는 무료에 재미있을니까요.

하여간 그래도 게임엔진은 이제 활용도가 시뮬레이션 AR VR XR Metaverse 가상휴먼, 영화. 컨텐츠, 유튜브등 다양한 분야가 펼쳐지면서 유니티나 언리얼의 가능성은 커져가고 있다고 생각합니다. 꼭 유니티로 직업을 삼지 않더라고 한번쯤은 배워볼만한 분야라고 생각합니다. 대신 빡세게 빨리 열심히하시기 바랍니다. 다른것도 해야하니까요. 

 

이번 블로그는 위키북스출판사의 유명한 이재현님의 절대강좌유니티 2021판과 유니티 매뉴얼을 참조해서 정리했습니다. 초보자도 따라할 수 있게 정리했지만 중급자용이라고 생각합니다.

 

https://unity3dstudy.com/

 

IndieGameMaker

 

unity3dstudy.com

 

절대강좌! 유니티: 유니티 전문 개발자가 알려주는 효과적인 게임 제작 기법

유니티 2021 버전과 더불어 한층 더 충실하게 보강된 내용으로 돌아왔습니다! 유니티는 현재 가장 각광받고 있는 게임 개발 엔진이다. 국내외를 막론하고 출시되는 많은 모바일 게임은 물론 게임

wikibook.co.kr

 

용어설명은 유니티 매뉴얼을 참조했다.

https://docs.unity3d.com/kr/2021.3/Manual/UnityManual.html

 

Unity 사용자 매뉴얼 2021.3(LTS) - Unity 매뉴얼

Unity 에디터를 사용하여 2D 및 3D 게임, 앱 및 경험을 만들 수 있습니다. unity3d.com에서 에디터를 다운로드합니다.

docs.unity3d.com

 

프로젝트창에서 우클릭하고 Create>Script를 하면 스크립트가 하나만들어지고 이름을 Empty라고 바꿔보자.

바꾼 이름인 Empty  class가 자동으로 만들어진다. 유니티는 스크립트 언어로 c#을 사용한다.

나중에 이 스크립트를 카피할때 조심해야 한다 복사한 파일의 이름을 변경해도 내부의 클래스 이름은 안 바뀌기 때문이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Empty : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

Empty class는 Start()와 Update() 2개의 함수를 갖고 있다. 

사실 class Empty는 MonoBehaviour class에서 상속되어졌기에 아래와 같이 다양한 콜백함수들이 라이프싸이클을 갖고 실행된다. Empty라는 클래스가 생성되면서 파괴될때까지의 과정이라고 보면 된다. 프로그래밍을 위해서는 라이프싸이클을 이해할 필요가 있다.

1. 모노 (Mono)

.Net은 마이크로 소프트(MicroSoft)에서 C언어에 자바의 장점을 수용하여 개발한 MS Windows 프로그램 개발 및 실행 환경이자 언어이다.

네트워크와 UI 등의 많은 작업을 캡슐화 하여 코딩의 효율성을 극대화 한 .Net 의 강력한 기능을 사용하기 위해서는 .Net 프레임워크가 설치 된 윈도우 환경이 있어야 했다.

이에 윈도우가 아닌 다른 플랫폼에서 .Net 프레임워크를 사용하기 위해 개발된 것이 얼마 전 MS에서 인수한 자마린(Xamarin) 사의 Mono 이다.

Mono 는 .Net 프레임워크(framework) 의 오픈소스 개발 플랫폼으로서 크로스플랫폼(Cross-platform) 어플리케이션의 개발을 지원하며 C#과 CLI (Common Language Infrastructure) 에 기반을 두고 있다.

Mono 를 활용한 대표적인 크로스플랫폼 개발 도구가 유니티와 자마린 이다.

현재 유니티에서 사용하는 Mono 의 .Net 컴파일러에서 지원하는 .Net 버전은 4.x 로 C# 7까지 사용할 수 있다고 한다.

2. 스크립트 언어 (Script Langauge)

하나 이상의 어플리케이션 에서 스크립트(script)를 지원하는 프로그래밍의 부분 집합(subset)이다.

스크립트는 흔히 어플리케이션의 코어 코드와는 별개의 언어로서 최종 사용자에 의해 작성되거나 최소한으로 수정되는 프로그램이다.  스크립트는 대개 소스코드나 바이트코드로 부터 해석되며 이는 어플리케이션이 기계어나 중간언어로 컴파일되는 것과 차별화 된다.  그런면에서 스크립트 언어인지 아닌지를 결정하는 것은 언어 그 자체가 아니라 그 언어가 사용되는 환경이다.

3. Unity 의 Behaviour Script

유니티에서 하나의 스크립트는 그 자체로 하나의 클래스(Class)를 뜻한다.

클래스란 속성(Properties), 메서드(Method) 들을 하나의 객체로 묶은 데이터 타입이다.

유니티에서 하나의 스크립트는 각각 속성(Properties), 변수(Variables), 명령(Instructions) 또는 기능(Functions)을 가지며 사용자는 원하는 순간에 해당 스크립트를 호출 할 수 있다.

모든 스크립트는 또한 Behaviour Component 이다.

Behaviour 는 활성화(Enable), 비활성화(Disable) 할 수 있는 Component 이다.

즉, Behaviour는 껐다켰다 할 수 있는 동작(behaviour) 이며, 이는 캐릭터의 동작이 될 수도 있고, 환경이 될 수도 있고, 게임 내 흐름을 제어하는 프로그램 자체가 될 수도 있다.

* Component 란? GameObject 에 부착되는(Attached) 모든 것들이 상속받는 기반 클래스.

4. MonoBehaviour

MonoBehaviour 는 Unity 의 모든 스크립트가 상속받는 클래스이다.

사용자가 Unity 엔진의 작동 방식을 이해하지 못하더라도 코드를 작성할 수 있도록 미리 만들어 둔(built-in) Behaviour 클래스 이자 스크립트 명령(scripting instruction) 들의 집합이다.

덕분에 모든 스크립트는 유니티 엔진에 의해 호출(invoke) 되는 콜백(callback) 함수들을 이용할 수 있게 된다.

이 콜백 함수들은 Reset, Awake, Start, Update, OnGUI, OnDestroy 등 유니티를 사용하면서 수없이 사용하게 된다.

5. MonoBehaviour 의 생명주기(Lifecycle)

 

유니티의 공식 매뉴얼을 보면 위와 같이 MonoBehaviour 의 수많은 콜백함수 종류와 각각이 호출 되는 시점을 알 수 있다.

이 중 개발 과정에서 실제 자주 이용하게 되는 콜백들의 라이프사이클을 살펴보자.

 

Reset : 유니티 에디터에서 오브젝트 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행된다.

          객체의 속성을 초기 값으로 설정해 줄 때 사용한다.

 

Awake : 프리팹이 인스턴스화 한 직후, 스크립트가 호출되자마자 오브젝트 활성화 여부와 상관없이 실행 된다.

           모든 오브젝트가 초기화 된 후 호출되기 때문에 GameObject.Find 같은 명령문을 안전하게 사용할 수 있다.                 Awake 함수는 언제나 Start 함수 전에 호출되는 점에 주의. (StartCoroutine 을 사용할 수 없다.)

 

OnEnable : 다른 초기화 함수와 달리 하나의 라이프 사이클 내에서 여러번 호출 될 수 있다.

                인스펙터뷰에서 체크 및 스크립트 내에서 SetActive 함수로 게임 오브젝트를 활성화 할 때마다 호출 된다.

 

Start : Update 함수가 호출되기 전에 한번만 호출된다.

         다른 스크립트의 모든 Awake가 모두 실행된 이후에 실행되며 Awake와 달리 오브젝트가 활성화 되어 있어야 호출 된다.

         Awake 이후 호출되므로 예를들어 A 객체의 Awake 함수에서 동적 생성한 멤버를 B객체의 Awake 함수에서 접근할 경우 오브젝트 들의 Awake 함수 호출 순서는 임의로 정할 수 없으므로 B객체의 Awake 가 먼저 호출 되어 NullReferenceExecption 을 발생 시킬 수 있다.

         이럴 경우 동적 생성은 Awake 에서 하고 동적 생성되는 멤버에 접근하는 초기화 코드는 항상 Awake 이후로 보장되는 Start 에 넣는 것이 좋다. 

 

FixedUpdate 프레임과 상관없이 무조건 시간 기준(default 0.02초. 변경 가능)으로 호출 되는 Update 콜백이기 때문에 주로 물리 엔진을 사용하는 경우 일정 시간 간격으로 힘을 가하거나 체크할 때 사용한다.

                   프레임 속도가 기준 시간 속도보다 오래 걸릴 정도로 느려질 경우 한 프레임에서 여러번 호출 될 수 있다.

 

Update : 매 프레임마다 호출되는 가장 일반적인 Update 함수.

             오브젝트가 활성화 되어 있어야 호출 되며 프레임 단위이기에 호출 시간 간격은 프레임에 따라 변한다.

 

LateUpdate : 모든 Update 계열 콜백들이 실행되고 나서 호출된다.

                  Update 함수에서 캐릭터를 이동 시킨 후 LastUpdate에서 캐릭터의 좌표를 추적해 카메라의 좌표를 이동시키는 등의 경우에 사용한다.

 

OnDisable : 게임 오브젝트 또는 스크립트가 비 활성화 되었을 때 호출된다. (StartCoroutine 사용 불가)

 

OnDestroy : 해당 오브젝트가 파괴 되기 전 프레임의 Update 함수 실행 후 호출 된다.

                 일반적으로 라이프 사이클 내에서 사용한 자원들을 돌려 놓는 작업을 이곳에서 하게 된다.

 

OnApplicationQuit :  앱이 종료 되기 직전에 모든 오브젝트에서 호출된다.

                             에디터에서는 플레이 모드 중지할 때 호출 된다.

 

6. MonoBehaviour 의 특징

MonoBehaviour 를 상속받은 스크립트 파일은 그 자체로 사용할 수 없다.

GameObject 에 Component 형태로 등록되어 있어야 한다.

즉, 게임 내에서 사용할 GameManager.cs 라는 스크립트 파일을 만들었다면 해당 클래스를 적용할 빈 GameObject를

Unity의 Hierarchy 에서 추가한 후 Inspector 창에 이 스크립트 파일을 등록한다.

그리고 코드에서 해당 GameManager 클래스를 가져오려면 위에서 추가한 GameObject 객체에 GetComponent<GameManager>(); 형태로 가져와야 한다는 뜻이다.

또한 가장 중요한 특징 중 하나는 MonoBehaviour 를 상속받은 클래스는 new 로 동적 할당할 수 없다.

이 경우,

1. GamObject.Instantiate 함수를 통해 해당 스크립트가 Component 로 추가된 오브젝트의 인스턴스를 생성

2. 기존 생성된 GameObject 객체에 AddComponent<GameManager>();

하여 사용할 수 있다.

MonoBehaviour 의 다양한 콜백 함수는 필요할 경우 오버라이딩 해서 사용하면 된다.

하지만 오버라이딩 해놓고 해당 함수 안에서 아무것도 하지 않고 비워두면 어떻게 될까?

컴파일 과정에서 이런 경우 함수 호출을 제거해 주면 좋으련만 아쉽게도 내용이 있던 없던 무조건 호출을 진행 한다.

Awake 나 Start 같은 한번만 호출 되는 경우는 상대적으로 영향이 적겠지만 FixedUpdate 같은 경우 0.02초 마다 오브젝트 별로 각각 호출을 하게 되므로 퍼포먼스에 상당한 영향을 끼칠수 있다.

쓰지 않는 MonoBehaviour 함수는 꼭 삭제해 주자.

 

https://skuld2000.tistory.com/25

 

'유니티스크립팅 > 유니티매뉴얼' 카테고리의 다른 글

카메라 - 유니티  (0) 2023.03.03
마우스좌표를 월드좌표로 - 2D  (0) 2023.03.02
[유니티매뉴얼] Unity의 회전 및 방향  (0) 2023.02.28
Vector3  (0) 2023.02.25
Scripts as Behaviour Components  (0) 2023.02.25

+ Recent posts