ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.3.13
    TIL 2024. 3. 13. 20:48

    어제의 문제점이였던..

    입력되지 않았던 AddListener의 이유!

     

    Prefab을 Resources.Load할 경우 Prefab의 설계도를 가져오는 것으로 Instantiate를 해줘야지 설계도대로 Object가 생성이 됩니다.

    itemSlots[i] = Resources.Load("Prefabs/DogamItemSlot") as GameObject;
    Instantiate(itemSlots[i]);
    itemSlots[i].GetComponent<Button>().onClick.AddListener(() => DogamSlotButton(n));

     

     

    itemSlots에 설계도를 저장했고, 설계도에 AddListener을 넣어주었습니다.

    Object가 아니기 때문에 생성된 Object에는 AddListener이 들어가지 않습니다.

     

    itemSlots[i] = Instantiate(Resources.Load("Prefabs/DogamItemSlot") as GameObject);
    itemSlots[i].GetComponent<Button>().onClick.AddListener(() => DogamSlotButton(n));

    따라서 itemSlot에 설계도대로 생성된 Object를 넣어줌으로써 AddListener이 제대로 작동되게 합니다.

     


     

    아이템을 Prefab으로 생성하면서 애니메이션을 추가해주었습니다.

    플레이어가 클릭을 하면 특정 애니메이션이 실행되도록 trigger을 통해서 작업을 해주었는데요.

    animator.SetTrigger("");

    trigger을 작동하게 하기 위해서 SetTrigger 안에 지정해둔 trigger string을 작성해줘야합니다.

    그러나 string을 처리하는 작업이 성능적으로 좋지 못하기 때문에 StringToHash를 통해 string 값을 int로 바꿔줘서 사용하는게 좋습니다.

     

    animator.SetTrigger(trigger_animation);

    본래라면 이렇게 StringToHash를 해서 사용하면 제대로 애니메이션이 작동을 해야하는데, 작동을 하지 않게 됩니다.

    이유는 StringToHash를 통해 int로 바껴야하는데 제대로 바뀌지 못했기 때문입니다.

     

    아이템의 경우 여러 아이템을 사용할 것이고, 아이템의 정보는 다른 곳에서 필요할 뿐 화면에서는 sprite만 보이기 때문에 Resources.Load를 통해 한가지의 Prefab이 sprite만 바꾸어 생성되도록 했는데,

    새로 생성하는 과정에서 StringToHash가 제대로 작동을 하지 않는 것입니다.

     

    좀 말이 어렵긴 한데 아이템을 생성하면서 외부의 값을 제대로 처리를 못했다. 라고 보면 될 것 같습니다.

    private static readonly int trigger_animation = Animator.StringToHash("OnIn");

    그래서 외부에서 값을 제대로 받아오기 위해서 static을 이용해주었습니다.

     

    일반적으로는 static이 필요없지만, 생성하는 Object에 있는 component script에서 외부의 값을 받아오기 위해서는 static을 이용해준다고 볼 수 있을 것 같습니다.

     


     

    도감부분은 현재 상태에서 할 수 있는만큼 한 것 같아서 인벤토리쪽을 건들여봤습니다.

    특정 아이템을 가지고 있을 때 이벤트가 발생하거나 이야기가 진행되어야하는 것들이 있기 때문에 관리를 편하게 하기 위해서 Dictionary로 인벤토리 아이템을 정리해주었습니다.

    Dictionary를 이용한 이유는 특정 값(아이템ID)을 key로 해서 쉽게 정보를 찾을 수 있기 때문입니다.

    그리고 key 값이 중복으로 등록되지 않기 때문에 아이템 종류를 한개씩만 얻는 것에서 사용하기 좋을 것 같았습니다.

    그래서 도감 아이템 데이터처리하는 경우에도 Dictionary를 사용해주었습니다.

     

    Dictionary의 단점?이라고 할까요. 순서가 없다는 것입니다.

    어떠한 데이터가 먼저들어왔는지 알 수 없습니다.

    인벤토리는 얻은 아이템을 차례대로 가지고 있기 때문에 순서 부분이 중요했습니다.

    그래서 Aciton을 이용해서 아이템을 얻을 경우 인벤토리에 들어갈 수 있도록 구독을 해주었습니다.

     

    문제점은 인벤토리UI를 팝업UI처럼 Resources.Load를 통해서 불러오도록 설정해주려고 하는데 이럴 경우 인벤토리UI가 Hierarchy에 없을 때에는 아이템이 제대로 들어가지 않게 됩니다.

     

    그래서 우선 얻은 아이템의 정보는 가지고 있는 상태에서 인벤토리UI가 켜졌을 때 얻은 아이템 정보를 인벤토리에 넣어주는 것으로 바꾸게 되었습니다.

    여기서 Dictionary는 순서가 없는데 어떻게 얻은 순서대로 인벤토리에 넣을 수 있을까? 라는 의문점이 생기게 됩니다.

    가장 좋은 방법은 List를 이용해서 순서대로 넣어주는 것이긴한데 아무래도 이벤트 발생을 쉽게하기 위해서 Dictionary를 사용할거고 다른 분이 그렇게 작업하고 있는 상황이기도 해서 얻은 순서를 알려주는 List를 만들기로 했습니다.

     

    List에는 아이템ID가 들어가게 되며, 인벤토리UI에서 List에 있는 아이템ID에 맞춰 Dictionary에 있는 아이템 정보를 UI에 전달해주었습니다.

    아이템이 전달이 다 되면 List.Clear()를 해주면서 다음 인벤토리를 킬 때까지 다시 아이템ID를 쌓아주면서 이미 있는 아이템을 중복으로 인벤토리에 들어가지 않도록 해주었습니다.

     


     

    오늘의 기술 면접 질문

     

    6. 가비지 컬렉터를 회피하기 위한 전략은 무엇이 있나요?

    가비지 컬렉터가 덜 작동하도록 하는 방법이 무엇이 있을까요?

     

    당당하게 검색해봤습니다.

     

    • 객체 풀링(Object Pooling): 빈번한 객체 생성 및 삭제를 피하기 위해 객체 풀을 사용하여 객체를 재사용합니다. 이는 가비지 컬렉터가 덜 작동하도록 도와줍니다.
    • Weak References 사용: Weak reference를 사용하여 객체에 대한 참조를 유지하면서도 가비지 컬렉터가 해당 객체를 수거하지 않도록 할 수 있습니다. 이는 메모리 누수를 방지하는 데 도움이 될 수 있습니다.
    • 크기가 작은 객체 사용: 가능하면 작은 크기의 객체를 사용하여 가비지 컬렉터가 이를 더 쉽게 처리하도록 합니다.
    • 임시 객체 생성 최소화: 루프나 반복문 안에서 임시 객체를 생성하는 것을 최소화하여 가비지 생성을 줄입니다.
    • Finalize 메서드 사용 최소화: finalize 메서드는 객체가 수거되기 전에 실행되므로, 가능하면 이를 사용하지 않거나 최소화하여 가비지 컬렉션 성능을 향상시킵니다.
    • 메모리 누수 방지: 정적 분석 도구를 사용하여 메모리 누수를 감지하고 해결하여 가비지 컬렉터가 불필요한 객체를 회수할 수 있도록 합니다.
    • 가비지 컬렉션 옵션 조정: 일부 가비지 컬렉션 구현은 옵션을 통해 동작을 조정할 수 있습니다. 이를 조정하여 애플리케이션에 가장 적합한 성능을 얻을 수 있습니다.

    C# 질문 리스트 - 가비지 컬렉터를 회피하기 위한 전략 (velog.io)

     

    C# 질문 리스트 - 가비지 컬렉터를 회피하기 위한 전략

    가비지 컬렉터를 회피하기 위한 전략은 무엇이 있나요?객체 풀링(Object Pooling): 빈번한 객체 생성 및 삭제를 피하기 위해 객체 풀을 사용하여 객체를 재사용합니다. 이는 가비지 컬렉터가 덜 작동

    velog.io

     

    Finalize 메서드 사용 최소화를 하면 가비지 컬렉션 성능을 향상시킬 수 있다고 합니다.

    가비지 컬렉션이란 가비지 컬렉터가 사용하지 않는 메모리를 비워주는 과정을 이야기합니다.

    가비지 컬렉션 성능의 향상은 가비지 컬렉터가 더 좋게 메모리를 비워줄 수 있다는 뜻이라고 생각됩니다.

     

    우선 제가 해본 방법 중에는 임시 객체 생성 최소화가 있습니다. 반복문 안에서 new를 이용해 Vector3를 계속 만들게 되면 연결이 끊긴 Vector3는 가비지 컬렉터가 처리를 하게 됩니다.

    그렇기 때문에 Vector3가 같은 값을 입력하는 것이므로 지역변수로 new Vector3를 선언해주고 변수명을 for문에 넣어서 해주었던 걸로 기억합니다.

     


     

    오늘의 기술면접 질문은 방법은 조금 알고 있지만 정확한 명칭은 몰랐던 것이었기 때문에 검색해서 정리해봤습니다.

    이걸 어떻게 기억할 수 있을지는 모르겠지만.. 열심히 머릿 속에 넣어보도록 하겠습니다.

     

    그리고 비슷하게 도감으로 작업을 했어서 그런지 인벤토리도 작업을 잘 진행한 것 같습니다.

    내일은 도감에 넣을 아이템과 아닌 아이템 분리해서 정리해보고 도감에 들어가지 않을 아이템들은 어떻게 처리할지 고민해봐야겠습니다.

    'TIL' 카테고리의 다른 글

    2024.3.15  (0) 2024.03.15
    2024.3.14  (1) 2024.03.14
    2024.3.12  (0) 2024.03.12
    2024.3.11  (0) 2024.03.11
    2024.3.8  (1) 2024.03.08
Designed by Tistory.