2025.03.04 (화)

윤혜진·2025년 3월 4일
post-thumbnail

📍오늘의 학습 키워드

  • unity 게임 개발 숙련 1주차 (1-1~1-6)
    • InputAction 를 이용한 플레이어 이동
    • 방어 코드 (object 동적 생성)
    • Fill Amount 를 이용한 프로그래스 바 구현
    • Vertical Layout Group 를 이용한 UI 정렬

📍학습 내용

  • InputAction

    • 플레이어가 사용할 키 값:

      • Move: W, A, S, D
      • Jump: Space bar
      • Inventory: Tab
      • Attack: Left Mouse Button
      • Rotation: Mouse Rotation
      • Root: E
    • Window > Package Manager > Packages : Unity Registry > Input System 설치

    • Input System 설치 후 project 창에서 Input Action을 만들어 준다

    • 만든 Input Action을 클릭 > Edit asset 버튼 클릭

    • 필요한 값(처음 정리했던 플레이어가 사용할 키 값)을 추가해준다.

    • 필요한 키 값을 전부 추가했다면 Save Asset을 눌러 저장한 뒤, 세팅한 Input ActionPlayer에 붙여준다.

    • 이후 버튼에 Event를 추가하는 것처럼 스크립트를 통해 Event를 추가해줄 수 있다.

    • 아래는 사용했던 Move 스크립트:

      private Rigidbody _rigidbody;
       private Vector2 curMovementInput;
      
      private void Awake()
      {
          _rigidbody = GetComponent<Rigidbody>();
      }
      
      void FixedUpdate()
      {
          Move();
      }
      
      void Move()
      {
          Vector3 dir = transform.forward * curMovementInput.y + transform.right * curMovementInput.x;
          dir *= moveSpeed;
          dir.y = _rigidbody.velocity.y;
      
          _rigidbody.velocity = dir;
      }
      
      //W, A, S, D 키가 눌렸을 때 실행된다.
      public void OnMove(InputAction.CallbackContext context)
      {
          //키를 누르는 중일 때
          if(context.phase == InputActionPhase.Performed)
          {
              curMovementInput = context.ReadValue<Vector2>();
          }
          //키가 떨어졌을 때
          else if(context.phase == InputActionPhase.Canceled)
          {
              curMovementInput = Vector2.zero;
          }
      }
    • 위 스크립트 처럼 phase 를 통해 입력받은 키값의 다양한 상태를 확인하고, 각 상태에 맞는 로직을 실행시켜줄 수 있다.

      • Waiting: 입력을 기다리는 중 (사용자가 아직 키를 누르지 않음)
      • Canceled: 입력이 취소됨 (예: 키를 빠르게 눌렀다가 놓음)
      • Performed: 입력이 완료됨 (예: 키를 누르고 있음)
      • Started: 입력이 시작됨 (예: 키를 누르기 시작함)
      • Disabled: 입력이 비활성화됨 (해당 액션이 꺼져 있음)
  • 방어코드 (동적 생성)

    • 아래처럼 방어코드를 짜두면 GameObject를 Hierarchy 창에서 만드는 것을 깜빡하더라도 괜찮다. (코드로 생성 가능)
         private static CharacterManager _instance;
         public static CharacterManager Instance
         {
             get
             {
                 if(_instance == null)
                 {
                     _instance = new GameObject("CharacterManager").AddComponent<CharacterManager>();
                 }
                 return _instance;
             }
         } 
  • Fill Amount를 이용한 프로그래스 바 구현

    • Window > Package Manager > Packages : Unity Registry > 2D Sprite 설치

    • 추가된 Fill Amount 값을 이용하여 프로그래스 바를 구현할 수 있다.

  • Vertical Layout Group 를 이용한 UI 정렬

    • 빈 오브젝트 생성 > Shift + Alt 를 통해 오른쪽 하단 정렬

    • Add Component를 통해 빈 오브젝트에 Vertical Layout Group 추가

    • 생성한 빈 오브젝트에 Health를 넣으면 자동으로 정렬되는 모습을 볼 수 있다.

    • Health를 복사해도 자동으로 정렬된다.

    • Vertical Layout Group은 자식 객체들을 세로로 정렬시켜주고, Horizontal Layout Group은 자식 객체들을 가로로 정렬시켜준다.

    • Grid Layout Group은 두 개가 혼합된 느낌으로, 자식 객체들을 바둑판 처럼 정렬한다. (인벤토리를 만들 때 사용할 예정)

    • 개인적으로 참고한 블로그 👉 [Unity][UI] 레이아웃 그룹(Layout Group)

  • 마우스를 숨기는 방법

    void Start()
    {
      //마우스를 숨기는 방법
      Cursor.lockState = CursorLockMode.Locked;
    }

📍겪은 어려움

  • Move 메서드에서 dir.y = _rigidbody.velocity.y; 를 해주어야 하는 이유

    void Move()
    {
      Vector3 dir = transform.forward * curMovementInput.y + transform.right * curMovementInput.x;
      dir *= moveSpeed;
      dir.y = _rigidbody.velocity.y;
    
      _rigidbody.velocity = dir;
    }
    • dir.y = _rigidbody.velocity.y; 를 해주어야 하는 이유를 앞, 뒤, 좌, 우로 움직일 때 점프를 하는 것처럼 y축이 변하지 않도록 하기 위해 초기화 해주는 것으로 이해를 했는데, 정작 dir.y = _rigidbody.velocity.y; 코드를 지워보니 반대의 결과가 나왔다 (내가 커서를 올려 움직이는대로 y축이 올라가는 것이 아니라, 점프가 되지 않음)
    • 알고보니 transform.forward(0, 0, 1)에 rotation(객체가 바라보는 방향)을 곱해준 값이었고, transform.right(1, 0, 0)에 rotation을 곱해준 값이었기 때문에 dir의 y값은 0이 나오고 있었다.
    • 때문에 dir.y = _rigidbody.velocity.y; 코드를 지우고 점프를 하려고 하면, FixedUpdate에 있는 Move 메서드가 y값을 0으로 초기화 하면서 점프를 막았던 것.

📍회고 및 반성

  • 최근 개인과제 일정이 촉박하다는 이유로 TIL에 소홀했는데, 그러다 보니 공부했던 것을 제대로 내 것으로 만들었다는 느낌이 들지 않았다.
  • 그래서 이번에는 일정에 조바심 느끼지 않고 내 페이스대로 천천히 정리하고 복습하며 공부해보려고 한다. 유니티 숙련 과정도 화이팅!!!!!

1개의 댓글

comment-user-thumbnail
2025년 6월 9일

퍼가요

답글 달기