2025.04.07 (월)

윤혜진·2025년 4월 7일

📍오늘의 학습 키워드

  • 최종 프로젝트 2일차
  • 스테이지 관련 클래스 작업
  • 웨이포인트

📍진행 작업

  • 스테이지 관련 클래스 작업

    • 클래스 다이어그램을 토대로 UserManagerStageManager를 만들었다.
    • 타워와 몬스터가 만들어지면 연결하고 스테이지를 관리해주어야 하기 때문에 주로 빈 메서드 위주로 얼추 흐름만 만들어 놓았음.
  • 웨이포인트

    using System.Linq;
    using UnityEngine;
    
    public class WayPoint : MonoBehaviour
    {
       [SerializeField]
       private Transform[] wayPoint;
    
       private void OnValidate()
       {
           //본인을 제외하고 자식의 Transform만 가져온다.
           wayPoint = GetComponentsInChildren<Transform>(true)
                      .Where(t => t != transform)
                      .ToArray();
       }
    
       public Transform[] GetWayPoint()
       {
           return wayPoint;
       }
    }
    • 우리 게임은 구불구불한 맵을 몬스터가 이리저리 방향을 틀며 이동해야 하기 때문에, 그 회전 포인트들을 지정하고 저장할 필요가 있었음.
    • 특정 포인트에서 회전하고, 이동하는 기능은 몬스터 쪽에서 구현하기로 했기 때문에, 스테이지 쪽에서 할 일은 웨이포인트를 지정하고, 몬스터 쪽에서 접근하기 쉽도록 만드는 일밖에 없었음.
    • 그래서 WayPoint라는 빈 오브젝트를 만들어 자식 오브젝트의 transform을 찾아내 저장할 수 있도록 함
    • 아래 사진을 보면 새로운 오브젝트가 생겨도 자동으로 추가된다:


    • StageManager를 통해 WayPoint에 접근할 수 있도록 해야 하므로 StageManager가 WayPoint를 찾을 수 있도록 다음과 같은 코드를 붙여 넣었다:
      private void OnValidate()
      {
         /// <summary> OnValidate 관련 </summary>
         ///
         /// OnValidate는 에디터 함수이기 때문에
         /// Find를 사용해도 빌드한 최종 결과물에는 영향을 주지 않음
         /// 다만 너무 남용할 경우 오류가 생길 수 있으니 GetComponent정도만 사용할 것
      
         wayPoint = GameObject.Find("WayPoint")?.GetComponent<WayPoint>();
      
      }
    • 위 방법은 오브젝트의 이름이 달라지면 WayPoint를 찾아오지 못한다는 문제점이 있지만 WayPoint의 경우 프리팹으로 만들어 메인 씬에 넣을 수 있도록 할 예정이므로 크게 문제가 되진 않으리라 생각했다.
    • 이 코드를 쓰면 아래처럼 웨이포인트를 자동으로 잘 찾아오는 것을 확인할 수 있다:

📍겪은 어려움

  • GetComponentsInChildren문제

  • 웨이포인트를 받아오기 위해 GetComponentsInChildren<Transform>를 통해 자식들의 transforn 정보를 받아오려고 했는데, 막상 이 코드를 사용하니 자식뿐만 아니라 본인의 transform까지 가져오는 문제가 발생했다.

  • 찾아봤지만 자식의 컴포넌트만 검색해 주는 메서드는 따로 없는 것 같아 결국 다음과 같은 방식으로 해결했다:

    private void OnValidate()
    {
       //본인을 제외하고 자식의 Transform만 가져온다.
       wayPoint = GetComponentsInChildren<Transform>(true)
                  .Where(t => t != transform)
                  .ToArray();
    }
    • 한 줄씩 설명하자면:
    • GetComponentsInChildren<Transform>(true): 자식들의 트랜스폼을 모두 가져오는데 (true: 비활성화된 자식까지 포함)
    • Where(t => t != transform): transform이 아닌 것들만 가져오고 (자신의 transform과 다른 값인 transform만 가져오고)
    • ToArray(): 배열 형태로 반환하라
      형태는 조금 다르지만 람다와 링큐를 다뤘던 TIL링크를 첨부: 👉2025.01.30 (목)
  • 폰트가 안 구워지는 문제 발생

    • 옵션은 잘 설정해 준 것으로 확인
    • 해당 TIL과 똑같은 옵션으로 맞춰주었는데도 오류가 떴음 👉2025.03.05 (수)
    • 원인 발견 및 해결: 폰트 파일이 한글로 되어있었는데 혹시나 하고 폰트 파일명을 영어로 변경하니 잘 구워졌다.

📍회고 및 반성

  • 얼추 구조가 잡혔고 웨이포인트에 접근할 수 있도록 토대도 만들어 두었으니 계획대로 임시 데이터테이블을 만들고 연결해보려고 하는데, 내가 상대적으로 할 수 있는 일이 적은 것 같아서 팀원들에게 양해를 구하고 데이터 테이블을 유니티에 연결하는 부분을 맡아보려고 함.
  • 어떤 방식이 좋을지는 튜터님과 상의해 볼 예정!

2개의 댓글

comment-user-thumbnail
2025년 4월 10일

' 앞으로는 완벽하지 않더라도 당일에 TIL을 올릴 것.
왜냐하면 그게 TIL이니까…… '

오늘 혜진 님 TIL 읽다가 발견한 문구예요.
살아계시나요.

답글 달기
comment-user-thumbnail
2025년 4월 11일

잘~읽고 또 방문할께요~ 좋은 하루되세요
제 블로그 포스트 오집마도 한번 들러서 확인해주세요 ^^

답글 달기