2025.03.27 (목)

윤혜진·2025년 3월 27일

📍오늘의 학습 키워드

  • 팀 프로젝트 - 클리커 게임

    • 담당 역할
    • 트러블슈팅

📍학습 내용

  • 담당 역할

    • 플레이어 능력치 및 업그레이드 기능 (아래 사진은 예시 게임 캡쳐)
  • 구현해야 하는 기능:

    • 업그레이드 UGUI
    • 업그레이드 현황 및 그에 따른 현재 능력치를 화면에 표시
    • ScriptableObject를 통해 데이터 테이블 작성
    • 재화를 소모해 플레이어의 능력치를 업그레이드
    • 재화가 부족하면 업그레이드 X
    • 업그레이드 현황 및 그에 따른 현재 능력치를 화면에 표시합니다.
    • 구현해야할 스탯(스킬)
      • 치명타 데미지 증가
      • 자동 공격 속도 증가
      • 재화 획득량 증가

📍겪은 어려움

  • GetComponent를 통해 특정 자식을 찾아오는 과정에서 생긴 문제

    • 현재 업그레이드 UI는 다음과 같은 형식으로 구현되어 있다:

    • 나는 슬롯에 스킬 스크립트를 붙이기만 하면 하위 오브젝트들의 정보를 알아서 다 가져올 수 있도록 코드를 짜고 싶었다.

    • 그래서 OnVaildateGetComponentInChildren를 통해 하위 오브젝트들의 컴포넌트를 받아와 연결해주려고 했음

    • 문제: 나는 IconImage를 받아오고 싶었는데 GetComponentInChildren로 이미지를 찾아오려니 Slot의 이미지를 받아오는 문제가 발생함

    • 시도: 이번에는 GameObject.Find("Icon")을 통해 IconImage를 찾아오려 했으나 게임오브젝트 자체는 Image 변수 안에 들어가지 않았다.

    • 부분 해결: 이 부분은 Find로 찾아온 게임 오브젝트에 다시 GetComponent를 시도하는 것으로 해결했다.

    • 문제2: Icon을 찾아오긴 하는데 다른 슬롯의 Icon을 찾아오기 시작...

    • 추정원인: GameObject.Find는 검색 대상이 씬 전체이므로 마지막으로 실행되는 Slot(2)Icon을 찾아오게 되는 것 같았다.

    • 해결: GameObject.Find대신 transform.Find를 사용했더니 자식의 Icon을 잘 찾아왔다.

    • GameObject.Findtransform.Find의 차이점:

      항목GameObject.Find("Icon")transform.Find("Icon")
      검색 대상씬 전체자신의 자식들만
      검색 방식이름으로 전역 탐색자식 Transform만 탐색
      성능❌ 느림 (전역 탐색)✅ 빠름 (로컬 탐색)
      Null 발생많음 (이름 중복/없으면 실패)안정적 (구조만 알면 정확히 탐색 가능)
      경로 지원❌ 단일 이름만 가능"Child/Grandchild"처럼 경로 탐색 가능
    • 완성된 코드는 다음과 같다:

      private void OnValidate()
      {
          skillImage = transform.Find("Icon")?.GetComponent<Image>();
          levelupBtn = transform.Find("LevelUpBtn")?.GetComponent<Button>();
          btnText = levelupBtn.GetComponentInChildren<TextMeshProUGUI>();
      
          _name = transform.Find("Name")?.GetComponent<TextMeshProUGUI>();
          description = transform.Find("Description")?.GetComponent<TextMeshProUGUI>();
      
          skillImage.sprite = data.Icon;
      
          if (data == null) return;
      
          switch(data.type)
          {
              case SkillType.PercentageBuff:
                  levelupBtn.onClick.AddListener(LevelUpPercentageBuff);
                  break;
      
              case SkillType.TimedActive:
                  levelupBtn.onClick.AddListener(LevelUpTimedActive);
                  break;
          }
      }

📍회고 및 반성

  • 유니티를 처음 시작할 때 내가 제일 어렵다고 생각했던 부분이 어떤 오브젝트나 컴포넌트를 찾아올 때 어떤건 this로 접근하고, 어떤건 transform으로 접근하고, 어떤건 gameObject 접근하는게 헷갈린다... 였는데, 유니티를 배우기 시작한지 꽤 지났는데도 내가 아직도 이런 부분을 제대로 이해하지 못한 채로 넘어갔다는 것을 새삼 깨달았다.
  • 나중에 시간을 들여 셋의 차이점이나 컴포넌트/오브젝트의 접근법을 정리해보는 것도 좋을 것 같음! 반성하자!!

0개의 댓글