현재 구현에 참고하던 코드에서 새롭게 프리펩에서 instantiate 하고 그 오브젝트를 원하는 오브젝트의 자식으로 ( 예제 케이스의 경우는 GameManager 의 자식으로 되도록 설정) 설정시키는 방법을 만나게 되었고, 그와같은 방법으로 구현되는데 핵심이 되는 코드는
go.transform.SetParent(_parentAfterThrow);
이와 같다.
여기서 transform 컴포넌트에 접근해서 해당 Transform 클래스에서 제공하는 메서드인 SetParent() 를 이용하는 형태의 코드였다.
이 코드를 사용하면 메서드의 인자로 전달되는 Transform 값을 받아서 해당 Transform 을 가지고 있는 오브젝트의 자식으로 Hierarchy 구조가 변경되게 된다.
이때에 이와같은 형태를 그대로 유지해서 내가 오브젝트에서 풀링해온 개체들을 한 곳에 모아서 (현재 나의 구현은 ActiveFruits 라는 이름을 가진 오브젝트) 해당 오브젝트에 보여있는 정보들을 나중에 현재 상황을 저장한다던지, 혹은 해당 오브젝트의 모든 pooled 된 오브젝트들을 조작하기 위해 이와같은 형태의 hierarchy 이동을 유지하고 싶었다.
이때에 다시 해당 자식 오브젝트들을 object pool 로 되돌려 보낼때 이것을 구현하는데 있어서,
collision.gameObject.transform.SetParent(_fruitPoolTransform.GetChild(_info.FruitIndex));
gameObject.transform.SetParent(_fruitPoolTransform.GetChild(_info.FruitIndex));
이와같이 작성 하고,이때에 사용한 _fruitPoolTransform 의 경우가 내가 다시 재자리로 옮기고 싶은 pool 들을 모두 가지고 있는 부모 오브젝트이다. 이와같이 사용하기 위해서
[SerializeField] private Transform _fruitPoolTransform;
형태로 선언한뒤에 각각의 개별 프리펩에서 위의 Transform 에 FruitPool 이라는 오브젝트를 드래그 앤 드랍으로 할당해주려 하니까
typemissmaching 이라는 형태의 메세지가 발생하면서 정상적으로 할당되지 않았다.
프리펩을 프리펩 폴더에서 씬으로 옮겨서 씬의 hierarchy 상에서는 위와 같은 할당을 할 수 있었는데, 그대로 씬에 있지 않은 상태에서
프리펩 폴더 내에서 해당 프리펩을 클릭한뒤에는 위와 같은 절차로 끌어다 놓기로 원하는 부모 transform 을 할당할 수 없었다.
명확한 이유를 찾아보긴 어려웠고, gpt에 위와 같은 상황에 대한 검색을 해보았을때도, 내가 설명한 현 상황에 대한 이해가 잘못되면서 원하는 정확한 불가능한 이유 자체를 얻을수는 없었다. 하지만 gpt의 잘못된 이해와 함께 제시해준 해결 방법에서 힌트를 얻어서 위와 같은 상황에서 씬에 불러내지 않은 프리펩 자체에서 원하는 오브젝트의 transform 을 사용할 수 있는 형태로 코드를 작성하였다.
힌트를 얻은 부분은 아래와 같다.
[SerializeField] private Transform _fruitPrefab; // 프리팹을 저장할 변수
// 다른 곳에서 해당 프리팹을 찾아서 할당하는 방법
void Start()
{
_fruitPoolTransform = GameObject.Find("FruitPool").transform; // 여기서 "FruitPool"은 프리팹이 있는 씬에서의 오브젝트 이름
}
위의 내용을 통해서 Find("오브젝트명") 을 사용하면 해결할 수 있겠다는 생각이 들어서 이를 이용하기 위해서 코드를 작성해보았다.
public class FruitCombiner : MonoBehaviour
{
private int _layerIndex;
private FruitInfo _info;
private Transform _fruitPoolTransform;
private void Awake()
{
_info = GetComponent<FruitInfo>();
_layerIndex = gameObject.layer;
//Assert.IsNotNull(_fruitPoolTransform);
}
private void Start()
{
_fruitPoolTransform = GameObject.Find("FruitPool").transform;
}
이와 같이 작성하였으며, Start() 메서드에서 원하는 오브젝트 명을 Find 를 통해서 찾아서 그 오브젝트의 transform 을 할당하는 것으로 해결하였다.
이때에 처음에는 직접 드래그 앤 드랍 형태로 해결하기 위해서 Awake 메서드에 Assert.InNotNull() 을 사용해서 할당하지 않은 경우에 Assertion 을 발생시키도록 했는데, 이렇게 했을시에 start 에서 값을 찾아오기 전에 Awake 에서 Assert 가 동작하기 때문에 해당 코드의 경우 주석처리 하였다.
현재는 일단 start 메서드에 Find 를 넣었지만, 해당 Find를 Awake 에 넣어서 작성하는 것을 고려해보도록 하자. Awake에 넣는게 나을지 그냥 Start 에 넣어도 큰 차이가 없을지에 대해서는 조금 더 시간을 들여서 생각해보도록 하자.
일단 Find 를 이용해서 원하는 오브젝트의 이름을 키 값으로 현재 씬에 있는 오브젝트들과 비교하면서 서칭 하는것이 그렇게 마음에 드는 구현은 아니기 때문에 현재 상황에서는 이정도로 작성해두고 전체적인 로직이 완성된 뒤에 효율성을 올리기 위해서 다시 손을 봐보도록 하자.
'Unity' 카테고리의 다른 글
유니티에서 프리팹 내보내기를 통한 다른 프로젝트의 프리팹 활용하기. (0) | 2024.02.07 |
---|---|
Animated Button 클래스를 구현할때 [Serializable] 의 사용 유무에 따른 유니티 인스펙터에서의 차이점. (0) | 2024.02.06 |
오브젝트 풀 구성시 모든 풀을 담당하는 오브젝트에서 자식 오브젝트 모두를 순회하며 Pool 내부에 원하는 개체들을 Initialize 하는 방법에 대해서. (0) | 2024.01.30 |
유니티 오브젝트의 GetInstanceID() 함수를 이용한, 두 충돌 물체에서 한쪽에서만 원하는 로직이 실행되도록 만드는 방법. (0) | 2024.01.30 |
Collider2D 설정시에 기본 Friction 과 Bounciness에 대하여 (0) | 2024.01.23 |