코루틴 좋긴 한데 은근히 신경 써야 하는 게 있어


남발하면 스크립트 플로우 꼬이고, 실행한 코루틴 중첩되면 오작동 생기고 좀 좆 같거든


매번 비슷한 패턴의 코루틴 만들어 쓰는 게 귀찮아서 만들어 쓰는 콤포넌트가 있어



새프로젝트 생성하고 요고 받아서 임포트해봐


Example 라는 객체 보이지?? 거기에 샘플 콤포넌트를 발라 놨으니 확인해봐.


이 콤포넌트는 MonoBehaviourEx를 상속받아서 작성된 샘플 스크립트야.


이게 뭐 하는 놈인지는 자세히 알고 싶은 게이는 직접 소스 열어서 봐바~


코루틴을 사용하는 목적 중에 특정 기능을 지연 실행하는 경우가 많고 (invoke도 있지만, 관리가 안 돼서 난 안 써)


내용은 다르지만 비슷비슷한 코드를 만들게 되거든


이거 좀 짜증 나서 만들어 쓰고 있었어 (좆같은 윾니티 이제 안 씀! ㅅㅂ!!)


DelayAction("TEST_1", 1f, () => Debug.Log("TEST_1"));

1초 지연 후 콘솔에 "TEST_1" 출력하는 방법이야.


메소드 맨 앞에 "TEST_1" 값은 키 값으로, 


StopAnimate("TEST_1")


필요에 따라서 강제 정지 시킬 수 있어.


같은 키로 코루틴을 실행할 경우 작동하고 있는 코루틴을 강제종료하고 실행하기 때문에


덮어 놓고 마구마구 호출해도 코루틴 중복으로 버그 생기는 걸 방지하지


중복으로 호출하고 싶다면, 호출할 때마다 키값을 바꿔주면 됨. $"TEST_{index}" 이런 식으로


ㅇㅇ


DelayAction("TEST_1", 1f, () => Debug.Log("TEST_1"));

DelayAction("TEST_2", 2f, () =>
{

Debug.Log("TEST_2");

AnimateFloat("TEST_3", 0f, 100f, 3f,null,
(value) => {
UpdateFloat(value);
});

AnimateVector3("TEST_4", Vector3.zero, Vector3.one*100f, 3f,null,
(value) => {
testVector = value;
}).End( () => {
DestroyImmediate(gameObject);
});

});


이건 2초 후에 TEST_3과 TEST_4를 실행하는 예제야


AnimateFloat 은 시작 0.0부터 100.0까지 3초 동안 프레임단위로 쪼개서 UpdateFloat() 메소드를 호출해줘


값의 변화 커브를 설정할 수 있는데 커브 설정에 null을 넣으면 기본 커브를 사용하고, 그 기본 커브는 인스펙터에서 설정할 수 있어



a04424ad2c06782ab47e5a67ee91766dc289f1ecd7acc7cabf10dbc05ad2d5219f1db9c0cd330dcdf64b691de639


설정한 커브로 값을 나눠서 리턴해줘


마지막으로


StartCoroutineEx(ExCall("TEST_5"));


코루틴을 사용하는 다양한 목적과 방법이 있는데 아쉬운 것은


코루틴을 실행하는 오브젝트가 Destroy되거나 SetActive(faslse) 되면 멈춘다는 거야.


꺼진 오브젝트에서는 코루틴 실행도 못 하지.


캐릭터가 총에 맞아서 사라지고, 해당 게임오브젝트가 파괴되고 난 이후에도 뭔가를 처리해야 하는 경우가 있어


다양한 방법이 있지만, 개발 흐름상 하나의 스크립트에서 처리하면 편하거든


StartCoroutineEx는 코루틴을 새로운 객체를 만들어서 호출하는 방식이야. 그래서 호출한 콤포넌트가 파괴되거나 사라져도


작동하지. 코루틴이 종료되면 알아서 파괴되는 방식이야.


소스 코드 열어보고 함 둘러봐바~~


이런 방식도 있구나~~ 정도로 생각해 줬으면 좋겠어



아 그리고... 이 소스를 알아서 편집하고 확장해서 쓰는 건 자유인데~


이거 사용해서 발생한 문제에 대한 책임은 각자에게 있다는 것만 알아 둬. (정색)