본문 바로가기

내배켐 Unity TIL

Unity 25일차 TIL - Unity 팀 프로젝트 2 (GetComponent<>)

오늘은 Item을 생성하기 위해서 다른 분이 만들어두신 코드를 봤다.

ObjectPool로 Brick들을 생성해 주고, Ball과 Brick의 충돌을 구현해 주셨다.

Brick의 Hp가 0이 될 때 SetActive(false)를 통해서 Object를 제외했다.

 

Item이 생성될 때 제외된 Brick들의 Position에서 생성을 하면 좋겠다고 생각을 했는데, 막상 구현해 보려고 해보니 생성된 각 Brick들에 어떻게 접근해야 될지가 문제였다.

 

처음에는 싱글톤으로 만들었던 GameManager에서 List<GameObject> 변수를 만들어서 SetActive(false)를 구현하는 곳에서 Add 시키려고 했지만, 뭔가 싱글톤을 쓰고 싶지가 않았다. 왜인지는 아직까지도 모르겠다......

 

그래서 어떻게 하면 넣을 수 있을까 고민을 하다가 Script (편의상 Manager라고 적겠음)를 만들고 오브젝트에 넣어준 뒤, Manager에서 List<GameObject> 변수를 만들어줬다.

private로 관리하기 때문에 리스트에 추가하고 제거하기 위해서 AddList(GameObject brick)와 RemoveList(int index) Method들을 만들어준다.

Brick을 생성하는 Script (편의상 CreateBrick이라고 적겠음)에서 [SerializeField] private Manager를 변수로 만들어주고 Awake에서 GetComponent 했다. CreateBrick Script가 붙어있는 Object에 Manager Script가 없으므로 Unity Inspector에서 Manager Script가 붙어있는 Obejct를 넣어준다.

 

이 상태로 게임을 실행시키게 되면 CreateBrick Script가 붙어있는 Object에 [SerializeField] Manager Script가 사라지게 된다.

그래서 Awake에서 GetComponent를 할 때, Manager를 선언했던 변수.GetComponent<Manager>();로 받아와준다.

이러면 게임을 실행해도 [SerializeField] Manager Script가 잘 적용돼있다.

 

그리고 Brick을 생성할 때 Prefab에 같이 붙어있는 Script인 Brick에 가서 Manager 변수를 만들어준다.

이때도 마찬가지로 private로 변수를 선언하기 때문에 GetManager(Manager manager) Method를 통해서 Brick에 있는 Manager 변수 = manager로 세팅해준다.

 

마지막으로 CreateBrick Script에서 Brick Script에 있는 GetManager Method를 불러와서 CreateBrick Script에서 Awake로 GetComponent를 받아왔던 Manager를 매개변수로 넣어준다.

 

그러면 Brick이 생성이 되고 나서도 Manager Script에 접근할 수 있다.

이제 Brick의 Hp가 0이 될 때 Manager Script에 접근해서 먼저 만들어뒀던 AddList() Method를 통해서 gameobject를 추가해 준다.

그렇게 Manager Script에서 SetActive(false)가 된 Brick들을 관리하는 List를 사용할 수 있게 됐다.

 

솔직히 이 방법이 비용적으로 좋은 방식인지는 잘 모르겠다.

그냥 싱글톤을 안 쓰고 싶어서 허튼짓을 한 것 같기도 하다.