본문 바로가기

유니티 개발 정보/프로그래밍

유니티에서 Static IEnumerator 호출하기

원문보기

유니티에서 Static IEnumerator 호출하기


모든 프로그래머들이 작업을 하다보면, 장소에 구애받지 않고 원하는 곳에 자신이 필요한 함수를 호출하고 싶은 순간이 반드시 올 것이다. 이를 해결하기 위한 멋진 방법은 static 함수를 사용하는 것이다. 우리가 매일 사용하는 MonoBehaviour에서 볼 수 있는, Input.GetButton 또는 이와 유사한 모든 변종은 손쉽게 어디서나 사용할 수 있는 static 함수의 좋은 예라고 볼 수 있다.
당신이 만들어야 하는 인스턴스들 있고, 이 인스턴스들 중에서 몇몇 인스턴스는 IEnumerator타입이 될 수도 있을 것이다. 예를 들어, 플래쉬 라이트를 만드는 스크립트를 만들었고, 여러 다른 스크립트에서 플래쉬 라이트를 호출해야할 필요가 있을 것이다. 아마 반복된 '인스턴스'라는 단어에서 다음에 등장할 내용의 대한 단서를 찾았을 지도 모른다.
문제는 C#의 IEnumerator타입을 실행하는 유니티의 특별한 함수 StartCoroutine()에 있다. StartCoroutine()은 non-static 함수이며, static 함수에서 사용될 수 없다. 그렇다면, 우리는 무엇을 해야하는가? 이 IEnumerator은 꽤 중요하기 때문에, 당신은 이를 static으로 만들어야 한다!
(역자 주: 여기서는, non-MonoBehaviour 스크립트에서 다른 스크립트에있는 Static 코루틴함수를 호출할 수 없는 것과 static 함수에서 StartCoroutine을 호출할 수 없는 문제점에 대해서 언급하고 있는 것 같습니다.)

나는 스크립트를 보여 줄 것이다. 싱글톤으로 되어있는 간단하고 멋진 스크립트이다.  여기서 싱글톤에 대한 설명은 다루지 않겠다. 아마 검색을 하면 굉장히 좋은 글들을 손쉽게 찾을 수 있을 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using UnityEngine;
using System;
using System.Collections;
 
public class StaticCoroutine : MonoBehaviour {
 
    private static StaticCoroutine mInstance = null;
 
    private static StaticCoroutine instance
    {
        get
        {
            if (mInstance == null)
            {
                mInstance = GameObject.FindObjectOfType(typeof(StaticCoroutine)) as StaticCoroutine;
 
                if (mInstance == null)
                {
                    mInstance = new GameObject("StaticCoroutine").AddComponent<StaticCoroutine>();
                }
            }
            return mInstance;
        }
    }
 
    void Awake()
    {
        if (mInstance == null)
        {
            mInstance = this as StaticCoroutine;
        }
    }
 
    IEnumerator Perform(IEnumerator coroutine)
    {
        yield return StartCoroutine(coroutine);
        Die();
    }
 
    public static void DoCoroutine(IEnumerator coroutine)
    {
         //여기서 인스턴스에 있는 코루틴이 실행될 것이다.
        instance.StartCoroutine(instance.Perform(coroutine));    
    }
    
    void Die()
    {
            mInstance = null;
            Destroy(gameObject);
    }
 
    void OnApplicationQuit()
    {
        mInstance = null;
    }
}


본질적으로, DoCoroutine()가 호출될 때, 새로운 게임 오브젝트와 새로운 instance가 생성되고, 이곳에 static IEnumerator가 삽입되어 실행되는 방법이다. 추가적인 Get, Die, OnApplicationQuit함수를 통해 간단히 스크립트가 올바르게 인스턴스되고, 실행이 끝나고 오래동안 머물지 않도록 보장한다.

다른 스크립트에서 DoCoroutine()을 호출하기 위해서는:
(역자 주 : 만약 다른 스크립트가 MonoBehaviour를 상속받았다면 StartCoroutine()를 써도 무방합니다.)
1
StaticCoroutine.DoCoroutine(MyScript.MyStaticCoroutine());