2 minute read

Coroutines

코루틴은 한번에 다 처리하지말고 시간을 들여 처리할 일이 있을 때 쓰는 방법이다.

작동 방법

코루틴은 IEnumerator를 return한다.
IEnumerator는 System.Collections에 있는 namespace로 yield로 return하며 반복작업을 할 때 사용됩니다.
코루틴은 안에 있는 로컬 변수들이 yield한 동안에도 유지되어야 하기에 다른 메소드 처럼 스택이 아니라 따로 힙에 저장된다. 힙을 사용해서 메모리를 활용하기에 너무 많은 코루틴을 생성하면 힙은 할당하는 시간이 더 오래 걸리기에 성능에 안좋은 영향을 끼칠 수 있다.
그래서 코루틴이 종료되지 않고 계속 진행될 경우 차라리 update에서 해당 반복을 실행하는 것이 현명하다.

사용법

 StartCoroutine(FadeAndLoadSceneRoutine());

이렇게 실행시키고

IEnumerator FadeAndLoadSceneRoutine()
   {
       float alpha = 0f;
       while (alpha < 1f)
       {
           alpha += fadeSpeed * Time.deltaTime;
           fadeCanvasGroup.alpha = alpha;
           yield return null;
       }
       yield return new WaitForSeconds(0.5f);
       SceneManager.LoadScene(sceneToLoadIndex);
   }

이렇게 만든다.
yield로 return하면 한 frame이 끝나고 해당 코루틴안에 실행할게 남아있으면 코루틴으로 돌아온다.
yield return은 코루틴안의 실행을 멈추고 유니티에게 권한을 넘겨주는 것이다.
yield return 뒤에 오는 내용은 언제까지 멈출지를 나타내는 것으로 이 조건이 만족할 때 까지 유니티는 다른 코드를 실행한다.

StartCoroutine(coroutine);

이걸로 정지 시킬 수도 있다.
코루틴 스크립트가 적용된 GameObject를 SetActive로 꺼버리거나, Destroy 해도 정지된다.


yield return 값들

null : Update 끝나면 실행 WaitForEndOfFrame : 한 프레임이 종료되고 화면 렌더링이 끝났을 때 new WaitForSeconds(.1f) : timeScale상 시간이 흐를때까지 WaitForRealTime() : 실제 시간이 흘렀을 때 WailtUntil(bool) : 해당값이 true 일때 WaitWhile(bool) : 해당 값이 false일 때 StartCoroutine() : 이 안에서 실행한 다른 코루틴이 종료될 때

추천되는 사용 경우

  1. 성능에 크게 구애받지 않는 경우(턴제 게임 등)
  2. fading out을 하며 다음 scene으로 로드될 때
  3. http 데이터 전송, I/O 등 병렬적 일처

OOP (오브젝트 오리엔티드 프로그래밍)

낮은 결합도 : 해당 코드에 의존하는 코드들을 줄이자
높은 응집도 : 해당 코드에 꼭 활용되는 코드만 넣자

SOLID 원칙:

S : Single Responsibility Principle (단일 책임 원칙)

하나로 묶일수 있는 애들은 하나의 클래스로 묶어놔라

O : Open Closed Principle (확장에는 열려있고, 수정에는 닫혀있게 한다)

상속은 하기 좋게, 원본인 부모는 자식이 수정하지 못하게 해라

L : Liskov Substitution Principle (리스코프 치환원칙)

자식은 부모로 교체할 수 있어야한다.
자식이 method를 override할 때 base.method 해서 부모의 원본 함수 내용을 무시해야할 상황이면 부모를 잘못 정한거다.
부모의 기능은 자식에서 모두 돌아가게 해야한다

I : Interface Segregation Principle(인터페이스 분리 원칙)(유니티에서 선언하는 클래스 부모로 쓰이는 Interface 그거 맞음)

인터페이스 입장에서의 단일 책임 원칙
묶일 수 있는 기능은 하나의 인터페이스로 묶고 기능이 다르면 인터페이스를 나눠라

D : Dependency inversion principle(의존 역전 원칙)

Class를 참조할 때 직접 참조하지 말고 부모를 참조해라

디자인 패턴

컴포넌트 패턴 : 오브젝트 만들어서
컴포지션 패턴 : 다양한 오브젝트를 유니티에 넣는일
싱글톤 패턴 : 하나만 존재하게 “싱글” 하게 만드는 일
오브젝트 풀링 패턴 : 오브젝트를 pool로 관리
옵저버 패턴 : 이벤트로 계속 지켜보다가 인풋이 들어오면 실시하는 방식
전략 패턴 :
상태 패턴 :

Unity

interface 쓸 경우 :

다중 상속이 가능한 내용을 만들 때
그니까 여러 클래스에서 이 기능을 써야할 때 등 기능만이 필요할 때 쓴다.
반대로 Class는 객체로 만들 필요가 있을 때 쓴다.