Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

시작은 0부터

6. 코루틴 문제, Instantiate 와 SetActive 본문

Unity 학습일지

6. 코루틴 문제, Instantiate 와 SetActive

0base 2022. 8. 14. 01:46

슈팅게임을 만들면서 새로운 적의 형태를 만들어보고싶어 메탈슬러그에 나오는 빨간 헬기를 선봉으로 한 헬기무리를 구현해보고싶었다. 가장 선두에 있는 빨간 헬기를 잡으면 나머지 적들도 연쇄적으로 잇따라 폭발하며 사망하는 기능을 구현하기 위해 빈 오브젝트를 생성하고 그 안에 빨간 헬기 역할을 할 오브젝트(이하 맨앞)와 뒤따라올 헬기들 역할을 할 오브젝트들을 넣었다. 그리고 맨앞 오브젝트에는 사망시 뒤따라올 오브젝트들도 사망시킬 오브젝트를 만들기 위해 다음과 같이 코드를 짰다.

 

void Update()
    {
        if(hp <= 0)
        {
            if(isCap == true)
            {
                Instantiate(dieEffect, transform.position, transform.rotation);
                StartCoroutine(ChainDie());
            }
            Instantiate(dieEffect, transform.position, transform.rotation);
            Die();
        }

    }

맨앞 오브젝트 구분용인 bool 변수 isCap이 맞다면 자신이 죽을 때 ChainDie라는 코루틴 함수를 호출한다.

IEnumerator ChainDie()
    {
        for(int i = 0; i < tail.Length; i++)
        {    
            yield return new WaitForSeconds(0.1f);
            tail[i] = GetComponentInParent<GameObject>().transform.GetChild(i+1).GetComponent<GameObject>();
            tail[i].GetComponent<EnemyStatus>().Die();
        }
        Die();

    }

A라는 빈 오브젝트(부모 오브젝트)안에 맨앞 오브젝트(B)와 따라오는 오브젝트들(C,D,E,F)라는 자식 오브젝트들이 있고 위 코드는 맨 앞 오브젝트인 B에 있는 기능이다. 그래서 자신과 같은 부모 오브젝트 안에 있으면서, 동시에 자기 자신을 제외한 오브젝트들을 찾기 위해 위와 같은 코드를 썼지만 되지 않는다..

일단 위 코드의 이유는 죽으면 0.1초 간격마다 터지면서 죽는 것을 연출하기 위해 사망시 코루틴을 호출하도록 설정했고, 자신의 부모오브젝트를 찾아서 그 안에 있는 자식오브젝트의 인덱스(1,2,3,4)를 찾고(0번째는 자기 자신이라 제외) 그 찾은 자식오브젝트에서 죽음 상태를 관리하는 스크립트를 실행시켜 죽음 함수를 호출한다. 이렇게 하면 될 줄 알았는데 안된다.

 

그리고 지금은 방법을 바꿔서 구현을 하긴 했지만, 메탈슬러그 헬기처럼 일정 간격을 두면서 따라가는 패턴을 구현하기 위해 코루틴 함수를 써서 뒤쪽에 있을수록 처음에 움직일 수 있는 시작시간에 코루틴값을 각각 더해 패턴있게 움직이도록 구현하려고 했는데 이상하게 맨앞 오브젝트와 두번째 오브젝트(첫번째 꼬리 오브젝트)의 간격이 이상하게 도출되었다. 즉, 1번째와 2번째의 간격이 이상하다. 이상한 점은 각 오브젝트간의 간격이 1번째부터 5번째까지 모두 동일한데 이상하게 1번째와 2번째 간격만 다르게 적용되어 원인을 찾기위해 한프레임씩 재생하는 버튼을 눌러서 시작하자마자 일시정지 후 한프레임씩 움직였는데 놀랍게도 그렇게 움직이니까 오브젝트 간격이 정상적으로 작동한다. 하지만 일시정지 후 한프레임씩 움직이지 않고 그냥 실행하면 다시 1번째와 2번째의 간격이 이상하게 적용된다. 미스테리하다..

 

그리고 지금은 적이 죽을 떄 죽은 지점에 죽는 이펙트를 나타내는 파티클이 있는 오브젝트를 생성하여 죽는 이펙트를 보여줬는데 오브젝트를 생성하고 지우는 것이 메모리를 많이 잡아먹는다고 하여 이를 최적화하기 위한 대안으로 SetActive 를 사용하여 생성과 제거를 최소화해야겠다..