오늘 학습 키워드

개인 프로젝트 해내기

오늘 학습 한 내용을 나만의 언어로 정리하기

필수 기능

기본 이동 및 점프

  • 저번에 스탠다드반 Input System에서 배운 Auto Generate 써보기로 함
  • 완성

체력바 UI

  • 실습 때와 동일하게 진행
  • 대신에 챌린지반 디자인 패턴에서 따온 Event Bus를 써보기로 함
  • 체력, 허기, 스태미나를 Observable<T>로 한 번 감싸서 만듬
  • 그리고 Event Bus에 쓰이는 키를 Constant로 따로 만듬

동적 환경 조사

// PlayerController.cs
private void Start()
{
    // 여기 있는게 너무 맘에 안드는데 방법이 없나... 
    // 생성 순서 때문에 어쩔 수 없이 여기다 뒀는데 너무 거슬림
    playerInput.Player.Interact.started
        += PlayerManager.Player.interaction.OnInteraction;
 
    Cursor.lockState = CursorLockMode.Locked;
}
 
 
private void OnEnable()
{
    playerInput = new();
 
    playerInput.Player.Move.performed += OnMove;
    playerInput.Player.Move.canceled += OnMoveStop;
 
    playerInput.Player.Jump.started += OnJump;
 
    playerInput.Player.Look.performed += OnLook;
    playerInput.Player.Look.canceled += OnLookStop;
 
    playerInput.Player.Enable();
    playerInput.Change.Enable();
}
  • 맘에 안드는데 일단 저기다 둠

점프대

  • 대충 작성 완료

아이템 데이터

  • SO로 관리
  • 인벤토리 만들기

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

Image Type이 안떴었다

  • 내가 한 시도

2D Sprite를 깔고 다시 해봤다

  • 해결 방법

알고보니 Source Image에 넣으면 해결됨

  • 이 문제&에러를 다시 만나게 되었다면?

일단 할당을 해놓고 생각하자

문제 2

  • 문제&에러에 대한 정의

IInteractable 이 null 이었다.

  • 내가 한 시도

디버그를 찍어봤는데, GameObject는 잡히는데 IInteractable이 안잡혔다.

  • 해결 방법

설마 하고 보니 실제로 모델링이 잡혀있고 콜라이더가 있던 자식 오브젝트만 잡아서 부모 오브젝트에 달려있는 IInteractable이 안잡혔던 것

  • 새롭게 알게 된 점

hit.collider는 진짜 콜라이더가 있는 그 객체를 찾기 때문에 부모에다가 뭐 두면 GetComponent로 못찾아온다.

  • 이 문제&에러를 다시 만나게 되었다면?

콜라이더는 부모에 두자..

문제 3

  • 문제&에러에 대한 정의

딸기밭 팀플에서 입력 옵션을 만들고 있는데 Input Action Map에 따라 알아서 입력 옵션이 나타나게끔 만들려고 했음 근데 그게 잘 안됐음

  • 내가 한 시도

챗지피티에게 도움을 요청함

  • 해결 방법
private void ShowBindings(InputAction action)
{
    if (action.bindings.Count > 1 && action.bindings[0].isComposite)
    {
        // Composite (예: 2D Vector)
        for (int i = 0; i < action.bindings.Count; i++)
        {
            if (action.bindings[i].isComposite) continue; // "2D Vector" 같은 Composite 헤더는 스킵
            string partName = action.bindings[i].name;    // "Up", "Down", "Left", "Right"
            string keyName = action.GetBindingDisplayString(i); // W, S, A, D
            Debug.Log($"{action.name} - {partName}: {keyName}");
        }
    }
    else
    {
        // 단일 바인딩
        Debug.Log($"{action.name}: {action.GetBindingDisplayString()}");
    }
}
 
  • 새롭게 알게 된 점

Composite는 합성 바인딩이라는 의미. 여러 개의 하위 입력을 합쳐서 하나의 액션 값으로 만드는 것을 합성 바인딩이라고 함. Move(WASD)의 경우에는 W, A, S, D 하나 하나를 입력받아서 Vector2 형태로 반환하는 방식임. 따라서 Move는 합성 바인딩임. 합성 바인딩 안에 있는 하위 요소를 하나 하나 출력해 주어야 함.

  • 이 문제&에러를 다시 만나게 되었다면?

isComposite로 분류하자.

내일 학습 할 것은 무엇인지

인벤토리 만들기 끝내고 도전과제도 최대한 해보기