2020년 1월 20일 월요일

[유니티 기초] 5. 캐릭터 이동 구현

이번 편에서는 키보드 입력을 받아서 이동하는 것을
구현해보도록 하겠습니다.

※ 해당 강좌는 프로그래밍에 대한 기초 지식이 있어야 합니다.
프로그래밍을 처음 접하시는 분은 먼저 기본기부터 배우시는 것을 추천해드립니다.

4장에서 했던 내용을 이어서 진행하겠습니다.
 
스크립트를 더블클릭하여
MonoDevelop을 열어줍시다.

라이프 사이클 중에서 Awake 와 FixedUpdate 만 사용하겠습니다.
FixedUpdate를 사용하는 이유는 이동 로직에 리지드바디(Rigidbody)를 쓰기 때문이죠.


먼저 이동 속도를 전역 변수로 선언해줍시다.
그리고 기본 값을 넣어주도록 해요.

10 뒤에 f 가 붙어있는 이유는
타입이 float 이기 때문입니다.

접근자가 public인 전역변수는
이렇게 바깥에 드러나게 됩니다.

유니티에서 바로 값을 수정할 수도 있지요.​
​ 

그 아래에 오브젝트의 리지드바디를 가져올 변수와
이동 거리를 담을 Vector3 변수도 하나씩 선언해줍시다.
(Vector2는 2차원, Vector3는 3차원 입니다.)


Awake 사이클로 들어왔습니다.
우리는 이동시킬 대상인 리지드바디를 끌고 와야합니다.

스크립트를 가지고 있는 오브젝트의 다른 컴포넌트를 가져올때는
GetCompoenet<T> () 함수를 사용합니다.


Awake가 끝나고 이동 로직을 담을 FixedUpdate 사이클로 진입하였습니다.

일단 키보드 방향키에 따른 이동거리를 받아야겠지요?
Input 클래스의 GetAxisRaw (Name)를 사용합시다.

갑자기 생소한 아이들이 나와서 이해가 잘 되지 않을 수도 있습니다.
처음 시작하면 이러한 함수들이 있는지 모르기 때문에 개발이 어려운 것입니다.
차근차근 함수들을 눈에 익혀나가면서 익숙해지도록 해요.

여튼 입력을 담당하는 Input 클래스의 GetAxisRaw 라는 녀석을 알게됬는데,
매개변수로 들어간 "Horizontal" 과 "Vertical" 은 어디서 온 걸까요?


Edit - Project - Settings - Input
메뉴로 들어가봅시다.

그럼 프로젝트의 모든 입력 설정이 나타나지요.
Horizontal은 왼쪽, 오른쪽 방향키로 이동하도록 되어있습니다.
Vertical은 위, 아래 방향키로 되어있구요.

물론 이 설정은 마음대로 바꿀 수 있습니다.


​이제 수평, 수직 이동거리를 가지고
리지드바디에 적용해야할 차례입니다.

필자는 Run() 이라는 함수를 새로 만들어,
이 안에서 요리해보겠습니다.


전역 변수 movement의 값을 설정해줍니다.
Set(x, y, z) 함수의 매개변수를 잘 확인하여 값을 넣어줍시다.
y는 높이라서 0으로 넣겠습니다. 

movement 변수의 타입은 Vector3.
벡터는 방향과 크기를 모두 가지고 있지요.

우리는 수평, 수직 값을 동시에 가지고 있는
벡터 값을 만든 것입니다.


이제 이 벡터 값을 우리가 원하는 값으로 바꿀 것입니다.
위처럼 normalized 값에 이동 속도 speed를 곱하고,
프레임 보정 시간인 Time.deltaTime도 곱해줍니다.

Vector3.normalized는  여러 방향과 크기를 가진 벡터의 중앙값 입니다.
이것으로 두 화살표 키를 동시에 눌러 대각선 이동이 가능해졌습니다.
Time.deltaTime은 시스템 여건에 따라 다른 프레임에 따라서
로직 결과가 달라지는 것을 방지해줍니다.

60프레임일때나, 40프레임일때나
이동한 거리는 동일하도록 서로 보정해주는 역활을 합니다. 


우리가 원하는 값을 얻었으니,
마지막으로 리지드바디에 적용해봅시다.

리지드바디의 이동에는 MovePosition (position) 함수를 사용합니다.
현재 오브젝트의 위치인 transform.position에다가 movement를 더하면,
이동 로직 완성입니다!

스크립트를 저장하고
게임을 실행시켜봅니다.


이처럼 방향키로 자유자재로 이동하면 성공입니다.

------------------------------------------------

다섯번째 강좌는 여기까지입니다.

다음 강좌에서는 점프 로직을 구현하는 시간을 가져보도록 하겠습니다.
그럼. 

[유니티 기초] 4. 라이프 사이클


프로젝트에서 오브젝트 하나 준비해둡니다.

지난 번에 리지드바디를 추가한 것처럼
스크립트를 추가할 것입니다.

Add Component - New Script
메뉴로 가서 스크립트 파일 이름과 언어를 정합니다.

언어는 C# 과 JavaScript 둘 중 하나를 선택할 수 있습니다.
유니티에서는 C#을 권장하고 있으므로 C#을 선택하겠습니다.
(앞으로의 강좌도 C#을 기준으로 다룰 예정입니다.)

그럼 이처럼 스크립트 컴포넌트와 파일이 추가됩니다.

이 파일은 자동으로 애셋 폴더에 들어가며,
컴포넌트에서 마우스 클릭으로 위치를 확인 할 수 있습니다.

애셋의 스크립트를 클릭하면 이처럼 코드를 보여줍니다.
이제 더블클릭해서 편집기로 들어가보도록 하겠습니다.

유니티에서는 MonoDevelop이라는 자체 편집기를 제공하고 있습니다.
여기서 스크립트를 요리할 수 있지요.

스크립트를 생성한 직후의 모습입니다.
유니티엔진 패키지와 간단한 클래스 구조가 보이네요.

기본적으로 게임 오브젝트는 MonoBehaviour 클래스로 시작합니다.

MonoBehaviour는 캐릭터뿐만 아니라
게임 상의 대부분 오브젝트를 만들 때 사용된답니다.

그리고 이것은 라이프 사이클 (생명 주기)라는 특징을 가지고 있는데,
우리는 이 사이클에 맞추어 프로그래밍을 해야합니다.

라이프 사이클을 구성하는 함수는 매우 많지만,
 기본적이고 역활이 큰 함수 중심으로 다루도록 하겠습니다.


------------------------------------------------

1. Awake
  : 최초로 로딩될 때 단 한번 실행.
  : 여러 기본 값을 설정하는 곳.
2. Enable
  : 오브젝트가 켜질 때 실행.
  : 여러 번 실행 가능.

3. Start
  : Update 사이클 진입 전 실행.
  : 여러 기본 값을 설정하는 곳.
  : Awake와 다르게 여러 번 실행 가능.

4-1. Update
  : 하나의 프레임마다 실행.
  : 주요 로직을 두는 곳.
  : 최대 1초당 60프레임까지 실행.
  (프레임이 1초에 70번이라도 60번만.)

4-2. FixedUpdate
  : 하나의 고정 프레임마다 실행.
  : 물리, 리지드바디에 대한 로직을 두는 곳.
  : 정확한 물리 시뮬레이팅을 위해 사용.
  : 높은 CPU 부하 유발.

5. Disable
  : 오브젝트가 꺼질 때 실행.
  : 여러 번 실행 가능.

6. Destory
  : 오브젝트에 Destory(삭제) 명령이 내려지거나, Scene이 바뀔 때 실행.


[유니티 기초] 3. 중력과 충돌



3D 게임에서는 물리효과가 필수입니다.
여러 게임사들은 제각기 다른 물리엔진을 사용하며
그 기술들은 나날이 발전해가고 있습니다.​.
우리의 유니티도 뛰어난 물리효과를 제공해주고 있습니다.
이제부터 하나씩 알아보도록 할까요?

오브젝트 하나를 바닥 위로 높에 띄어놓아보았습니다.
지금은 게임을 실행해도 이 위치 그대로입니다.
이 오브젝트가 물리 효과를 받는 물체라고
선언을 해주지 않았기 때문이죠.

​속성창 아래에 Add Component 버튼을 누르면 ​다양한 컴포넌트가 나옵니다.
Physics - Rigidbody 를 선택해줍니다.

이제 오브젝트 하나에
위와 같이 6개 컴포넌트를 가지고 있게 됩니다.

------------------------------------------------

1. Transform
   : 기본 속성. 위치, 각도, 크기를 설정합니다.

2. Collider
  : 충돌 속성. 이벤트를 위한 트리거로도 사용됩니다.

3. Rigidbody
  : 물리 속성. 무게와 물리 효과를 설정합니다. 

4. Mesh
  : 버턱스로 이루어진 실제 모델.

5. Mesh Renderer
  : 모델의 렌더러. 그림자, 외각선 등 표현을 설정합니다.

6. Shader
   : 모델의 쉐이더. 금속, 유리 등 재질을 설정합니다.

------------------------------------------------

보통 3D 오브젝트는 이렇게 6개의 기본 컴포넌트를 가지고 있습니다.

그 중에서도 중력의 영향을 받는 물체를 만들기 위해선
Mesh, Collider, Rigidbody 가 꼭 필요하죠.

먼저 콜라이더부터 알아보도록 하겠습니다.

콜라이더는 연두색 경계선으로 표현되며,
형태는 여러가지로 만들 수 있습니다.

충돌은 콜라이더 기준이기 때문에
매쉬 상관없이 콜라이더 크기에 따라
충돌이 다르게 일어날 수 있습니다.

1. 콜라이더 크기 : 100%

2. 콜라이더 크기 : 50%

3. 콜라이더 크기 : 200%
 
영상을 보시면 바닥과 충돌하는 기준이
콜라이더인 것을 확연히 느낄 수 있습니다.


Is Trigger
해당 콜라이더는 충돌이 아닌
오직 트리거로만 사용하겠다는 옵션입니다.

4.  Is Trigger 옵션 : On
Is Trigger가 On되어있는 콜라이더만 있는 물체는
이렇게 충돌없이 쑥 바닥으로 떨어지게 됩니다.
​ 
이제 콜라이더는 마무리하고 리지드바디를 살펴보기 전에,
중력을 어떻게 설정하는지 알아보도록 합시다.

 
Edit - Project Settings - Physics
이 메뉴로 이동하여 클릭하면,

속성 창에 이러한 옵션이 나타납니다.
여기서 Gravity를 보면 Y축 -9.81 이 기본으로 잡혀있네요.
(실제 중력이 바로 9.8 이지요.)

이 수치를 높일수록 물체는 더욱 빨리 떨어지게 됩니다.
혹은 아예 방향을 바꾸는 것도 가능하구요.

5. Gravity : X축 -10
(너 어디가니...)
X축으로 했더니 저 멀리 날아가는군요.
이렇게 마음대로 중력을 바꿀 수 있답니다.

이제 리지드바디에 대해 살펴보도록 하겠습니다.

리지드바디는 물리효과인 만큼
생소한 단어들이 많이 보입니다.

------------------------------------------------

1.  Mass
 : 무게. 높을수록 충돌이 무거워지지만, 자유낙하가 빨라지지는 않습니다.

2.  Drag
  : 낙하 저항. 높을수록 천천히 낙하합니다.

3. Angular Drag
  : 회전 저항. 높을수록 천천히 회전합니다.

4. Is Kinematic
  : 외부 물리 효과의 영향을 받는 지의 여부.
  : 옵션을 켜면 오직 애니메이션, 스크립트에 의해서만 움직이게 됩니다.

5. Interpolation
  : 고정 프레임에서 물리 효과를 부드럽게 할 수 있습니다.
  : 일반적으로 플레이어 캐릭터에 적용합니다.

6. Collision Detection
  : 연속 충돌 감지 옵션.
  : 상당히 빠른 물체가 미처 다른 물체를 충돌하지 않고 통과해버리는 현상을 방지합니다.

7. Constraints
  : 위치나 회전을 고정시키는 옵션입니다.

------------------------------------------------
Mass는 두 물체가 충돌할 때 영향을 줍니다.

6. 공 무게 : 1

7. 공 무게 : 10

같은 충돌이 일어났을때, 공 무게가 1일 때보다 10이 더 느리게 움직이지요.

이번엔 Constraints로 회전을 막아보겠습니다.

8. 박스 Constraints 옵션 : 회전 On
박스의 X, Y, Z 회전을 고정했더니
그대로 콕 박혀서 떨어지는 것을 볼 수 있습니다.

점프하는 플레이어 캐릭터도 이처럼
 넘어지지 않게 잡아줄 수 있는 것이지요.

------------------------------------------------

세번째 강좌는 여기까지입니다.
다음 강좌에서는 스크립트 입문에 대해 다루어보도록 하겠습니다.

그럼.

[유니티 기초] 2. 오브젝트 변형


1장에서 만들어두었던 프로젝트를 불러옵니다.

이제 이 상자를 이리저리 굴려볼꺼에요.
오브젝트 변형은 3가지 타입으로 있으며 다음과 같습니다.



왼쪽의 속성창에서 수치를 직접 입력하거나
기즈모를 직접 마우스로 끌면서 변형시킬 수도 있답니다.
기즈모는 W, E, R 단축키로 바꿀 수 있습니다.

오브젝트 탐색기에서 마우스 오른쪽 버튼을 클릭하면
여러가지 메뉴들이 나옵니다.

이처럼 복사해서 붙여넣기도 할 수 있지요.
(Ctrl+C , Ctrl+V 가능)

이제 카메라도 움직이고 각도를 조절해서,
오브젝트들이 게임 상에서 잘 보이도록 조절해봅니다.
카메라가 잘 잡혀야 게임 화면이 잘 나오겠지요~

위의 내용들이 이해되셨다면, 이렇게 나만의 모양도 만들면서
 오브젝트 편집 기능에 익숙해져봅시다!

------------------------------------------------

두번째 강좌는 여기까지입니다.
다음 강좌에서는 중력에 대해서 다루어보도록 하겠습니다.

그럼.

[유니티 기초] 1.인터페이스와 시야 조절



유니티를 시작하면 로그인을 먼저 해야합니다.
유니티 공식 홈페이지에서 만든 계정을 입력하고 Sign In 버튼을 눌러줍시다.

기존에 있는 프로젝트들을 보여주는데,
오른쪽 위쪽에 New Project를 클릭합니다.
프로젝트 이름과 경로를 정하고 파란색 버튼을 꾹 눌러서
새로운 프로젝트를 만듭니다.

이것이 유니티 5의 인터페이스입니다.

------------------------------------------------

1. 작업 뷰포트
   : 게임 오브젝트를 선택하고 수정할 수 있는 공간입니다. 쉽게 말하면 개발 공간.

2. 인게임 뷰
   : 실제 게임상으로 보여지는 공간입니다. 카메라 오브젝트가 최소 하나가 있어야 합니다.

3. 게임 오브젝트 탐색기
   : 현재 게임 씬(Scene)에 올라온 오브젝트를 졍렬해놓은 공간입니다.

4. 애셋 탐색기
   : 각종 애셋들을 정렬해놓은 공간입니다.

5. 게임 오브젝트 속성창
   : 선택한 게임 오브젝트의 속성을 설정하는 공간입니다.

------------------------------------------------

각각의 창은 마우스드래그로 옮길 수 있습니다.

현재 필자가 설정한 레이아웃은 '2 by 3' 을 조금 수정한 레이아웃입니다.
처음 하신 분이라면 Default로 되어있을 것입니다.

한번씩 살펴보신 후, 편하다 싶은 걸로 선택하시면 좋을 것 같네요.

자, 그럼 아무것도 없는 횡한 세상에 뭐라도 하나 놓아봅시다.
GameObject - 3D Object 메뉴로 가시면
여러가지 3D 모델들을 선택할 수 있습니다.

필자는 가장 기본적인 Cude,  상자를 선택해보겠습니다.

누르자마자 상자 하나가 나타납니다.
이걸로 무엇이라도 해보고 싶은데...

그렇습니다.
일단 요놈의 상자를 이리저리 살펴볼 줄 알아야
움직여보던가 굴려보던가 삶아먹건가 하겠지요?

작업 뷰포트에서의 시야조절은
마우스 오른쪽, 왼쪽, 그리고 Ctrl 키만 있으면 됩니다.


화면 왼쪽 위를 보시면 손 모양 버튼이 있는데,
이걸 누르면 이동모드가 됩니다.

이 상태로 아래의 컨트롤을 한번씩 해보아요.

------------------------------------------------

1. 마우스 왼쪽
  : 잡아 끌어서 이동

2. 마우스 오른쪽
  : 현재 구도를 축으로 회전

3.  마우스 휠  : 화면 확대 및 축소

4. 마우스 왼쪽 + Ctrl
  : 뷰 중심을 축으로 회전

5. 키보드 화살표키
  : 화살표 방향대로 이동


6. 게임 오브젝트 탐색기에서 더블 클릭
  : 해당 오브젝트가 중심에 오도록 이동

------------------------------------------------

유니티의 위쪽 한가운데에는 게임 실행, 일시정지 버튼이 있습니다.
재생 버튼을 누르면 실제로 게임이 실행되죠.


우리가 만들어놓은 물체가 아련하게 보입니다.

좀 더 가까이 보고 싶어서 마우스 휠을 돌려보는데..
이런, 반응이 없군요.

여기서는 위에서 알려드린 시야 조절이 먹히지 않습니다.

위의 방법은 유니티가 제공하는 작업 뷰포트에서의 컨트롤이고
인게임의 시야 조절은 직접 코드로 만들어야 하기 때문입니다.

------------------------------------------------

첫번째 강좌는 여기까지입니다.
다음 강좌에서는 저 상자를 요리조리 다루어보는 시간을 갖도록 하지요.

그럼.