2025.03.13 (목)

윤혜진·2025년 3월 13일

📍오늘의 학습 키워드

  • Unity 숙련 주차 - 팀 프로젝트

    • 트러블슈팅

📍학습 내용

  • 우리 팀은 이번 3D 팀 프로젝트에서 포탈을 구현해보기로 했는데, 내가 맡은 부분은 버튼과 문의 상호작용이었다.
  • 내가 구현해야 했던 것:
    • 박스나 플레이어가 버튼 위로 올라오면 충돌 처리를 해서 내려가야 함
    • 문은 버튼이 눌리고 떨어지는 것을 실시간으로 감지하고 열려야 함
    • 때문에 ButtonDoor클래스를 만들어 Button에서 눌림을 감지하는 bool 변수가 true가 되면 Door 스크립트에서 문을 열어주고, flase가 되면 문을 닫아주는 형식으로 해당 기능을 구현함.
  • 생긴 문제:
    • 나는 버튼 하나와 문 하나를 연결해주는 경우만 생각하고 코드를 짰는데, 원작 게임인 포탈을 다시 살펴보니 버튼이 하나가 아닌 경우도 있었고 문을 여는 오브젝트가 버튼이 아니라 다른 오브젝트인 경우도 있었다.
  • 해결 방식:
    • Door와 연결된 오브젝트들을 모두 모아 관리해주고, Door에게 신호를 보내주는 DoorManager 라는 클래스를 만들어 주었다.
    • 또한 버튼이 아니라 다른 오브젝트들이 사용될 경우를 상정해 ITriggerObject 라는 인터페이스를 만들어주었다.
    • DoorManager에서는 triggerObject = GetComponentsInChildren<ITriggerObject>(); 코드를 통해 ITriggerObject를 상속받은 자식들을 전부 찾아와 저장하므로, 버튼이 아닌 다른 오브젝트로 문을 열고 싶다면 ITriggerObject 인터페이스를 상속시키기만 한다면 버튼처럼 쓸 수 있다.
  • 실제 작성 코드:
using UnityEngine;

public interface ITriggerObject
{
   bool TriggerCheck { get; set; }
   void Enter();
   void Exit();
}

public class DoorManager : MonoBehaviour
{
   public ITriggerObject[] triggerObject;
   public Door door;

   private void OnValidate()
   {
       triggerObject = GetComponentsInChildren<ITriggerObject>();
       door = GetComponentInChildren<Door>();
   }

   private void Update()
   {
       Decision();
   }
   public void Decision()
   {
       for (int i = 0; i < triggerObject.Length; i++)
       {
           if (triggerObject[i].TriggerCheck == false)
           {
               door.Close();
               return;
           }
       }
       door.Open();
   }
}
  • 개선해야 할 사항:
    • Decision 이 Update 에서 계속 돌고 있으므로, 이 부분을 리팩토링해야 할 필요성이 있음. 나중에 꼭 개선할 것!!

0개의 댓글