2016년 6월 13일 월요일

UNITY, C# - Coroutine, IEnumerator

나의 경우에는 이미지의 알파값을 떨어뜨리면서 점점 그림이 사라지게 하고 싶어서
1
2
3
4
5
6
7
void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}
cs
뭐 이런식으로 업데이트 함수에다 추가 해줬더니 그냥 순식간에 그림이 사라져버렸다.
업데이트는 매 프레임마다 호출하기 때문에 이게 너무 빨리 진행되버리는 것이다.

그래서 코루틴을 사용하면 이걸 어떤프레임에 멈췃다가 다시 시작하는 형식으로 좀더 느리게 실행을 할수가있다.
1
2
3
4
5
6
7
8
IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;
    }
}
cs
이런식으로 만들어놓고
1
2
3
4
5
6
void Update() {
    if (Input.GetKeyDown("f")) {
        StartCoroutine("Fade");
    }
}
 
cs
StartCoroutine으로 원하는곳에서 실행을 시켜주면 원하는 결과를 얻을수있다.
유니티에서는 yield 만 있다면 IEnumerator 를 굳이 쓰지않아도 자동으로 인식을
해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Fade() {
    for (var f = 1.0; f >= 0; f -= 0.1) {
        var c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield;
    }
}
 
function Update() {
    if (Input.GetKeyDown("f")) {
        Fade();
    }
}
cs
이런 식으로 쓸수도있다.
만약에 이걸 더 느리게 반복하고 싶다면 waitforseconds를 사용 하면 된다.
1
2
3
4
5
6
7
8
9
IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return new WaitForSeconds(.1f);
    }
}
 
cs
이러면 지정한 시간만큼 지연됬다가 다시 시작한다.

댓글 없음:

댓글 쓰기