강께르의 개발일지
[유니티] 20210930_수업 4일차 본문
거리 계산할 때, 이동한 량의 반을 체크하면 좋다.
예 : speed * Time.deltaTime * 0.5f;
오늘의 목차
코루틴
플러그인 중 하나 – ITween
코루틴
쓰레드란?
프로그램의 흐름이라고 하면 된다.
주된 프로그램의 흐름을 메인 루틴.
멀티쓰레드란?
프로그램이 동작하다가 다른 프로그램의 흐름이 또 생기는 거다.
다른 이야기로 메인 루틴이 있다가 다른 서브 루틴들이 많이 생성하는 것이다.
왜 이런게 필요한가?
메인 쓰레드 안에서 모든 일을 다 처리하는데
만약 그 안에 시간이 오래 걸리는 처리가 있다면
그만큼 쓰레드 안에서의 다른 일을 처리하는 게
딜레이 될 수 밖에 없다.
그래서 서브 루틴이라 불리는 쓰레드를 생성해서
업무를 분담해서 처리하는 것이다.
그 예로 네트워크를 분리하는 것. 사운드 재생. 시간 오래 걸리는 작업하고 쓰레드를 수거다.
하치만 유니티는 멀티쓰레드를 지원하지 않는다.
모두 메인 쓰레드 안에서 다 처리해야 해.
여담 :
CPU 입장에서는 한번에 한 코드를 실행하는 거이기에 똑같을 수도.
CPU가 일 처리하는 방식
CPU가 생각하는 1초랑 현실 인간의 1초랑 다르다.
겁나 빠르기 때문에.
CPU가 갖고 있는 1초 단위의 시간을 시분할을 한다.
그 시분할을 적절히 분배해서 동시 실행하는 것처럼 느껴진다.
만약 멀티쓰레드로 사용하다보면 메모리 때문에 어려움을 겪는다.
메인 쓰레드만 있으면 하나만 메모리에 접근하면 되는데
만약 멀티 쓰레드면 서브 루틴에서 같은 메모리에 접근해서
작업 처리가 다 끝나지 않은 상태에서 값이 변동되는 상황이 생길 수 있다.
그래서 이 메모리 접근에 대한 스케쥴 관리가 필요하다.
메모리 접근하고 사용하고 있다는 것을 알고 있다가
다 썼으면 다른 쓰레드가 처리할 수 있도록 접근한다.
하지만 한 쓰레드 안에서 무수히 많은 접근이 일어난다면?
그러면 다른 쓰레드가 계속 딜레이되는 현상이 일어난다.
그래서 코루틴은?
서브루틴을 만들 수 없는 유니티는
그거하고 비슷하게 쓰라고 만든 기능
싱글 쓰레드 안에서 멀티 쓰레드처럼 돌리는 방법이다.
코루틴 만드는 방법
Monobehavior를 상속받은 클래스들은 구현할 수 있다.
IEnumerator Co~~() 라고 만든다.
yield return을 사용
new WaitForSecond(sec) : sec 이따가 다시 메소드의 흐름을 진행한다.
0, null 다음번 실행은 다음 프레임, 다음 업데이트 실행 때 진행한다.
Update함수를 흉내 내려면 While문을 계속 돌려서 yield return null;을 하면 된다.
프레임마다 수행하려면 null을 이용하자.
사용하려면 StartCoroutine();을 써야한다.
매개변수로 코루틴 메소드이름을 문자열로 줘야한다.
하지만 메소드를 호출하는 형태로 대신 써라.
코루틴 메소드는 매개변수도 전달할 수 있다.
코루틴의 주인은 스크립트가 컴포넌트로 붙은 게임오브젝트이다.
만약 게임 오브젝트가 소멸되거나 비활성화되면 그와 같이 코루틴도 진행되지 않는다.
텀을 주고 작업하게 하는 것.
모든 작업이 끝나는 것을 보고 작업을 하는 것 느낌이라고 보면 된다.
진행 중에
yield문을 만나면 다른 일을 처리하고
다 끝나면 다시 코루틴으로 넘어와서 일을 처리하는 것.
반복구문으로 많이 사용된다.
여러 코루틴을 생성할 수 있다.
여러 코루틴 객체가 생성되는 것.
빈번한 생성을 하면 좋지 않긴 하다.
다른 메소드들
Time.timeScale : float 필드, 이를 기반으로 time을 결정. 1에 가까울 수록 현실 시간에 가까워진다. 0.5 -> 실제 1초, Time.deltaTime이 0.5초로
0 -> 실제 1초, Time.deltaTime을 1초로!
Time.time : 게임 시작 시간을 0초로 하여 시간이 계속 간다.
Time.realTimeSinceStartUp : 실제 시간
이를 이용해 시간을 느리게, 정지하게 할 수 있다.
Esc키 누르면 정지되어야하는 상황
UI에 deltaTime에 영향을 받지 않기 위해
realTime을 쓰는 경우가 있다.
yield return에 맞춰서 정지되게 했다가 다시 진행하게 할 수 있다.
WaitWhile(Func<>) : Func 델리게이트가 false되는 순간까지 다음 구문을 실행하지 않는다.
코루틴 안에 코루틴
코루틴 안에 yield return 코루틴이 끝나야 그 다음 구문을 실행하게 하는 방법이다.
순차적으로 코루틴을 진행할 수 있다.
Start() 메소드를 코루틴으로 구현하는 방법
yield문이 있는 코드와 Start() 메소드의 반환값을
IEnumerator로 하면 코루틴으로 만들 수 있다.
활성화/비활성화
지워지는 것과 구분해야 한다.
활성화 여부에 따라 Update() 메소드가 수행되지 않는 차이가 있다.
비활성화됐다는 것은 컴포넌트의 활성화 여부도 비활성화되었다는 것이다.
Start와 Update 메소드가 스크립트 내에 없으면 활성화 체크를 할 수 없다.
코루틴 멈춰!
StopAllCoroutine() 메소드
해당 게임 오브젝트에서 돌아가는 코루틴을 전부 중지한다.
StopCoroutine() 메소드
원하는 코루틴만 중지
코루틴을 멤버로 저장해서 그 코루틴을 매개변수를 넘겨주자.
중지한 다음에 멤버변수에 null을 할당해서 관리하자.
iTween
움직임, 회전, 색상 변화 등을 쉽게 해주는 것
유니티 기본 컴포넌트는 아니어서 다운받아서 사용.
함수나 매개변수는
도큐먼트를 참조하자.
SendMessage();
컴포넌트의 메소드 -> 메소드 이름으로 메소드 호출하는 방법이다.
게임오브젝트에 붙어있는 컴포넌트들마다 같은 이름의 메소드를 싹다 호출한다.
메소드가 없으면 에러가 나는데 옵션을 주는 것에 따라 오류를 내지 않을 수 있음.
하나까지 매개변수를 허용한다.
SendMessageUpwards는 본인 클래스를 수행하고 부모클래스까지 다 수행
BroadcastMessage는 본인 클래스를 수행하고 자식 클래스에 싹다 수행
transform.SetParent();
부모로 삼고픈 트랜스폼을 매개변수로
'프로그래밍 > 유니티' 카테고리의 다른 글
[유니티] 20211005_수업 7일차 (0) | 2021.10.06 |
---|---|
[유니티] 20211006_수업 8일차 (0) | 2021.10.06 |
[유니티] 20211001_수업 5일차 (0) | 2021.10.04 |
[유니티] 20210929_수업 3일차 (0) | 2021.10.01 |
[유니티] 20210927_수업 1일차 (0) | 2021.09.28 |