개발일지-01

jh Seo·2023년 5월 21일
0

게임 개발을 팀을 꾸려 시작하고 벌써 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를 빠져나가게 하였다.

profile
코딩 창고!

0개의 댓글