본문 바로가기
게임/기술 : 개발엔진

유니티 세번째 걸음 ; 대본쓰기

by 박워너비 2020. 5. 15.

~스크립트 만들기~

 

세트장과 배우, 소품이 준비됐으면

이제 대본을 써야한다.

프로그램에서 대본이란 스크립트, 즉 코드를 써서

저장하는 것을 뜻한다.

 

유니티는 기본적으로  C#언어를 사용한다. 이미지 파일처럼 에셋 폴더에 만들고,불러오고,내보내는 것이 가능하다.

 

여기서부터가 사실 진짜 유니티를 사용한 게임개발이고

진짜 공부가 필요한 부분이라고 할 수 있겠다.

유니티를 잘 다루려면 크게 3가지를 잘 알고 있어야하는 데

그 세가지 항목은 다음과 같다.

 

 

  • 유니티 에디터 사용법
  • 절차중심 언어의 문법
  • 객체지향 언어의 개념

 

이렇게 알아야 할것이 많다보니

상당히 진입장벽이 높다.

 

위에서 말하는 절차중심이라는 건

C#의 문법또한

C언어의 문법처럼 위, 그리고 왼쪽에서부터

문법 규칙을 읽어나가며 프로그램이 실행되는데

이 개념이 유니티 코딩에도 쓰인다는 말이고

 

*이를테면 C언어의 조건문, 반복문 개념처럼.

 

객체지향형이라는 말은 코딩을 통해서

유니티 프로그램에 내장된 데이터와 기능을

불러오고 건드린다는 말이다.

 

*객체 라는것이 대상을 뜻하는 것이다.

여기서 말하는 대상은 코딩의 대상을 뜻하는 것.

 

유니티에서 만든 게임 캐릭터와 맵을 이용해서

연출을 하고 게임 규칙을 만들 것이니 유니티 프로그램에

내장된 데이터와 기능을 사용해야하는 것은 당연하고

그런 것을 건드리는게 객체지향 개념이다.

 

이 3가지를 각각 하나씩 전문적으로 아는것도

물론 좋겠지만 그렇게 하는건 시간이 너무 오래걸리고,

사실 유니티의 스크립트 안에는 저 3가지 개념이 다 섞여있기때문에

지금부터 각각의 개념이 필요할때마다 조금씩 알아가면서

게임을 만들어보도록 하자.

 

 

https://visualstudio.microsoft.com/ko/downloads/

 

Windows 및 Mac용 Visual Studio 2019 다운로드

Visual Studio Community, Professional 및 Enterprise를 다운로드하세요. 지금 Visual Studio IDE, Code 또는 Mac을 무료로 사용해 보세요.

visualstudio.microsoft.com

 

코딩을 하는 것은 물론 무엇으로 하든 상관없지만

유니티는 마이크로소프트가 무료로 제공하는 비주얼 스튜디오와 연동이 된다.

구글에 비주얼 스튜디오만 검색해도 위처럼 다운로드를 받을 수 있으며

유니티 에디터의 에셋폴더에서 스크립트파일을 더블클릭하면 자동으로 

비주얼 스튜디오를 통해 파일이 열린다.

 

기본 스크립트 창의 틀

 

유니티 에디터를 통해 스크립트파일을 만들고 열게되면

처음에는 이런 창이 뜨게된다.

생각보다 별거 없어보이면서도 뭐가 뭔지 모르겠는 그런 창이다 ㅋㅋㅋ

먼저 명령문을 쓰기위해 필요한 부분들부터 차근차근 살펴보자.

 

 

먼저 퍼블릭 클래스다.

파란색으로 표시 돼 있는 것은 문법과 관련된 것으로

철자가 하나라도 틀리면 오류가 나게된다.

대소문자도 구분해야하니 주의하도록 하자.

 

 

 

* 이렇게 에디터 상에서 스크립트 파일의 이름을 abc라고 바꿔줬다.

다시 스크립트 파일을 열어서 확인해보자.

 

사진을 누르면 동작이 이어집니다.

 

파일 속의 퍼블릭 클래스 옆에서는 이름이 바뀌지않아

수정 메시지가 뜨는 것을 확인할 수 있다.

파일 이름을 퍼블릭클래스명으로 바꿔주거나

퍼블릭클래스명을 현재 파일이름으로 바꿔주는

두가지 선택지가 뜨는 것 또한 확인할 수 있다.

 

이처럼 퍼블릭 클래스란 해당 스크립트 코드의 명령문을

모아놓은 묶음이라는 뜻이다.

이는 퍼블릭이 공용, 클래스가 학급(반)을 뜻한다는 것을

생각해보면 납득이 가는 설명이다.

 

 

 

비주얼 스튜디오같은 코딩도우미를 사용하면 좋은것이 

사진처럼 구조를 한눈에 보이게 자동으로 표시해주는 점이다.

해당 스크립트는 퍼블릭 클래스라는 가장 큰 묶음 아래에 

가장 큰 중괄호로 묶여있고

 

그 안에는 void Start ()와 void Update()라는

2개의 함수가 또다시 작은 중괄호로 묶여서 들어있는 것을 확인할 수 있다.

 

//을 치고 초록색으로 표시된 부분은 주석으로 해당 부분은 스크립트를 작성하고

열어보는 사람들을 위한 설명들을 적기위해 있는 기호로

실제 프로그램이 돌아가는데에는 아무런 영향을 미치지않는다.

 

각각의 함수위에 설명으로도 나와있지만

Start함수는 안에 들어가는 명령문을 처음 시작할 때 한번만 실행하는 함수다.

Update함수는 안에 들어가는 명령문을 매 프레임마다

한번씩 반복해서 실행하는 함수다.

 

프레임 개념을 설명하는 사진

 

프레임(Frame)이란 사진 한장을 뜻하는 것으로

처음 영화를 만들때 여러장의 사진을 연속적으로 보여주는 원리를 

활용하던 것에서 단위의 유래를 찾을 수 있다.

 

 FPS란 Frame Per Second의 줄인말로 

초당 몇개의 사진을 연속으로 보여줄 것인지를 뜻하는 것이다.

일반적인 정의에서 60FPS는 1초로 

1초에 60장을 연속으로 보여준다는 뜻.

 

바꿔말하면 1프레임은 60분의 1초로 생각할 수 있다.

 


~즐거운 C#언어 공부~

 

지금부터는 유니티에서 스크립트를 만들기위해 알아두면

좋은 C언어 지식들에 대해서 알아보도록 하겠다.

 

오늘 알아볼 것은 변수,조건문,반복문 개념이다.

 


1. 변수 (Variable)

 

 

변수는 흔히 상자에 비유되곤 한다.

코딩에서 변수가 하는 역할이 상자의 역할과 많이 닮았기 때문이다.

 

흔한 변수선언

 

변수는 해당 기호에 데이터를 담고 옮기는 역할을 한다.

데이터의 종류와 양이 존재하기때문에 변수에도 자료형이라는 개념이 존재하는데

따라서 처음 변수를 컴퓨터에게 선언해줄 때에는 위 사진처럼

 

자료형 변수명;

 

이런 형식으로 이것이 변수임을 컴퓨터에게 알려줘야한다.

자료형은 데이터의 종류에 따라 크게

 

정수를 담는 int

실수를 담는 float

문자들을 담는 string

*string 으로 선언된 변수에 문자를 담을 때는 구분을 위해 " "을 두르고

담아줄 문자를 적어줘야한다.

참 거짓 판정을 담는 bool이 있다.

 

 

변수가 상자와 같은 역할을 하기때문에 수학의 약속과는 다른,

컴퓨터 언어에서의 새로운 약속이 생기게 되는 것이다.

수학이라면 이미 a = 31이기 때문에 a = a + 1이 될 수 없다.

하지만 컴퓨터에서는 그저 a에 a변수 값에 1을 더해서 다시 담으라는

명령문으로 약속됐기 때문에 위와같은 형식도 틀린 것이 아니다.

 

변수를 활용해서 연산을 할때도 컴퓨터에서만 쓰는 몇가지 규칙들이

존재하니 간단하게 알아보고 넘어가도록 하자.


1. +.-는 수학에서와 같은 뜻으로 쓰인다.

( 그러나 stiring 변수에 대해 사용될 경우에는, 숫자를 넣더라도 문자로

처리하기때문에 계산을 하는 것이 아닌 붙여서 쓰는 것으로 표시된다.)

예 : stiring a="1";

                "1" + "1" = "11";

 

2. 곱하기와 나누기는 각각 * / 기호를 사용한다.

3. 곱하기와 나누기를 할 때에는 자료형이 다른 경우 연산결과의

자료형이 바뀌기도 하니 주의해야한다.

예 : 실수 * 정수 = 실수

 

4. ++ --는 증감연산기호로 1씩 더하고 빼주는 것이 가능하다.

 

5.  자기 자신을 한번 더 써주는 연산의 경우 *= 같은 형식으로 축약이 가능하다.

예) a *= 1 은 a = a * 1 과 같은 뜻이다.

 


자, 이제 다시 유니티 코딩창으로 넘어와 보자.

유니티 코딩창에는 퍼블릭 클래스 안 영역과

스타트,업데이트 함수 안 영역으로 나누어졌었다.

 

퍼블릭 클래스 안의 영역에서 변수를 선언하는 경우 그 변수를

멤버변수(보편변수)라 부르며 해당 스크립트 안에서는 어디서든지 

해당 변수를 사용해서 명령문을 작성할 수 있다.

 

반면 특정 함수 안에서 변수를 선언하게 되면 그 변수는 로컬변수(지역변수)라

부르며 해당 함수 안에서만 그 변수를 사용할 수 있다.

 

기본적으로 C#언어는 C언어를 참고하기때문에 C언어처럼 순서와 절차가 

중요하다. 따라서 위와 왼쪽에서부터 명령문을 읽어나가기때문에

어떤 변수를 사용하고 싶으면 그 명령문보다 위에, 그리고 왼쪽에서

미리 변수가 선언되었어야한다.

 

 


2. 조건문(If)

 

 

조건문은 특정 조건에 맞으면 실행하고 아니면 실행하지 않는 식의

명령의 갈래를 정해줄 수 있는 명령문이다.

 

마찬가지로 스타트 함수와 업데이트 함수 어디서든 사용될 수 있으며

어디서 쓸지는 용도에 맞게 결정하면 된다.

 

 

 

조건문의 형식은 위와 같다.

먼저 변수가 선언되어 있어야하며 if ( )의 괄호 안에 그 변수와 관련된

판단식을 집어넣는다. 판단식의 종류는 여러가지로 몇가지를 여기서 살펴보자.

 


1.  변수 == 데이터 

변수가 데이터와 같은지 판단하라

 

2. 변수 >= 데이터

변수가 데이터보다 크거나 같은지 판단하라

 

3. 변수 <= 데이터

변수가 데이터보다 작거나 같은지 판단하라

 

4. 변수 != 데이터

변수가 데이터와 다른지 판단하라

 


if()뒤의 { } 안에는 판단한 내용이 참이면 무엇을 할지를 적을 수 있다.

 


else if( ) { }

 

조건을 좀 더 세분화하고싶다면 else를 사용할 수 있다.

단순히 else만 써준다면 판단식에서 판단한 결과가 거짓일 때

무엇을 할지를 적어줄 수 있고

 

else if (){ }를 써준다면 첫번째 판단식결과가 거짓일때 두번째

판단을 하도록 2중 구조를 짜줄 수도 있다.

 


3. 반복문(Repeat)

 

 

반복문은 어떤 작업을 반복적으로 컴퓨터에게 시키고싶을때 쓰는

명령문으로 Switch문과 For문 두 종류가 있다.

먼저 Switch문부터 살펴보자.

 

 

조건문과 마찬가지로 먼저 변수가 선언돼 있어야하며

switch ()의 괄호안에 변수명이 나오고 밑의 case에 따라 일치하는

케이스에 적힌대로 반복을 실행한다.

break; 을 쳐주면 반복을 끝내줄 수 있다.

 

case 값:

(case뒤에 공백을 줘야함)

으로 작성해줄 수 있고

default는 아무 케이스에도 해당되지 않을때의

작업을 설정해줄 수 있다.

 

마지막으로 For문이다.

switch문보다 좀더 단순하다.

for(변수=초기값;이 조건일 때 실행;조건과 맞지않으면 이대로 반복)

{   조건에 맞는 순간 실행할 명령   }

 

이런 구조로 이루어져있다.

 


~ 객체 사용하기 ~

 

C#언어는 비단 유니티뿐만 아니라 다양한 용도로 활용이 된다.

설명이 길어지느라 잊었을지도 모르지만 우리는 게임을 만들기 위해

이 공부를 하고있다.

 

위에서 배운 변수 조건문 반복문의 명령문으로 명령을 쓰는 건 알겠는데

그 명령으로 유니티에 있는 데이터와 기능들을 불러와서 명령문을 완성해야한다.

 

객체,메서드,속성 개념을 살펴보고 대본과 명령문을 완성해보자.

 

 

객체는 코딩 대상 프로그램의 데이터,기능들이다.

 

메서드(method)는 방법,체계라는 뜻으로

특정 기능을 가지고 있는 함수들을 뜻한다.

 

앞서 살펴본 Start와 Update도 유니티의 메서드 중 하나다.

 

 

속성은 해당 객체가 갖는 데이터 값을 뜻한다.

해당 객체의 이름이나 위치,크기 등이 해당될 수 있다.

 

 

 

Debug.log("  ");

 

아까부터 반복적으로 나오던

이 문장을 객체,메서드,속성 개념으로

알아보자.

 

Debug라는 명령문은

버그를 잡으라는 뜻을 가진 클래스다.

*클래스는 변수와 메서드를 묶어둔 것을 뜻한다. 

여기서는 하나의 객체로 받아들이면 된다.

 

.log는 Debug에 딸린 메서드로

유니티 에디터의 Consol(제어탁) 창에,

(" ")안에 들어간 내용을

기록(log)하라는 뜻이다.

 

이처럼 유니티 c#에서는 

 

객체.속성

 

객체.메서드

 

형식으로 객체를 작성하고 나타낸다.

속성은 보통 명사이며 메서드는 보통 동사이다.

 

 

이렇게 C# 명령문과 객체기호를 알면

유니티 에디터의 게임 오브젝트와

컴포넌트들을 호출해서 대본을 작성할 수 있는 것이다.

 

따라서 앞으로 공부하게 될 내용들도 명령문에는 어떤 것들이 있고

객체기호와 그에 대응되는 컴포넌트들에는

무엇이 있는지를 배우는 것이

주가 될 것이다.

 

이렇게 배워나가는 것이 늘어감에 따라 게임에서 

구현할 수 있는 기능들도 늘어날 것이다.

 

이제 간단하게 W를 누르면 로봇이 앞으로 움직이는 대본을 작성해서

앞에서 배운 내용들을 정리해보고 마무리하자.

 

 

 

인스펙터 창에서는 게임오브젝트가 가진 다양한

특성들(컴포넌트들)을 확인할 수 있다.

이동과 관련된 속성은 변환(트렌스폼)에 있는

위치(포지션)속성으로 좌표를 바꿔주면 이동할 수 있다.

 

 

최종적으로 완성된 대본이다. 하나씩 구성요소를 살펴보자.

(*대소문자 구분에 주의하자!)

먼저 W키를 꾹 누르고 있으면 계속 앞으로 가게 하고싶었기 때문에 

반복실행되는 메서드인 Update 메서드를 이용했다.

 

W키를 입력받는다는 조건이 필요하므로 조건문 if() { }을 사용해 준 모습이다.

Input.GetKey(KeyCode.W) 부분이 판단식으로 들어갔다.

Input은 C언어의 Scanf_s()함수처럼 입력을 받는 객체다.

 

.GetKey()를 통해 입력 객체의 뒤에 어떤 키를 입력받는다는

속성이 따라달리는 것을 확인할 수 있다.

KeyCode.자판

을 통해 드디어 원하는 자판을 입력받을 수 있다.

 

판단식이 완성됐으니 W를 눌렀을 때 어떤 명령을 실행할 것인지를

{ }안에 적어줘야한다.

 

this.transform.Translate( )

 

this는 이 대상을 지정하라는 명령이다.

해당 대본을 어떤 게임오브젝트에 넣을지 지정해줄 수 있는데

그때 해당 게임 오브젝트가 this가 된다.

 

transform은 앞서 살펴봤듯 게임오브젝트의 대표적인 컴포넌트였다.

Translate()는 유니티의 이동 메소드로

수학에서 도형의 평행이동 또한 영어로 Translate라고 공식용어가 그렇다.

우리가 아는 그 번역이라는 뜻의 단어가 맞다.

좌표를 바꿔줌으로써 이동하기때문에 꽤 적절한 이름이라고 할 수 있다.

 

( ) 안에는 new Vector3(0,0,4*Time.deltaTime)을

넣어줬다. Vector3은 아시다시피 3차원공간이라 그렇고

괄호안에 오는 좌표는 한번 이동하는 거리를 지정해준 것이다.

 

Time.deltaTime을 곱해준 것이 눈에 띄는데 이것은 

갱신규칙을 시간기준으로 바꿔주는 명령어로

기존 업데이트 함수의 프레임당으로 설정할 경우

기기의 성능에 따라 속도가 달라지지만 시간을 기준으로 갱신하면

어떤 기기에서 구동하든 똑같은 속도로 움직인다.

 

 

자 이제 스크립트를 로봇에 넣어주고 W를 눌러보자.

 

 

사진을 누르면 동작이 이어집니다.

 

Wa! 움직인다!

 

 


비슷한 글 더 찾아보기

 

https://bakwannabe.tistory.com/24

 

개발엔진 글 찾기

개발엔진 서랍에 있는 글들을 찾기 쉽게 모아놓는다. 1. 알만툴 알만툴 공부 도움자료 2. 유니티 0. 유니티 공부 도움자료 1. 설치와 화면 구성이해 2. 게임 오브젝트와 텍스쳐링 3. 스크립트 작성 �

bakwannabe.tistory.com


글쓴이의 다른 페이지

https://blog.naver.com/oenbins

 

경험과 생각 : 네이버 블로그

두근거림,자유로움,다 함께

blog.naver.com

https://www.youtube.com/channel/UCCeTlPNllYS48EOMmnErKRw?view_as=subscriber

 

박워너비

게임탐구와 게임개발 컨텐츠를 다루는 채널!

www.youtube.com