Unity 게임 개발

[Unity]Coroutine(코루틴)으로 게임안에서 시간의 흐름 사용하기

녹차맛고양이 개발강좌 및 IT리뷰 2017. 11. 14. 16:48

게임을 만들때 자체적으로 시간을 가지고 싶을때 이용하시면 됩니다.


예를 들면 게임에서 5초가 흐를때마다 이벤트가 발생하거나

30초가 지나면 게임에서는 1년이 지난다는 식입니다.




일단 유니티를 틀어서 Main Scene을 저장하고

C#스크립트를 하나 만들어 줍니다.

저는 MainScript라고 생성했습니다.

그리고 시간이 1초마다 1씩 증가되는 것을 보여줄 Text박스를 만들기 위해 먼저

Hierarchy에서 우클릭 UI>Canvas를 만들어줍니다.


Canvas에서 우클릭후 Text를 눌러서 생성해줍니다.



일단 이 Text박스를 1second로 하겠습니다.



화면에 잘보이도록 폰트크기와 위치를 정합니다.

저는 크기는 20으로 했습니다.



이제 준비는 끝났고 스크립트를 더블클릭홰서 IDE를 켜줍니다.



IEnumerator Timer()
{
 yield return new WaitForSeconds(1f);
}

이것을 위처럼 추가해줍니다.


IEnumerators는 코루틴을 시작할때 실행시키는 부분입니다.

저는 이름을 Timer로 했습니다.


그리고

yield return new WaitForSeconds(1f);

이부분은 코루틴으로 실핼할때 1초후에 실행됩니다.

오늘 하는 부분에서는 이부분은 전부 1초로 통일합니다.



그리고 기존에 만들었던 구성요소를 이용하려면 보통 GetComponent를 이용해야합니다.

이것은 다른 강좌에서 자세하게 다루겠습니다.

일단은 쉽게 하는 방법으로 하겠습니다.



public Text OneSecondTXT;


앞에 Public을 붙여서 Text한개를 만들어줍니다.

Public을 붙이면 엔진에서 드래그엔드롭으로 지정이 가능해집니다.



int OneSecond=0;


또한 1초씩 증가시켜줄 변수를 하나 만들어줍니다.




void Update () {
OneSecondTXT.text = "" + OneSecond;
}


업데이트안에 변경된 값을 계속해서 보여줄 OneSecondTXT의 텍스트에 OneSecond를 넣어줍니다.


Update는 1프레임마다 실행되는 부분입니다.

.text는 오브젝트의 text를 변경하게  해줍니다.

또한 그냥 OneSecond 만 쓰는게 아니라  ""+OneSecond 이렇게 해야 쉽게 작성이 됩니다.



그리고 저장해줍니다.


이제 드래그엔드롭으로 텍스트박스를 지정해주고 

제대로 지정이 되었는지 확인하겠습니다



유니티로 돌아와서 Hierarchy에서 우클릭해서

Create Empty 눌러줍니다.


그리고 이름은 Mainmanager로 하겠습니다.


그리고 작성한 스크립트를 에셋에서 드래그해서

Hierarchy에 Mainmanager에 드롭하거나

inspector에 드롭합니다.



그리고 Mainmanager의 inspector를 보면 스크립트가 들어와 있습니다.

그리고 Public으로 만든 Text를 볼수있습니다.

여기에 Hierarchy에 있는 1second(Text)를 넣어 줄겁니다.


Mainmanager를 눌러서 Mainmanager의 inspector가 나오게 둡니다.

Hierarchy에서 1second를 드래그해서 Mainmanager의 inspector에 있는 스크립트의 One Second TXT에 넣어줍니다.



그리고 실행해줍니다.


이렇게 나온다면 잘하신겁니다.

일단 변수에 값으로 0을 넣어둬서 0이 나옵니다.


그러면 이제 1초마다 1씩 증가시켜보겠습니다.



void Start () {
 StartCoroutine("Timer");
 }


일단 시작할때 코루틴을 시작하기 위해서 

Start에 StartCoroutine("Timer");을 써줍니다.


IEnumerator Timer()

{ yield return new WaitForSeconds(1f); OneSecond =+ OneSecond; }


그리고 OneSecond를 1씩 증가시켜주기 위해서

Timer에 OneSecond =+ OneSecond;를 추가합니다.


저장을 하시고

한번 이상태에서 실행을 해보겠습니다.



1까지 증가하고 더이상 증가 하지 않습니다.


그이유는 시작할때 한 번만 실행이 되어서 입니다.


그렇다고 Update에 넣는 것은 비효율적입니다.

그래서 방법은 



IEnumerator Timer()
{
yield return new WaitForSeconds(1f);

OneSecond ++;
StartCoroutine("Timer");
 }


Timer안에서 마지막에 StartCoroutine으로 다시 Timer를 실행해주면 됩니다.


저장한후에

실행을 해주면



값이 계속해서 1초에 1씩 증가합니다.





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

응용은 곧 올리겠습니다.

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