시작은 0부터
6. 코루틴 문제, Instantiate 와 SetActive 본문
슈팅게임을 만들면서 새로운 적의 형태를 만들어보고싶어 메탈슬러그에 나오는 빨간 헬기를 선봉으로 한 헬기무리를 구현해보고싶었다. 가장 선두에 있는 빨간 헬기를 잡으면 나머지 적들도 연쇄적으로 잇따라 폭발하며 사망하는 기능을 구현하기 위해 빈 오브젝트를 생성하고 그 안에 빨간 헬기 역할을 할 오브젝트(이하 맨앞)와 뒤따라올 헬기들 역할을 할 오브젝트들을 넣었다. 그리고 맨앞 오브젝트에는 사망시 뒤따라올 오브젝트들도 사망시킬 오브젝트를 만들기 위해 다음과 같이 코드를 짰다.
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 를 사용하여 생성과 제거를 최소화해야겠다..
'Unity 학습일지' 카테고리의 다른 글
8. 게임매니저로 변수 관리, 오브젝트 메쉬 색상 변경 (0) | 2022.08.16 |
---|---|
7. 프리팹 인스턴스시 부모 오브젝트 설정에서 에러가 날 때 (0) | 2022.08.15 |
5. 코루틴(Coroutine), 자식 오브젝트 가져오기, Mathf.SmoothDampAngle (0) | 2022.08.13 |
4. RigidBody , LookAt, Material, 축 이동과 기울기 (0) | 2022.08.12 |
3. 축, Rotate 와 Position (0) | 2022.08.10 |