내일배움캠프 23일차 TIL : InputSystem 특강, 구조 피드백

김정환·2024년 10월 16일
0

키워드

  • 구조 피드백
  • InputSystem 특강

구조 피드백

오늘은 구조를 정리한 것을 송지원 튜터님께 피드백을 받아봤다.

피드백

  • 구조 관련
    • 인터페이스를 만드는 이유 : 공통된 사용을 위한 것.
      • 현재 구조에서는 벽돌 외에 부술 수 있는 객체가 있는 것이 아니므로 굳이 인터페이스를 만들 필요가 없다.
      • 만약 벽돌 외에 슬라임 등등의 부술 수 있는 객체가 있었다면 써도 되지만 벽돌만 있는 상태에선 굳이 인터페이스를 만들어서 상속할 필요가 없다.
      • 설계 전에 왜 적용해야하는지 이유가 필요하다.
        • 이유가 없다면 구현할 필요가 없는 것.
      • 반드시 왜 만들어야 하는지, 이유가 무엇인지 생각할 것.
    • 불명확한, 중복되는 네이밍 :
      • 이름으로 어떤 기능인지 직관적으로 알 수 있어야한다.
      • 지금같은 경우는 BrickManager, GameScene 이라는 두 클래스가 있다.
        • GameScene : 인 게임에서 기능을 관리하는 클래스로 보인다.
        • BrickManager : 벽돌 관련해서 관리하는 클래스로 보인다.
        • 지금 게임에서는 벽돌믈 만들고 부수는 것이 게임 관리하는 기능이다.
          굳이 이 둘을 나눌 필요가 없다. 이 둘은 통합해서 사용하는 것이 더 깨끗할 것.
      • Save and Load(임시) : 이 부분도 Save Manager로 직관적으로 변경하는 것이 낫다.
      • StartScene : 마찬가지 이유로 다른 방법으로 변경하는 것이 낫다.
  • 전달성 관련
    • 만약 다른 사람과 구조를 공유하려거든, 표기 등에 명확한 기준, 규칙을 정하고 전달해야한다.
    • 클래스 구조나 명칭만 있기보다는 노트를 만들어서 어떤 식으로 만들지 작성해놓는 것이 필요

후기

  • 우선 복잡한 구조들의 원인이 불필요한 상속, 설계 때문이었다.
    • 피드백대로 이유없는 인터페이스, 상속 등으로 인해서 쉬운 기능도 더 어렵게 나타나는 것이다.
    • 반드시 무언가를 구현할 때, 그 구현에 대한 이유가 있어야한다.
  • 종종 구조 관련해서 피드백을 받는 것이 전체 방향성을 잡는데 좋을 것 같다.

InputSystem 특강

기존 유니티 Input 방식을 이용한다면 많은 경우 클래스에 다음과 같은 상황이 발생한다.

문제 1 : InputManager 리바인딩의 어려움

기존 방식인 InputManager을 이용하면 게임 내에서 사용자가 원하는대로 리바인딩하기 매우 까다롭다.

문제 2 : 코드 정리

InputManager의 문제는 아니지만, 사용하다보면 다음 클래스와 같은 문제가 나타난다.

  • Player 클래스
    • 입력을 받는 기능 (책임 1)
    • 받은 입력으로 움직임을 계산하는 기능 (책임 2)

이는 SRP를 위배하는 방식이라 객체지향적 개발에서는 지양해야할 사항이다.

대안 : InputSystem

유니티에서는 새로운 InputSystem을 지원하기 시작했고 Unity 6에서는 정식으로 이 기능을 지원하고 있다.
그러므로 버전이 올라감에 따라 InputSystem에 적응해야할 이유가 커졌다.

사용법

복습하면서 더 정리할 필요가 있음

Direct 방식

레거시 Input과 유사한 방법이다.

using UnityEngine.InputSystem;

Keyboard keyboard;
Mouse mouse;
Gamepad gamepad;

void Start()
{
	keyboard = Keyboard.current;
    mouse = Mouse.current;
    gamepad = GamePad.current;
}

void Update()
{
	if(keyboard.aKey.isPressed)
    {
    	~
    }
    else if(keyboard.dKey.isPressed)
    {
    	~
    }
    
    //
}

Imbedded 방식

인스펙터에서 직접 바인딩 가능.
Update를 안 쓰고 쓸 수 있음. 이제부터 이벤트 방식을 사용.

using UnityEngine.InputSystem;

public float dir;
public InputAction moveAction;
public InputAction jumpAction;

// 오브젝트가 켜졌을 때 구독하고
// 꺼졌다면 구독해제해 주는 것이 프로그래밍 관점에서 완성된 동작
void OnEnable()
{
	// 이벤트 방식
    // 구독
    moveAction.performed += PlayerMove;
    moveAction.canceled += PlayerStop;
    
    // 사용 시작
    moveAction.Enable();
}

void OnDisable()
{
    // 사용 종료
    moveAction.Disable();
    
	// 구독 해제
    moveAction.performed -= PlayerMove;
    moveAction.canceled -= PlayerStop;
    
}

void PlayerMove(InputAction.CallbackContext value)
{
	dir = value.ReadValue<float>();
}

void PlayerStop(InputAction.CallbackContext value)
{
	dir = 0;
}

Action Asset 방식

  • 강의 방식 -> 액션 에셋에 PlayerInput 사용
    • InputActionAsset에 직접 접근해 쓸 수 있음

C# Generate 방식

  • 가장 진화된 방식.
  • 액션 에셋을 보면 Generate C# 클래스라는 버튼이 있음.
    누르면 c# 클래스 > json 형태로 입력한 액션들로 작성된 코드가 나옴.
    이 클래스를 받아와 클래스 스크립트 사용하듯이 사용할 수 있음.

InputAction Asset 세부 사용

  • Interaction 탭 : 세부적인 입력 감지 방법에 대한 것
  • Processors : 입력에 대한 처리 구간
  • modifier : 어떤 입력을 받을 때, 부가적으로 다른 키를 누를 수 있도록 함.

자세한 내용

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글