20230904_ Time.deltaTime & Input Action

Minsang Kim·2023년 9월 4일
0

TIL

목록 보기
17/41

오늘부터 2주간 또 새로운 팀이 편성되었다라는 사실과 내가 팀장이 되었다는 사실. 허허
그리고 유니티에 대해 본격적으로 배워보는 주차가 되겠다.
콘솔 먹고 유니티 먹으니 선녀다.


유니티 리멤버

Time.deltaTime

이전 프레임부터 현재 프레임까지의 경과 시간을 나타내는 것이랍니다.
주로 사용하는 목적은

게임의 프레임 속도에 상관없이 일정한 시간 간격으로 동작하는 게임을 만들기 위해

예를 들자면, 나는 컴퓨터가 좋고 쟤는 컴퓨터가 별로라는 이유로 같은 시간을 배정받지 못한다 ? 이걸 조정하는 것이 델타타임이다라는 말.
더 자세한 예시를 들자면 transform.Translate(Vector3.forward * speed * Time.deltaTime) 이런 식으로 프레임 속도에 관계없이 속도를 보장하는 것이다.

기본적으로 Time.deltaTime은 초 단위의 값을 반환하며, 1초에 1에 가까운 값을 가진다.
게임의 로직이 매 프레임마다 일정한 속도로 실행되어야 할 때 그리고 다양한 기기나 환경에서도 일관된 퍼포먼스를 내야할 때, delatTime을 이용해 이동, 회전, 애니메이션 등의 연산에 일정한 시간 간격을 적용할 수 있다.

어쩌면 리슬라임에서 간헐적으로 속도가 느려진다는 피드백은 델타타임을 적용안해서 그런걸까나. 다음에 시간날 때 확인해보고 적용해보자.

Input System

기존의 Input Manager 대신에 새로운 Input 방식이다.
Package Manager에서 임포트해서 사용해보자.
임포트하면 Create - Input Actions가 가능하다.

'Keyboard&Mouse'라는 새로운 Control Scheme를 만든 모습이다.

  • Action Maps : 주제

  • Actions : SendMessage 방식 On + 이름으로 스크립트에서 액션을 호출한다.

    • Action Type : Value / Button / Pass Through
    • Control Type : 돌려받을 값 (Any, Integer, Vector2, Touch, ...)
  • Binding

    • Path : 입력 (키보드, 마우스, ...)

컴포넌트로 Player Input을 넣어 관리하고 있다. Actions에는 만들었던 Input Actions를 넣어주면 된다.
컴포넌트를 보면 Action으로 만든 Move, Look, Fire를 SendMessage 방식으로 OnMove, OnLook, OnFire를 한다고 표시되어 있다.

이동을 하기 위한 스크립트만 3개나 된다. 하나하나 살펴보자.

public class CharacterController : MonoBehaviour
{
    public event Action<Vector2> OnMoveEvent;

    public void CallMoveEvent(Vector2 direction)
    {
        OnMoveEvent?.Invoke(direction);
    }
}
  • CharacterController.cs
    Vector2 액션을 위한 이벤트가 선언되어 있고, null이 아닐때 실행된다.
using UnityEngine.InputSystem;

public class Player : CharacterController
{
    public void OnMove(InputValue value)
    {
        Vector2 moveInput = value.Get<Vector2>().normalized;
        CallMoveEvent(moveInput);
    }
}
  • Player.cs
    위의 스크립트를 상속받았다. 여기서는 Input System에서의 Move를 받아오기 위한 OnMove 메소드가 구현되어 있다. 그러기 위해서는 using UnityEngine.InputSystem;을 해야한다는 것을 잊지말자.
    어쨌든 정규화된 InputValue를 받아와서 이를 Vector로 변환시켜주고 이를 이벤트에 넣고 있다.
public class Movement : MonoBehaviour
{
    private TopDownCharacterController _controller;

    private Rigidbody2D rb;

    private void Awake()
    {
        _controller = GetComponent<TopDownCharacterController>();
        rb = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        _controller.OnMoveEvent += MoveAction;
    }

    private void MoveAction(Vector2 direction)
    {
        rb.velocity = direction * 5;
    }
}
  • Movement.cs
    Move 메소드를 통해 rigidbody.velocity 값을 정해주면서 이동한다.

3개를 종합해서 정리해보자.

먼저 CharacterController.액션 이벤트를 만들어 -> 거기에 Movement.Move 얹어 -> Input System에서 Player.OnMove 호출할 때까지 대기 -> Player.OnMove 호출되면 CharacterController.CallMoveEvent 메소드 실행 -> 이벤트 Invoke하면서 이동완료

이걸로 리슬라임 모바일 프로젝트를 진행할 수 있을까 ?


세줄 요약

  • 콘솔 안그립읍니다.
  • 델타 타임
  • 리슬라임 모바일화 ?
profile
게임만 하다가 개발자로

0개의 댓글