1. 오늘의 할 일
코루틴이 무엇일까?
코루틴은 어떤 역할을 할까?
일단 나는 잠깐 시간을 지연시키는 용도로만 사용했는데 실제 사용법은 어떻게 되지?
다음에도 사용할 수 있도록 가볍게 정리하는 시간을 가져보도록 하자.
2. 코루틴?
Coroutine.
StartCoroutine(); 의 형식으로 사용하며, IEnumerator랑 짝으로 함께한다.
팀플에서 먼저 알게 되었다.
사용하게 된 경위는, 카드 뒤집기에서 카드를 뒤집은 동안 다른 카드가 뒤집히지 않게 하도록 만들기 위해서.
대충 코루틴에 대해 알고 있는 것
1. 이거 쓰면 잠시 내려가서 코루틴이 불러온 함수 처리하고 있음.
2. yield return을 이용해 해당 함수를 끝낼 조건이나 시간을 정할 수 있음.
3. 일단, 코루틴이 시작되면 조건을 만족할 때까지 코루틴은 계속 진행됨.
4. 일단 제어권이 코루틴한테 가 있긴 한데, 멈출 방법이 없는 것도 아님.
그리고 이걸 떠올리며 정리하고 있는 나:

일단! 대충 사용하는 방법은 3일차에 말한 것 과 다를 것이 없다. 이것만은 확실하게 말할 수 있다.
나는 단순히 new waitForSecondsRealtime(1.0f); 를 이용해 초에 딜레이를 주는 것만 알고 있을 뿐이지만!
3. 그럼 좀 더 명확하게 해볼까.
일단 내가 쓴 것처럼 그 함수를 잠시 정지 시키는 용도. 즉, Invoke를 대체하는 용도로는 확실히 많이 쓰는 모양이다.
그럼 좋다, 대충 원하는 초만큼 '기다리는 건' 할 수 있다고 치자.
하지만 코루틴이 작동한다고 게임이 멈추는 것은 아니다. 그냥 잠깐 그 함수에 있는 일을 하고 오는 거지.
그럼 여기서 하나 더 떠올릴 수 있다. 잠깐, 코루틴이 불러와져있는 동안, 코루틴 함수에 등록된 내용을 처리하는 거라면… …!
시스템 상으로 일정 시간 간격으로 무언가를 처리할 수 있다.
3초마다 깎이는 피…3초마다 증가하는 피….

그렇다, 독대미지 (그리고 도트힐)이다.
실제로 사용되는 지는 모르겠지만(…)
충분히 가능성은 있어보인다.
가령 위에 있는 '리제네'라는 스킬은, 3초마다 회복력 250으로 6번(18초동안) HP를 올려준다.
그러니까, 그냥 〈HP+=250*(회복력 데이터);〉 은 16초동안 얼마나 올라갈지 알 수 없다.
컴퓨터의 처리속도는 우리가 생각하는 것보다 더 빠르다.
하지만? 코루틴이라면? 1번 HP 회복을 넣고 3초 기다렸다가 다시 HP 회복을 3초 넣고, 시간이 끝날 때까지 반복할 수 있다.
'디버프'를 얻을 수 있는 객체에게, while문으로 지속시간이 진행 중이라면>StartCoroutine(PoisonDamage());로 표현할 수 있을 것이다.
그러니까, 디버프가 1초마다 독대미지만큼 깎인다고 치자. 디버프 효과는 10초이고.
※주의) 뇌에 있는 걸 꺼냈기 때문에 실제로 작동할 수 있는지 불분명한 코드
였는데 이제 실제로 기능하는 코드라고 튜터님께 확인 받음. (물론 bool Poison 등은 따로 지정해야함을 기억하자.)
public void attacked()
{
if(Poison==true)
{
StatCoroutine(PoisonDamage());
}
}
IEnumerator PoisionDamage()
{
float duration = 10f; // 지속 시간
float elapsedTime = 0f; // 경과 시간
while(elapsedTime < duration) //경과시간이 지속시간보다 작을 때
{
HP -= poisonDam; //포이즌 대미지 만큼 HP 감소
anim.SetBool("Poison",true); //독 효과 애니메이션 추가
yield return new WaitForSeconds(1f); // 1초 대기
elapsedTime ++; // 1초 지났으니 시간 업데이트
}
anim.SetBool("Poison", false); //끝나면 애니메이션도 종료
}
회복스킬이나 지속회복 아이템이라면 반대로 HP를 += 해주면 될 것이다.
그런데, 내가 2번에서 말했다.
4. 일단 제어권이 코루틴한테 가 있긴 한데, 멈출 방법이 없는 것도 아님.
4. 코루틴은 어떻게 멈추나요?!
start 가 있다면 stop도 있는 법이다.
그러니까, 중간에 '해독제' 같은 걸 먹어서 회복을 했다거나, 아니면 '버프효과 제거'라는 스킬을 얻어맞아서 강제로 회복이 중지되는 경우다.
구성은 간단하다.
StopCoroutine( );
StopCoroutine(); 은 조금 특이한데, 만약 StartCoroutine(); 를 ("string")으로 호출했다면, 마찬가지로 StopCoroutine("string"); 으로 해당 코루틴을 멈출 수 있다.
간단하지만, 오류가 나기 쉽다. 안에 들어가는 것이 '문자열'이기 때문에, 만약 내가 잘못 작성했어도 오류 코드가 뜨지 않는다!
그럼 어떻게 저장하는 게 좋은가?
Coroutine을 저장할 변수를 만들면 된다!
private Coroutine poisonCoroutine; //이렇게 posion Coroutine 이라는 코루틴을 저장할 변수를 만들고,
poisonCoroutine = StartCoroutine(PoisonDamage()); //이렇게 시작하는 코루틴을 해당 변수에 할당한다.
이렇게 저장해두면, 특정 조건에서 코루틴을 멈출 때,
StopCoroutine(poisonCoroutine);
만으로 멈출 수 있다.
※대충 이런 느낌으로 쓸 수 있을지도 모른다.
!!실제로 기능을 하는 코드임을 확인 받았다!!
private Coroutine poisonCoroutine; // 코루틴을 저장할 변수
public void Attacked()
{
if (Poison == true)
{
if (poisonCoroutine != null) // 같은 내용의 기존 코루틴이 실행 중이면, 중단시킨다.
{
StopCoroutine(poisonCoroutine);
}
poisonCoroutine = StartCoroutine(PoisonDamage());
//다시 코루틴을 넣는다. 여기서 poisionCoroutine은 PoisonDamage(); 코루틴을 실행하는 것으로 지정된다.
}
}
IEnumerator PoisonDamage()
{
float duration = 10f;
float elapsedTime = 0f;
while (elapsedTime < duration)
{
HP -= poisonDam;
anim.SetBool("Poison", true);
yield return new WaitForSeconds(1f);
elapsedTime ++;
}
anim.SetBool("Poison", false);
}
아니면 StopAllCoroutine; 을 이용해 실행중인 모든 코루틴을 정지 시킬 수도 있다.
하지만 이 경우, 정말, '모든'코루틴이 중지되기 때문에, 반드시 필요한 요소가 아니라면 잘 쓰지 않게 될 것이다.
(물론 해당 스크립트에 적용된 코루틴이 한 개 뿐이라면 상관없을 것이다.)
5. 마무리
미약하지만, 아무튼 코루틴을 좀 더 상세하게 알아봤다. 어떻게 쓸지, 쓸 수 있을지 상상하고 코드를 짜보는 것도 제법 재밌는 것 같다.
다음에는 C# 문법을 배운다는 것 같은데. 어떨지 궁금하다. 다음 주도 파이팅 ' ')9
++수정 추가) 튜터님한테 코드가 제대로 짜였다는 걸 확인받았다!!!! (꺄악)
나중에는 동기와 비동기의 차이점도 알아야한다고 말씀하셨으므로 이건 잘 기억해두고 살펴보도록 하자....
'Unity_본캠프' 카테고리의 다른 글
[내일배움캠프 6일차] TextRPG 제작기 1 (1) | 2025.04.14 |
---|---|
[내일배움캠프 1주차] 1주차 정리 (1) | 2025.04.13 |
[내일배움캠프 4일차] 브금을 깔자 (1) | 2025.04.10 |
[내일배움캠프 3일차] 카운트 다운 (1) | 2025.04.09 |
[내일배움캠프 2일차] Github (3) | 2025.04.08 |