게임개발/Unity

24-09-02 개인 프로젝트 : Geometry Survivor 02

몰록 2024. 9. 2. 22:34

지난 시간에 캐릭터를 이동하게 하는데 성공했고 적이 쫓아오는 로직까지 구현했다.

 

이제 적들이 생성되는 로직을 배울 차례였는데, 지금 보는 강의는 PoolManager 라는 개념을 사용했다.

https://www.youtube.com/watch?v=A7mfPH8jyBE&t=305s

 

오브젝트 풀링이라고도 서술했는데, 프리팹들을 배열해서 생성하는 방식으로, 단순이 Instantiate 와 Destroy를 반복하다간 메모리상의 이슈가 있을수 있기 때문에 그걸 관리하는 방법이라고 한다.

 

강의에서 보고 따라한 PoolManager 코드 전문 : 

더보기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PoolManager : MonoBehaviour
{
    // 프리팹 보관할 변수 
    public GameObject[] prefabs;



    // 풀 리스트
    List<GameObject>[] pools;


    private void Awake()
    {
        pools = new List<GameObject>[prefabs.Length];

        for (int index = 0; index < pools.Length; index++)
        {
            pools[index] = new List<GameObject>();
        }

    }

    public GameObject Get(int index)
    {
        GameObject select = null;

        // 선택한 풀에 놀고 있는 (비활성화 된) 게임 오브젝트 접근
        foreach (GameObject item in pools[index])
        {
            if (!item.activeSelf)
            {
                // 발견하면 select 변수에 할당
                select = item;
                select.SetActive(true);
                break;
            }
        }

        // 못 찾았으면
        if (!select)
        {
            // 새롭게 생성하고 select 변수에 할당
            select = Instantiate(prefabs[index], transform);
            pools[index].Add(select);
        }


        return select;
    }

}

앞으로 Enemy의 갯수를 늘릴 생각이긴 하나 아직은 하나밖에 없고 배열을 해봤자 한개다. 하지만 강의의 내용을 실천하기엔 문제 없었다.

 

그리고 이 풀 매니저가 잘 작동하는지 알아보기 위해 

 

Spawner Script

 spawner 오브젝트를 만들어서 스페이스바를 누르면 배열의 0번째 (하나밖에 없으므로 그 Enemy가 된다) 를 가져오도록 했다.

 

이렇게 하니 스폰은 잘 되지만 스폰한 Enemy가 주인공을 쫓아오지를 않았다.

왜냐면 Enemy에 할당될 Target이 인스턴스화 하는 과정에선 지정되지 않기 때문.

 

Enemy Script

그걸 해결하기 위해 이렇게  OnEnable 함수(Awake나 Start처럼 시작할때 호출하는 함수지만 이거는 Enable. 즉 활성화될때 호출한다는뜻) 에서 주인공 Circle의 Rigidbody2D를 알아서 담아줄수 있도록 했다.

 

그렇게 하니 잘 작동했다! 스폰하는데로 잘 쫓아오고 문제가 없었다. 하지만 후술할 시행착오때문에 스터디 시간이 다 지나가버리고 말았다...

 

 

 

시행착오들 : 

 

더보기

 

 

이렇게 collider끼리 부딪히니까 카메라가 빙글빙글 돌기 시작한게 너무 웃겨서 스터디 조원들과 공유했고 같이 이 이슈를 고치기 시작했다. 기존엔 카메라가 Circle 안에 들어있었는데 그때문에 collider와 통체로 회전하나보다 싶어서 카메라를 따로 빼서 Script로 위치값을 따라가게금 만들기도 했다. 하지만 언젠가부터 Spawner를 통해 생성되는 Enemy들이 Circle을 쫓아오지 않게 되어버렸다!! 무슨 문제였는지는 스터디 시간이 다 끝난 뒤에서 각자 해답을 찾아본 뒤에서야 알아낼수 있었지만, 카메라가 돌아가는 문제는 비교적 간단하게 해결할수 있었다..

 

   바로 Rigidbody2D에서 Freeze Rotation을 체크해주는것.. 이였다. 이걸 해주니까 카메라가 빙글빙글 돌지 않았다.

 근데 인터스텔라 생각나기도하고 막 돌아가는게 개꿀잼이긴 해서 좀 아쉽다 

 

팀원들이 각자 보내준 해답들

그리고 팀원들로부터 적들이 쫓아오지 않는것도 해결했는데.. 

Enemy Script

적을 쫓는 로직에서 if문으로 막아둔 isLive가 초기화가 안되있었기 때문이였다..............???

하지만 이걸 애초에 건든적이 없었는데 왜 갑자기 먹통이 되었던걸까???????? 아직도 의문이지만 덕분에 지금은고쳐졌다..