코루틴, 카메라 뷰

이준호·2024년 1월 18일
0

📌 코루틴

코루틴은 하나의 작업을 다수의 프레임에 분산할 때 사용한다.
예를 들어, 투명하게 만들고 싶은 게임오브젝트에 대한 메소드거 있다고 생각해보자.

void Fade()
{
    Color c = spriteRenderer.color;
    for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
    {
        c.a = alpha;
        spriteRenderer.color = c;
    }
}

void Start(){
		Fade();
}

위와 같이 작성할 경우 결국 플레이어가 만나게 되는 화면은 알파가 0일 때 뿐이다.
하지만 알파가 0.9 0.8 0.7... 순차적으로 내려가고 싶게했던 프로그래머의 순수한 의도를 볼 수 있을 것이다.

코루틴은 유니티에서 비동기적인 작업을 수행할 수 있게 해준다.
코루틴은 함수의 실행을 일시 중지하고, 이후에 다시 재개할 수 있는 기능을 제공한다.


<코루틴의 대강의 흐름>

예를 들어, 아래의 코드는 1초마다 "Hellow, World!"를 출력하는 간단한 코루틴을 보여준다.

using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    IEnumerator Start()
    {
        while (true)
        {
            Debug.Log("Hello, World!");
            yield return new WaitForSeconds(1f); 
        }
    }
}

위의 코드에서 Yeild return new WaitForSeconds(1f); 부분은 코루틴을 1초동안 중지시키는 역할을 한다. 이렇게 함으로써 코루틴은 지정된 시간 간격으로 반복적인 작업을 수행할 수 있다.

코루틴은 복잡한 비동기 작업, 예를 들어 네트워크 통신이나 애니메이션 재생과 같은 작업에 유용하게 사용될 수 있다. 코루틴을 통해 코드의 가독성과 유지보수성을 향상시킬 수 있다.

➔ 예시

다음은 코루틴을 사용하여 플레이어를 일정 시간동안 무적 상태로 만드는 예시이다.

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{
    bool invincible = false;

    void Start()
    {
        StartCoroutine(InvincibilityCoroutine());
    }

    IEnumerator InvincibilityCoroutine()
    {
        invincible = true;
        yield return new WaitForSeconds(5f);
        invincible = false;
    }
}

위의 예시에서 StartCorutine(InincibilityCoroutine()); 부분은 InvincibilityCoroutine 코루틴을 시작하는 역할을 한다. 이 코루틴은 플레이어를 5초 동안 무적상태로 만들고, 이후에 다시 무적 상태를 해제한다.

➔ IEnumerator

Enumerator는 IEnumerator 라는 인터페이스를 구현해야 한다. IEnumerator 인터페이스는 Current(속성), MoveNext() (메서드), Reset() (메서드) 등 3개의 멤버로 이루어져 있는데, Enumerator가 되기 위해서는 Current와 MoveNext() 를 반드시 구현해야 한다.

이를 통해 유니티 DelayedCallManager가 등록하고 있다가 다음 단계에 실행하는 방식으로 구현되어 있다.

➔ Yeild return

  • yield return null : 다음 프레임까지 대기

  • yield return new WaitForSeconds(float) : 입력한 초(sec) 만큼 대기

  • yield return new WaitForSecondsRealtime(float) : Timescale영향없는 실제 시간 기준 초 대기

  • yield return new WaitFixedUpdate() : 다음 프레임의 FixedUpdate 까지 대기

  • yield return new WaitForEndOfFrame() : 모든 랜더링 작업이 끝날 때까지 대기

  • yield return startCoroutiune(string) : 입력한 다른 코루틴이 끝날 때까지 대기

  • yield return new www(string) : 입력한 웹 통신 작업이 끝날 때까지 대기

  • yield break : 코루틴 종료

➔ 코루틴의 종료

코루틴은 StopCoroutine과 StopAllCoroutines를 이용하여 코루틴을 정지가능하며, 코루틴을 소유하고 있는 게임 오브젝트를 정지하거나 파괴하는 경우에도 종료된다. 단, 컴포넌트를 .enabled를 false로 하는 경우 꺼지지 않는다.












📌 카메라 뷰

카메라 뷰는 플레이어들에게 게임을 보여주는 창과 같은 역할을 한다. 이를 통해 유저들은 더욱 몰입하거나, 특정한 대상에 집중하거나 할 수 있는 등, 경험이 많이 변화하게 된다. 어떤 뷰들이 있는지 아래에 종류별로 나열해보았다.

➔ 탑다운

(2D, 3D : X축 45도 이상)

➔ 사이드(온)

원근법 무시(2D, 3D : Orthographic, 캐릭터 follow)

➔ 1인칭 주인공 시점

(주로 3D, 캐릭터 Follow)

➔ 3인친 백뷰(숄더뷰)

(3D, 주로, 캐릭터 후방 상공에서 X축 살짝 회전)

➔ 아이소메트릭(쿼터뷰)

(원근법 무시 + x축 30도 y축 45도)

Camera Component (Projection)

  • Prespective (보통의 카메라 시야 원근법)

  • Orthographic (원근법이 없음. 직육면체의 카메라 시야각)

profile
No Easy Day

0개의 댓글