인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

늘픔님의 프로필 이미지

작성한 질문수

[Unity] 함께 만들어가는 방치형 게임 개발

코인 획득 연출

Layer1> "HIT_TEXT" 풀에 반환시

해결된 질문

작성

·

59

0

Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.

UnityEngine.Transform:set_parent (UnityEngine.Transform)

Object_Pool:Return (UnityEngine.GameObject,System.Action`1<UnityEngine.GameObject>) (at Assets/00_Scripts/Mng/Pool_Mng.cs:66)

Base_Mng/<Return_Pool_Coroutine>d__8:MoveNext () (at Assets/00_Scripts/Mng/Base_Mng.cs:69)

UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr)

 public void Return(GameObject obj, Action<GameObject> action = null)
 {
     pool.Enqueue(obj); //풀안으로 새로운 오브젝트가 들어감.
     obj.transform.parent = parentTransform;
     //obj.transform.parent.SetParent(parentTransform, false); //이거는 오류가나타남
     //obj.transform.parent.SetParent(parentTransform, true); //true이든 false이든.. 오류발생
     obj.SetActive(false);   
     if(action != null)
     {
         action?.Invoke(obj);
     }
 }

transform의 parent 속성대신에 SetParent 를 쓰라고 경고메세지가 나타나는데요
Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.

근데 /obj.transform.parent.SetParent(parentTransform, false)
이런식으로 사용했더니, HIT_TEXT가 풀로 반환되면서 부모인 Layer1도 같이 반환되어서

UnityException: Transform child out of bounds Base_Canvas.Holder_Layer (System.Int32 value) (at Assets/00_Scripts/Base_Canvas.cs:28) HIT_TEXT.Init (UnityEngine.Vector3 pos, System.Double dmg, System.Boolean Critical) (at Assets/00_Scripts/HIT_TEXT.cs:76) Monster+<>c__DisplayClass6_0.<GetDamage>b__0 (UnityEngine.GameObject value) (at Assets/00_Scripts/Monster.cs:113) Object_Pool.Get (System.Action1[T] action) (at Assets/00_Scripts/Mng/Pool_Mng.cs:58) Monster.GetDamage (System.Double dmg) (at Assets/00_Scripts/Monster.cs:111) Bullet.Update () (at Assets/00_Scripts/Bullet.cs:83)
-------------------------------
Layers의 자식이 Layer3밖에 남지않아서
Base_Canvas 스크립트의
public Transform Holder_Layer(int value)

{

return LAYER.GetChild(value);
함수 호출시에 에러가 나더라구요

결국에는 그냥 transform.parent = parentTransform.
로 사용하고있는데 SetParent를 사용하라고 계속 경고메세지가 뜹니다. ㅠㅠ

SetParent(parentTransform, ture) 이던, false이던 Canvas>Layer1>HitText, 에서 Pool로 반환될때 Layer1도 같이 반환됩니다.
Layer0>"COIN_PARENT"도 마찬가지로 Layer0도 같이 반환됩니다.

그냥 경고메세지를 띄울수밖에없는건가요?

 

답변 2

0

Pinous님의 프로필 이미지
Pinous
지식공유자

안녕하세요!
일단 SetParent를 활용하라고 권장하는 경고문인걸로 보이네요 🙂

SetParent를 활용하셔도 되지만 지금 나오는 오류는 다른 문제인 것 같습니다.

transform.parent = parentTransform
기존 코드에서
transform.parent.SetParent(parentTransform)
이렇게 변경주신걸로 보이는데요
transform.SetParent(parentTransform)
으로 변경 해 주셔야 합니다.

SetParent는 그 자체 함수만으로도 안에 들어가는 파라미터를 부모 트랜스폼으로 변경하는 코드이기에
현재 작성주신 transform.parent.SetParent(parentTransform)의 경우에는
트랜스폼의 부모의 부모를 parentTransform으로 변경해라 라는 문구입니다.
transofrm.SetParent(parentTransform)을 통하여
트랜스폼의 부모를 parentTransform으로 변경하라는 코드로 변경해주시면 되겠습니다 🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 늘픔님.

공유해주신 문제는 Unity의 UI 요소인 RectTransform을 풀링할 때 발생하는 경고 메시지에 관한 것입니다. 이 메시지는 UI 요소의 부모를 설정할 때 SetParent 메서드를 통한 설정을 권장하고 있습니다. 현상으로는 RectTransform의 부모가 잘못 설정되면서 발생하는 흔한 문제들을 방지하기 위한 것입니다.

해결 방법 제안:

  1. SetParent 사용 권장 이유:

    • SetParent 메서드는 Transform.parent 속성보다 명확하게 부모-자식 관계를 정의합니다. 특히 worldPositionStays 매개변수를 사용하여 위치, 회전, 스케일을 더 정밀하게 제어할 수 있습니다.
  2. 원인 분석 및 해결:

    • HIT_TEXT 오브젝트가 SetParent로 인해 부모와 함께 풀링되는 문제는 부주의한 계층 구조 변경이나 잘못된 설정이 원인일 수 있습니다.
    • 오브젝트가 반환될 때 parentTransform에 정확히 어떤 오브젝트가 들어가 있는지를 확인하고, Layer1의 자식 요소로 설정되는지 확인해 보세요.
    • SetParent 호출 시 인자의 잘못된 설정이 HIT_TEXTLayer1 대신 pool로 떨어지게 하는 원인이 될 수 있습니다.
  3. 코드 검토:

    • 제시된 코드는 SetParent 사용 시 obj.transform.SetParent(parentTransform, false);로 설정하여야 한다는 점을 반드시 설정하세요.
    • Layer1 등 최상위 부모가 추적되지 않도록 별도의 코드를 통해 오브젝트의 최종 부모만 SetParent로 설정해야 합니다.
  4. UI 계층 구조 점검:

    • Canvas > Layer1 > HitText가 프레임워크 내 다른 구조로 오판되는지,
    • Transform이 풀링 과정에서 잘못된 상태로 변경되지 않는지 지속적으로 모니터링해야 합니다.

참고 링크:

유사한 문제에 대해 해결 절차를 참고할 수 있는 여러 다른 질문들을 소개해드립니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 경고 메시지는 UI 기능에 문제가 없더라도 명확한 코드 가이드를 통해 사전에 방지하는 것이므로 직접적인 기능 문제가 없다면 큰 걱정이 필요 서도 괜찮습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

늘픔님의 프로필 이미지

작성한 질문수

질문하기