2023. 11. 27. 13:31ㆍ스파르타코딩클럽 게임개발
오늘은 새로이 배운 Input System을 소개해보겠다.
- New Input System
New Input System의 핵심 개념들- Input Action: 입력 행동을 정의합니다. 예를 들어 "점프", "공격" 등의 행동을 정의하고, 이러한 행동을 트리거하는 키 또는 버튼을 지정할 수 있습니다.
- Input Action Asset: 여러 개의 입력 행동을 그룹화하는 방법입니다. 이를 통해 재사용 가능한 입력 설정을 만들어 게임 내의 다른 캐릭터나 메뉴에 적용할 수 있습니다.
- Player Input Component: Unity의 New Input System에 추가된 새로운 컴포넌트로, 자동으로 입력 행동을 처리하고 해당 게임 오브젝트에 메시지를 보냅니다.
- Cross-Platform Compatibility: New Input System은 다양한 플랫폼과 입력 장치에 대해 일관된 방식으로 작동합니다.
- Rebinding: 플레이어가 게임 내에서 자신의 입력 설정을 변경할 수 있도록 지원합니다.
- Multiplayer Support: 여러 플레이어가 동일한 장치에서 게임을 플레이하거나, 각각의 장치에서 게임을 플레이할 때 입력을 쉽게 처리할 수 있습니다.Input System은 따로 패키지매니저에서 설치해야하는데 그 과정을 살펴보자.
설치 과정
Window → Package Manager → Unity Register → Input System → Install
설치를 완료했으면 이젠 Input System을 사용할 준비를 하자.
자 이제 모든 준비는 끝났다.
이제 스크립트를 만들 차례다.
TopDownCharacterController 만들기
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TopDownCharacterController : MonoBehaviour
{
// 이벤트 정의: 캐릭터 이동 시 발생하는 이벤트
public event Action<Vector2> OnMoveEvent;
// 이벤트 정의: 캐릭터 시선 이동 시 발생하는 이벤트
public event Action<Vector2> OnLookEvent;
// 캐릭터 이동 이벤트 호출 메서드
public void CallMoveEvent(Vector2 direction)
{
// 이벤트가 null이 아닌 경우에만 이벤트 호출
OnMoveEvent?.Invoke(direction);
}
// 캐릭터 시선 이동 이벤트 호출 메서드
public void CallLookEvent(Vector2 direction)
{
// 이벤트가 null이 아닌 경우에만 이벤트 호출
OnLookEvent?.Invoke(direction);
}
}
PlayerInputController 만들기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInputController : TopDownCharacterController
{
// 주인공을 따라다니는 메인 카메라
private Camera _camera;
private void Awake()
{
// Awake에서 메인 카메라를 참조
_camera = Camera.main;
}
// 이동 입력 처리 메서드
public void OnMove(InputValue value)
{
// 입력 값에서 벡터를 추출하고 정규화하여 이동 이벤트 호출
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
// 시선 이동 입력 처리 메서드
public void OnLook(InputValue value)
{
// 입력 값을 벡터로 가져오고 해당 위치를 월드 좌표로 변환
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
// 플레이어 위치에서 해당 위치로 향하는 벡터를 정규화
newAim = (worldPos - (Vector2)transform.position).normalized;
// 정규화된 벡터의 크기가 0.9 이상이면 시선 이동 이벤트 호출
if (newAim.magnitude >= 0.9f)
{
CallLookEvent(newAim);
}
}
// 발사 입력 처리 메서드
public void OnFire(InputValue value)
{
// 발사 입력에 대한 처리 (현재는 로그만 출력)
Debug.Log("OnFire" + value.ToString());
}
}
TopDownMovement 만들기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TopDownMovement : MonoBehaviour
{
// TopDownCharacterController 컴포넌트 참조를 위한 변수
private TopDownCharacterController _controller;
// 이동 방향을 저장하기 위한 변수
private Vector2 _movementDirection = Vector2.zero;
// Rigidbody2D 컴포넌트 참조를 위한 변수
private Rigidbody2D _rigidbody;
private void Awake()
{
// 초기화: TopDownCharacterController 및 Rigidbody2D 컴포넌트 참조
_controller = GetComponent<TopDownCharacterController>();
_rigidbody = GetComponent<Rigidbody2D>();
}
private void Start()
{
// 이벤트 핸들러 등록: TopDownCharacterController의 이동 이벤트에 Move 메서드 연결
_controller.OnMoveEvent += Move;
}
private void FixedUpdate()
{
// FixedUpdate에서 이동 적용
ApplyMovement(_movementDirection);
}
// 이동 이벤트 핸들러
private void Move(Vector2 direction)
{
// 이동 방향 갱신
_movementDirection = direction;
}
// 실제 이동 적용 메서드
private void ApplyMovement(Vector2 direction)
{
// 이동 방향에 속도를 곱하여 Rigidbody2D에 적용
direction = direction * 5; // 여기서 5는 이동 속도 조절을 위한 상수
_rigidbody.velocity = direction;
}
}
굳!
'스파르타코딩클럽 게임개발' 카테고리의 다른 글
오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 23일차(이름 입력받기! TMP) (0) | 2023.11.30 |
---|---|
오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 22일차(타일맵과 마우스 에임따라가기) (1) | 2023.11.28 |
24일은 스파르타 코딩 클럽 unity 게임 개발 과정 20일차(개인과제 시작) (1) | 2023.11.27 |
어제는 스파르타 코딩 클럽 unity 게임 개발 과정 19일차(팀과제 종료 발표) (2) | 2023.11.24 |
오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 18일차(팀과제 마무리 정리) (1) | 2023.11.23 |