InputManager 실습하기 - 260902
댓글 2
댓글을 작성하려면 로그인이 필요합니다.
댓글을 작성하려면 로그인이 필요합니다.
InputProbeTargetCubeTargetCube

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputProbe : MonoBehaviour
{
private void Update() // 매 프레임마다 확인
{
ReadKeys();
}
private void ReadKeys()
{
// '스페이스'를 '눌렀을 때'
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("INputProbe: GetKeyDown");
}
// '스페이스'를 '누르고 있을 때'
if (Input.GetKey(KeyCode.Space))
{
Debug.Log("InputProbe: GetKey");
}
// '스페이스'를 눌렀다 '땠을 때'
if (Input.GetKeyUp(KeyCode.Space))
{
Debug.Log("InputProbe: GetKeyUp");
}
}
}

스크립트를 아래로 수정하고 재생해 확인한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputProbe : MonoBehaviour
{
// 찾은 렌더러를 담을 변수
private Renderer _renderer;
private void Awake() // 재생이 시작되고 모든 오브젝트들이 준비될 때 한 번 실행
{
CacheComponents();
}
private void Update() // 매 프레임마다 확인
{
ReadToggleKey();
}
private void CacheComponents() // 렌더러를 찾아서 만들어준 변수에 담음
{
_renderer = GetComponent<Renderer>();
}
private void ReadToggleKey()
{
// 만약 스페이스가 '눌리면'
if (Input.GetKeyDown(KeyCode.Space))
{
// bool 타입인 enabled의 값을 뒤집어준다.
_renderer.enabled = !_renderer.enabled;
Debug.Log($"InputProbe: 보이기 상태는 {_renderer.enabled}입니다.");
// 예상: 처음엔 켜져있어 true이기 때문에
// 스페이스를 누르면 false로 바꾼 뒤 출력될것
}
}
}
예상한 결과를 확인했다.

ReadToggleKey의 Input.GetKeyDown를 Input.GetKey로 바꿔보았다.
예상한 결과: '스페이스'가 '눌려져 있는 순간'마다 작동할테니 콘솔이 엄청 많이 출력될 것
확인한 결과:

private const string AXIS_HORIZONTAL = "Horizontal";
private void Update()
{
ReadToggleKey();
ReadAxes();
}
private void ReadAxes()
{
float smoothed = Input.GetAxis(AXIS_HORIZONTAL);
float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
Debug.Log($"InputProbe: GetAxis는 {smoothed}, GetAxisRaw는 {raw}입니다.");
}
전체 코드는 다음과 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputProbe : MonoBehaviour
{
private Renderer _renderer;
// 상수로 선언한 축 이름
private const string AXIS_HORIZONTAL = "Horizontal";
private void Awake()
{
CacheComponents();
}
private void Update()
{
ReadToggleKey();
ReadAxes();
}
private void CacheComponents()
{
_renderer = GetComponent<Renderer>();
}
private void ReadToggleKey()
{
if (Input.GetKey(KeyCode.Space))
{
_renderer.enabled = !_renderer.enabled;
Debug.Log($"InputProbe: 보이기 상태는 {_renderer.enabled}입니다.");
}
}
// 추가한 메서드
private void ReadAxes()
{
float smoothed = Input.GetAxis(AXIS_HORIZONTAL);
float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
Debug.Log($"InputProbe: GetAxis는 {smoothed}, GetAxisRaw는 {raw}입니다.");
}
}
-1,0,1 사이에서 서서히 변했고
GetAxisRaw는 오직 -1,0,1만 입력된 것을 확인했다.A를 누르면 값이 -1로 바뀌고
Positive Botton인 D를 눌렀을 떈 값이 1로 바뀌었다.// 인스펙터에서 다룰 수 있게 '직렬화'한 필드
[SerializeField] private float _amountPerSecond = 3f;
private float _total; // 값을 쌓을 변수
// 변수에 축의 값 * 초당 속도 * 프레임이 차지한 시간을 초로 바꾸는 것
_total += raw * _amountPerSecond * Time.deltaTime;
Debug.Log($"InputProbe: 누적값은 {_total}입니다.");
전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputProbe : MonoBehaviour
{
private const string AXIS_HORIZONTAL = "Horizontal";
// 인스펙터에서 다룰 수 있게 '직렬화'한 필드
[SerializeField] private float _amountPerSecond = 3f;
private float _total; // 값을 쌓을 변수
private void Update()
{
ReadAxes();
}
// 추가한 메서드
private void ReadAxes()
{
float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
// 변수에 축의 값 * 초당 속도 * 프레임이 차지한 시간을 초로 바꾸는 것
_total += raw * _amountPerSecond * Time.deltaTime;
Debug.Log($"InputProbe: 누적값은 {_total}입니다.");
}
}

결과가 9에 가까워졌다.

결과값이 3에 가까워졌다.

private const int MOUSE_BUTTON_LEFT = 0;
private void Update()
{
ReadMouseButton();
}
private void ReadMouseButton()
{
// 마우스 0번 버튼이 '눌렸을 때'
if (Input.GetMouseButtonDown(MOUSE_BUTTON_LEFT))
{
// 마우스 포인터가 지금 있는 자리를 출력하기
Debug.Log($"InputProbe: 현재 좌표 {Input.mousePosition}");
}
}

확인된 좌표는 299/218/0

확인된 좌표는 523/452/0 (x 증가, y증가)

확인된 좌표는 106/76/0 (x감소, y감소)
오른쪽으로 갈수록 x가 커지고, 위로 갈수록 y가 커진다.
private const string AXIS_MOUSE_X = "Mouse X";
private const string AXIS_MOUSE_Y = "Mouse Y";
private void ReadMouseDelta()
{
float mouseX = Input.GetAxis(AXIS_MOUSE_X);
float mouseY = Input.GetAxis(AXIS_MOUSE_Y);
Debug.Log($"InputProbe: 마우스가 가로 {mouseX}, 세로 {mouseY}만큼 움직였습니다.");
}

마우스를 움직일 때 마다 실시간으로 값이 변하고, 마우스를 멈추면 두 값이 모두 0이 된다.
마우스를 빠르게 움직이면 GetAxis를 통해 서서히 변하는 좌표들이 더 많이 더 빨리 출력되는 것을 확인했다.
5단계에서 A키와 D키를 입력했을 때는 각각 -1과 1의 값으로 서서히 변해갔지만
"마우스를 계속 움직이는게 아니다보니" 마우스가 멈추는 순간 값이 0으로 변해버렸다.

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다

블로그를 '매일' 올리는것보다 '제대로' 올리는게 중요할텐데 그렇게 하면 평생 안 올리고 수정만 할 거 같아서 일단 올리긴 하다만....ㅜㅜ 이렇게 하는게 맞나 싶다 참....
개인적으로 저는 일단 쓰는것이 좋을거 같아요! 만약 매일매일 공부한다고 생각하면 하루에 1개를 1년동안 작성한다고 하면 365건을 포스팅 해야하는데. 수정한다고 하면 "일"처럼 느껴져요. 글은 본인을 위해서 작성하는 것이 제일 중요하다고 생각합니다. 게임개발에 대해서 공부하시는것 같으신데, 반복문이나 조건문을 생각해서 작성 안하잖아요, 손이 먼저 움직여서 기본 골격을 잡고 필요한 내용을 고민 후 작성되게 되실텐데. 글도 똑같다고 보시면 될거같아요, 쓰다보면 생각하지 않아도 내 생각이 저절로 골격이 잡히고 그이후에 생각해서 작성이 되다보면 노력하지 않아도 잘쓴글 되지 않을까요..? 라고 생각합니다 !