블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

앞서 정리한 스탑코루틴의 활용 1의 내용으로 개념을 잡고 넘어가자.

 

 

코루틴 호출은 script.StartCoroutine() 으로 호출하게 되어있고,

앞부분을 생략하고 StartCoroutine()으로 호출하면

자동적으로 콜링한 스크립트에서 제어하는 코루틴으로 호출되도록 되어있다.

 

즉 StartCoroutine( ~~~ ) 를 포함하여 코루틴을 호출하면 이 코루틴은 자신을 콜링한 스크립트가 달려있는 게임오브젝트에 할당되는 것이다.

 

이것이 적용되어 해당 게임오브젝트를 disable시키면,

그 게임오브젝트에 할당되어 돌아가던 모든 코루틴은 정지된다. (StopAllCoroutine의 효과)

 

 

 

 

 

<예시1>

 

 

위의 그림을 참고하자.

 

위 그림은 이런 상황을 거친 결과다

Scr Main===

 start()

{

StartCoroutine(A);

}

 

Scr Manager====

{

GameObj1.GetComponent<Scr Main>().StartCoroutine(B);

GameObj2.GetComponent<Scr Main>().StartCoroutine(B);

 

GameObj1.GetComponent<Scr Main>().StartCoroutine(C);

GameObj2.GetComponent<Scr Sub>().StartCoroutine(C);

}

 

1. Main 스크립트는 생성되면서 동시에 코루틴A를 호출한다. 그래서 Main 스크립트가 붙어있는 게임오브젝트1,2에서 각각 시작되었다.

 

2 Manager에서 게임오브젝트1의 Main에 B와 C를 호출했다. (타 오브젝트, 타 스크립트에서 호출한 경우 )

이 때는 Manager의 게임오브젝트에 할당되지않고 호출타겟을 찾아간다.

마찬가지로 게임오브젝트 2 에는 Main에 코루틴B를, Sub에 코루틴 C를 호출하였다.

 

그 결과 위의 그림처럼 코루틴이 붙어 있게 된 모양.

 

 

 

Q. 여기서 게임오브젝트1의 Main에서 올스탑 코루틴을 콜하거나, 게임오브젝트 1번을 disable하면 어떻게 될까?

A. 게임오브젝트1의 코루틴 A,B,C가 종료된다.

 

Q. 게임오브젝트2를 disable 한다면?

A. 게임오브젝트의 Main의 A,B와 Sub의 C가 모두 종료된다.

 

Q. 임오브젝트2의 Main에서 StopAllCoroutine()을 호출한다면?

A. 게임오브젝트2의 Main의 A,B만 종료되고 Sub의 C는 살아있다.

 

 

위 상황만으로도 어느정도 코루틴들이 어떤 오브젝트의 어느스크립트에 포함되어 돌아가는가 유추할수 있다.

어려운 부분이 있다면 비슷한 내용으로 테스트를 해보길 바란다.

 

 

 

 

이러한 내용을 설명한 이유는 

코루틴에는 정립해야할 내용이 하나 더 있기 때문이다.

 

코루틴이 어떤 스크립트에 매칭되어 있는가 머리속에 그려진다면 스크립트에서 다른오브젝트의 스크립트의 코루틴을 호출하여 가지고 있을수 있다는 것을 알수 있다.

 

 

예를 들면

Scr A에서 선언한 변수 co가 있다고 해보자. 

 

coroutine co = GameObj1.GetComponent<Scr Main>().StartCoroutine(B);

 

위와같이 변수에 다른오브젝트 코루틴을 담아두었다.

 

Q.이것을 멈추기 위해서 어떻게 하겠는가?

 

StopCoroutine( co );

라고 생각하기 쉽지만, 이렇게 멈추게 되면 (코루틴이 멈추긴 한다)  

 

Coroutine continue failure  라는 에러메세지 가 발생한다.

 

정확하게 멈추기 위해서는

 

GameObj1.GetComponent<Scr Main>().StopCoroutine( co );

 

과 같이 코루틴이 할당된 스크립트에서 스탑을 시켜줘야한다.

 

 

위의 에러메세지가 나타나는 이유는 다른스크립트에서 코루틴을 스탑시키면 코루틴은 멈추지만,

기존에 코루틴을 돌리고 있던 스크립트에서 다른동작을 하고 다시 코루틴을 찾아올때 (코루틴은 IEnumerator 로 돌아간다)

이미 코루틴이 사라져서 찾을수 없게 되기 때문인것 같다.

(정확한 이유를 알기 위해선 유니티 엔진 내부를 보아야 할것이다) 



출처: http://qits.tistory.com/entry/StopCoroutine-의-활용-2-Coroutine-continue-failure [Quiet, In The Storm...]

반응형
Posted by blueasa
, |