오늘 학습 키워드

최종 팀 프로젝트

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

코드 리팩토링 하기

  • 플레이어의 상태를 FSM으로 관리할 수 있도록 코드 리팩토링을 진행
public interface IPlayerState
{
    void Enter(PlayerController player); // 상태 변화했을 때 돌아감 
    void HandleInput(PlayerController player); // 입력에 따른 상태 전환 등을 처리
    void LogicUpdate(PlayerController player); // 실제 로직이 돌아가는 부분
    void Exit(PlayerController player); // 상태에서 나갈 때 돌아감
}
public class PlayerController : MonoBehaviour
{
    public PlayerInputs Inputs { get; private set; }
    public PlayerMove PlayerMove { get; private set; }
    private IPlayerState currentState;
 
    private void Awake()
    {
        Inputs = new PlayerInputs();
        Inputs.Enable();
        PlayerMove = GetComponent<PlayerMove>();
    }
 
    private void Start()
    {
        currentState = new IdleState();
        currentState.Enter(this);
    }
 
    private void OnEnable()
    {
        Inputs.Player.Look.performed += CursorManager.Instance.OnLook;
        Inputs.Player.Pause.started += PlayerMove.OnPause;
    }
 
    private void OnDisable()
    {
        Inputs.Player.Look.performed -= CursorManager.Instance.OnLook;
        Inputs.Player.Pause.started -= PlayerMove.OnPause;
    }
 
    private void Update()
    {
        currentState.HandleInput(this);
        currentState.LogicUpdate(this);
    }
 
    private void LateUpdate()
    {
        PlayerMove.Look(); // 마우스 이동으로 인한 방향 전환은 State와 별개
    }
 
    public void ChangeState(IPlayerState newState)
    {
        currentState.Exit(this);
        currentState = newState;
        currentState.Enter(this);
    }
 
    public void SetAnimation(string animName)
    {
        PlayerMove.SetAnimation(animName);
    }
}

그래서 나온 FSM 상태표

애니메이션 넣어주기

  • 이동 후 멈추는거랑 착지 후 랜딩포즈 취하는거 때문에 조금 더 늘어남

모의 면접 대비 공부

  • Q1. 생성자에 대해 간단하게 설명해주세요.

  • A1. 클래스의 인스턴스가 처음에 생성될 때 자동으로 불리는 메소드입니다. 인스턴스의 초기화 작업을 담당합니다.

  • Q2 .override와 overload에 대해 설명해주세요.

  • A2. override는 상속 관계에서 부모의 함수를 자식이 재정의 하는 것이고, overload는 같은 이름의 함수를 매개변수의 개수나 타입을 달리해 여러 형태로 정의하는 것입니다.

  • Q3. Unity에서 사용하는 델리게이트 혹은 이벤트에는 어떤 것이 있나요?

  • A3. 유니티에서 자체 제공하는 UnityAction과 UnityEvent가 있습니다. UnityAction은 C#에서 델리게이트와 같이 메서드를 구독하고 호출할 수 있습니다. UnityEvent는 UnityAction처럼 메서드를 구독할 수 있고, 이에 더불어 인스펙터 창에서도 메서드를 연결할 수 있다는 특징을 가집니다. UnityEvent 대표적인 예시로는 Button의 OnClick 리스너와 같은 UI 리스너가 있습니다.

  • Q3-2. 왜 UI에서는 UnityEvent를 쓰고, InputSystem에서는 일반 델리게이트를 쓸까?

  • A3-2. UI는 인스펙터에서 이벤트를 추가/삭제할 수 있도록, 인스펙터 친화성이 중요하기 때문에 인스펙터 조작이 가능한 UnityEvent를 사용합니다. 따라서 UI는 코드 수정 없이도 에디터 상에서 이벤트를 추가하거나 제거할 수 있습니다. 그러나 InputSystem은 실시간 성능과 반복 호출이 중요하기 때문에 일반 C# 델리게이트를 씁니다. UnityEvent는 인스펙터 지원을 위해 내부적으로 추가적인 관리가 필요하므로, 성능상 약간의 오버헤드가 발생합니다.

  • Q4. 박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.

  • A4.

    • 박싱 : 값 타입의 데이터를 참조 타입으로 변환하는 과정
      1. 힙에 새 객체를 할당함 (힙에 자리를 할당)
      2. 그 객체에 값 타입의 데이터를 복사함
      3. 할당한 객체의 참조를 반환함
    • 언박싱 : 참조 타입의 데이터를 값 타입으로 변환하는 과정
      • 박스(참조 타입 데이터 객체) 안에 있는 데이터를 꺼내와서 타입을 검사한 후, 값 타입으로 복사함
    • 이 때문에 박싱의 경우에는 힙 할당 비용이 추가적으로 발생함.
  • Q4-2. 왜 힙 할당 비용은 스택과 달리 신경쓰는 걸까요?

  • A4-2. 스택 메모리는 추가로 할당할 때 CPU에서 스택 포인터를 이동시키는 것 만으로 할당이 끝나는데, 힙 메모리는 힙에서 빈 공간을 찾아서 객체를 넣고, 메타데이터를 기록하며, 나중에 GC가 수거할 수 있도록 준비해야 하는 등의 추가적인 과정이 필요하기 때문입니다.

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

문제 1

  • 문제&에러에 대한 정의

자꾸 콜라이더 때문에 땅에서 점프할 때도 땅으로 처음에 인식함

  • 내가 한 시도 / 해결 방법

그래서 그냥 법선벡터 힘 찾아서 그거 일정 이상일 때에만 땅으로 인지하도록 함

내일 학습 할 것은 무엇인지