내일배움캠프 62일차 TIL - 코루틴

권태하·2024년 7월 16일
0
post-thumbnail
post-custom-banner

확인 문제

1. InvokeRepeating을 통해 반복 실행 중인 메서드는 오브젝트를 비활성화하면 멈출까요?

내 답:
네. 멈춥니다.

모범 답:

2. Coroutine을 통해 반복 실행 중인 메서드는 오브젝트를 비활성화하면 멈출까요?

내 답:
아니오. 멈추지 않습니다.

모범 답:

3. 다음 Coroutine 코드의 성능 상 문제는 무엇이 있을까요? (Hint : 메모리)

IEnumerator Fade()
{
    Color c = renderer.material.color;
    for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
    {
        c.a = alpha;
        renderer.material.color = c;
        yield return new WaitForSeconds(.1f);
    }
}

내 답:

모범 답:

4. Unity의 Coroutine은 비동기 동작일까요? 비동기 동작이라면 하나의 스레드에서 동작하지 않는걸까요?

내 답:
유니티의 코루틴은 기본적으로는 하나의 스레드로 동작하는 동기라고 볼 수 있습니다.

모범 답:

설명 문제

1. 코루틴의 동작원리와 사용해본 예시를 함께 설명해주세요.

내 답:
코루틴의 동작원리는 yield return을 통해 처리를 양보하는 것입니다. 저는 코루틴의 yield return WaitForSeconds를 통해 적이 죽은 후 몇 초 뒤에 이벤트가 발생하도록 설정했던 적이 있습니다.

2. Invoke와 코루틴의 차이에 대해 설명해주세요.

내 답:

모범 답:

3. 코루틴과 멀티쓰레딩은 어떤 차이가 있는지 설명해주세요.

내 답:

모범 답:

실습 문제

💡 [스크린샷 기능 만들기]

스크린샷을 찍어 파일로 저장하는 코드를 다음과 같이 작성했습니다.

private void ScreenCapture()
{
    // 스크린샷을 저장하기 위한 텍스쳐 생성
    Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);

    // 스크린의 픽셀을 텍스쳐에 적용
    texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    texture.Apply();

    // 텍스쳐를 PNG로 저장
    byte[] bytes = texture.EncodeToPNG();
    System.IO.File.WriteAllBytes(Application.dataPath + "/Screenshot.png", bytes);

    Destroy(texture);
}

이를 평소와 같이 호출했는데,

private void Start()
{
    ScreenCapture();
}

렌더링 처리가 완료되지 않은 시점에서 ReadPixels()를 호출하여 에러가 발생합니다.

따라서 내가 스크린샷을 요청한 타이밍(프레임) 중에서도,
렌더링이 완료된 시점에 ScreenCapture() 함수가 호출되어 에러 없이 스크린샷을 저장할 수 있도록 코드를 작성해주세요. (HINT : 코루틴 사용)

using UnityEngine;
using System.Collections;

public class CaptureScreenshot : MonoBehaviour
{
    private void Start()
    {
        // TODO : 렌더링을 마친 뒤에 ScreenCapture를 호출해주는 코드 작성 
        
    }

    // TODO : 필요하다면 추가적인 메서드 작성
    
    //

    private void ScreenCapture()
    {
        // 스크린샷 저장을 위한 텍스쳐 생성
        Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);

        // 스크린 내용을 텍스쳐로 읽어들임
        texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        texture.Apply();

        // 텍스쳐를 PNG로 저장
        byte[] bytes = texture.EncodeToPNG();
        System.IO.File.WriteAllBytes(Application.dataPath + "/Screenshot.png", bytes);

        Destroy(texture);
    }
}



profile
스터디 로그
post-custom-banner

0개의 댓글