본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 42일차

by LemongO 2024. 2. 23.

츀킨! 츀킨! 츀킨!

 

 

츀킨!

 

 

 


UnityEngine.Object.Destroy 에 관하여...

 

오늘 개인프로젝트를 보강하며 알아낸 내용인데...

원인은 정확히 파악하지 못했지만 Destroy 메서드는 대충 "비동기 방식인가?" 라는 의심을 했는데

 

코드 내부를 살펴보다 이런 코드를 발견했다.

 

"어... 디폴트 값이 0.0f? 그렇다면 0.0f 초라는 시간을 기다리는거라면 단 1프레임이라도 쉰다는 뜻인가???"

 

사실 정확한 구조는 모르겠다.

 

그럼 어쩌다 발견했는지를 보자.

 

 

사진을 보면 전, 후 버튼을 누르면

1. 하체 파츠가 변경이 되고

2. 변경된 높이에 맞게 상체 파츠의 좌표 수정이 일어난다.

 

 

private void ChangeLowerParts(LowerBase lowerParts)
{
    Destroy(_lower);
    _lower = Instantiate(lowerParts.gameObject, _lowerParent); 
    
    _upperParent.localPosition = Util.FindChild<Transform>(gameObject, "Joint", true).localPosition;    

    Debug.Log($"{Util.FindChild<Transform>(gameObject, "Joint", true).parent.name}");
}

위 코드는 하체 파츠가 변경되었을 때, 호출되는 메서드이며

 

Destroy 호출로 GameObject _lower가 파괴되고, 그 자리에 새로운 _lower가 할당된다.

각 Lower 파츠는 Joint 라는 상체 파츠가 위치할 좌표값을 가진 오브젝트를 가지고 있으며

_upperParent.localPosition = Util.FindChild<Transform>(gameObject, "Joint", true).localPosition;

위 코드로 상체 파츠가 담길 오브젝트의 좌표값을 갱신해준다.

 

위와 같은 과정으로 하체 파츠의 변경과 상체 파츠의 좌표를 수정하는데

다음과 같은 현상이 발생했다.

 

 

 

상황으로 보아 뭔가 이전 하체파츠의 정보가 할당된거 같아 디버그 로그를 찍어봤다.

 

역시나...

 

그렇다면 이 부분을 어떻게 수정해야 하지...?

 

그러다 코드를 다시 살펴보니 상체 좌표를 수정하는 과정에서

_upperParent.localPosition = Util.FindChild<Transform>(gameObject, "Joint", true).localPosition;

FindChild 메서드의 첫 번째 매개변수로 gameObject를 넘겼고

(GameObject 타입이며 검색할 오브젝트를 넣는다. 현재는 파츠들이 담길 모듈의 부모 오브젝트를 넣어줬다.)

결과적으로 이전 하체 파츠를 찾아냈다.

그렇다면 바로 위 코드에서 _lower를 수정했으니 _lower.gameObject 로 넣어주면 되지 않을까?

 

private void ChangeLowerParts(LowerBase lowerParts)
{
    Destroy(_lower);
    _lower = Instantiate(lowerParts.gameObject, _lowerParent); 
    
    _upperParent.localPosition = Util.FindChild<Transform>(_lower.gameObject, "Joint", true).localPosition;
}

 

정상 작동한다.

 

아무래도 Destroy메서드를 호출 한 프레임이나,

Destory를 호출한 메서드동작 중에는 실제 파괴가 일어나지 않는 모양이다.

정확한 원인은 잘 모르겠다...