게임 개발을 팀을 꾸려 시작하고 벌써 10개월이 지났다.
이리 뒤엎고 저리 뒤엎고 다시 바쁘게 만들다보니 개발일지를 시작해놓고 까먹었다.
이제부터 구현하거나 구현했던 것들 중에서 매우 긴 고민을 했던 파트들만
정리해서 적어볼 것이다.
보스 패턴을 짜는데 처음 구현되어있던 부분은
private Dictionary<string, IAttackable> attackComponentDict;
foreach (IAttackable component in transform.GetComponents<IAttackable>())
{
Debug.Log(component.GetcType());
attackComponentDict.Add(component.GetType().ToString(), component);
}
이런식으로 IAttackable인터페이스가 달린 컴퍼넌트들을 foreach문으로 읽어와
Dictionary에 저장을 한 후, 기본적으로 Think함수를 통해 Invoke("Think",2)
이런식으로 2초마다 다음 패턴을 실행시키는 구조였다.
하지만 패턴에 저장되어있는 스킬들이 다 끝나지 않았는 데 다음 Think가 호출되어서
두가지 패턴이 동시에 실행되어서 의도치않는 결과가 계속 나왔다.
따라서 Think함수를 코루틴으로 변경을 하여 각 패턴이 끝났는지 체크 후 다음
Think함수를 호출하도록 구현을 하려했다.
public IEnumerator Think()
{
Debug.Log("Think시작");
if (currentPatternList == null)
{
Debug.Log("no pattern");
yield return waitForSeconds2f;
StopCoroutine(thinkCor);
thinkCor = StartCoroutine(Think());
}
Debug.Log("여기도 올라왔니?");
patternIndex = patternIndex == currentPatternList.Count - 1 ? 0 : patternIndex + 1; // 패턴 반복 위함
curPatternCount = 0;
maxPatternCount = currentPatternList[patternIndex].RepeatTime;
Debug.Log("여길 왜");
StartPattern(currentPatternList[patternIndex].Type, currentPatternList[patternIndex].TypeIndex);
Debug.Log("다시가");
if (!isPatternFinished)
{
Debug.Log("아오");
yield return null;
}
}
이런 식으로 짰었는데 문제는 StartPattern함수가 실행된 후에,
로그를 찍은 "여기도 올라왔니?" 부분이 첫 패턴 끝나는 로그가 찍히기도 전에
다시 찍혀있는 것이였다!
Think함수를 누가 다시 호출했다면 "Think시작" 로그가 한번 더 찍혀있어야 하는데
"저 여기도 올라왔니?" 부분부터 다시 찍혀서 너무 이상했다.
오래 고민을 하며 다른 함수들에도 다 로그를 찍으며 고민한 결과,, 갑자기 깨달았다.
처음 Think함수가 실행되었을 때 currentPatternList가 실행주기때문에 언제 할당될지 몰라서
null값인지 비교하고 다시 Think함수를 2초뒤에 실행시키는 부분을 봐보자.
yield return waitForSeconds2f;
StopCoroutine(thinkCor);
thinkCor = StartCoroutine(Think());
}
Debug.Log("여기도 올라왔니?");
이 함수 이후 2초뒤에 실행 시키고(waitForSeconds2f는 위에 캐싱해둔 WaitForSeconds(2f)이다.)
아무 생각없이 Think를 stopcoroutine으로 중지시키고 다시 startcoroutine으로 재할당을 해서
당연히 이 함수가 끊길거라고 안일하게 생각을 한것이다!
따라서 저 첫번째 Think()가 두번째 Think()를 할당한후 실행시키고 사라지지 않고
밑부분인 Debug.Log ("여기도 올라왔니") 를 실행시키며 진행해버린것이였다.
그래서 내 기대와는 달리 두개의 Think()가 생겨 각각의 패턴들을 마구 쏴대서
이상해진 것이였다!!
따라서
if (currentPatternList == null)
{
Debug.Log("no pattern");
yield return waitForSeconds2f;
StopCoroutine(thinkCor);
thinkCor = StartCoroutine(Think());
yield break;
}
Debug.Log("여기도 올라왔니?");
yield break;를 통해 첫번째 Think를 빠져나가게 하였다.