
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
코드 리팩토링 하기
- 플레이어의 상태를 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.
- 박싱 : 값 타입의 데이터를 참조 타입으로 변환하는 과정
- 힙에 새 객체를 할당함 (힙에 자리를 할당)
- 그 객체에 값 타입의 데이터를 복사함
- 할당한 객체의 참조를 반환함
- 언박싱 : 참조 타입의 데이터를 값 타입으로 변환하는 과정
- 박스(참조 타입 데이터 객체) 안에 있는 데이터를 꺼내와서 타입을 검사한 후, 값 타입으로 복사함
- 이 때문에 박싱의 경우에는 힙 할당 비용이 추가적으로 발생함.
- 박싱 : 값 타입의 데이터를 참조 타입으로 변환하는 과정
-
Q4-2. 왜 힙 할당 비용은 스택과 달리 신경쓰는 걸까요?
-
A4-2. 스택 메모리는 추가로 할당할 때 CPU에서 스택 포인터를 이동시키는 것 만으로 할당이 끝나는데, 힙 메모리는 힙에서 빈 공간을 찾아서 객체를 넣고, 메타데이터를 기록하며, 나중에 GC가 수거할 수 있도록 준비해야 하는 등의 추가적인 과정이 필요하기 때문입니다.
학습하며 겪었던 문제점 & 에러
문제 1
- 문제&에러에 대한 정의
자꾸 콜라이더 때문에 땅에서 점프할 때도 땅으로 처음에 인식함
- 내가 한 시도 / 해결 방법
그래서 그냥 법선벡터 힘 찾아서 그거 일정 이상일 때에만 땅으로 인지하도록 함