그런 건 없다.... 는 아니고, 사실 없긴 한데 내가 Input.GetAxis 함수처럼 버튼을 누를 때 -1~1 사이 값이 나오도록 하는 스크립트를 만들어 놓았음
using UnityEngine;
using System;
namespace WindowsInput
{
[Serializable]
/// <summary>
/// InputSystem에서 Input.GetAxis() 함수를 대체하는 클래스
/// </summary>
public class Axis
{
// 기존 Input Manager를 커스터마이징하기 위한 변수들
[Header("Old Input [...]")]
/// <summary>
/// 음수의 값을 출력하는 방향키
/// </summary>
public KeyCode negative;
/// <summary>
/// 양수의 값을 출력하는 방향키
/// </summary>
public KeyCode positive;
[Header("Axis Settings")]
/// <summary>
/// 키를 누르지 않을 때 0으로 돌아가는 속도
/// </summary>
public float autoReturnSpeed = 3f;
/// <summary>
/// 키를 누를 때 움직이는 속도
/// </summary>
public float digitalReturnSpeed = 3f;
/// <summary>
/// 키를 누르지 않을 때 val이 이 값 이하면 0f로 초기화
/// </summary>
public float Dead = 0.001f;
[SerializeField]
/// <summary>
/// Input Manager에서 커스텀 Axis의 움직임 값
/// </summary>
private float value;
public Axis() { }
public Axis(KeyCode negative, KeyCode positive, float dead, float autoReturnSpeed, float digitalReturnSpeed)
{
this.negative = negative;
this.positive = positive;
this.Dead = dead;
this.autoReturnSpeed = autoReturnSpeed;
this.digitalReturnSpeed = digitalReturnSpeed;
this.value = 0f;
}
/// <summary>
/// 값이 들어올 때, 움직임을 업데이트하는 함수
/// </summary>
/// <param name="input">입력 값</param>
/// <param name="val">움직임 반환 값</param>
public void UpdateAxis(float input, ref float val)
{
// 반대 방향 입력 감지: 현재 움직임(value)과 새 입력(input)의 방향이 반대일 경우
if ((input > 0 && val < 0) || (input < 0 && val > 0))
{
val = 0f; // 값을 0으로 초기화하여 즉시 방향을 전환하도록 함
}
// 입력이 양수 방향이면, 움직임 값 상승
if (input > Mathf.Epsilon)
{
val += digitalReturnSpeed * Time.deltaTime;
}
// 입력이 음수 방향이면, 움직임 값 하강
else if (input < -Mathf.Epsilon)
{
val -= digitalReturnSpeed * Time.deltaTime;
}
// 아무런 입력이 없으면
else
{
// 움직임이 양수 방향이면
if (val > 0)
{
// 움직임 값 자동 하강
val -= autoReturnSpeed * Time.deltaTime;
if (val < 0) val = 0;
}
// 움직임이 음수 방향이면
else if (val < 0)
{
// 움직임 값 자동 상승
val += autoReturnSpeed * Time.deltaTime;
if (val > 0) val = 0;
}
}
// 입력이 없으면서 움직임 절대값이 Dead보다 작으면 0으로 초기화
if (input == 0 && Mathf.Abs(val) < Dead)
{
val = 0f;
}
// 움직임의 값은 -1 ~ 1 사이로 제한
val = Mathf.Clamp(val, -1f, 1f);
}
/// <summary>
/// Input Manager에서 Axis를 커스텀할 때 사용하는 함수
/// </summary>
/// <returns></returns>
public float UpdateAxisFromLegacyInput()
{
float input = 0;
if (Input.GetKey(positive))
{
input = 1;
}
else if (Input.GetKey(negative))
{
input = -1;
}
UpdateAxis(input, ref value);
return value;
}
/// <summary>
/// Input Manager에서 커스텀 Axis의 움직임 값 반환 함수
/// </summary>
/// <returns></returns>
public float GetValue()
{
return value;
}
/// <summary>
/// GetAxisRaw 커스텀 함수
/// </summary>
/// <returns></returns>
public float GetValueRaw()
{
bool negativeHeld = Input.GetKey(negative);
bool positiveHeld = Input.GetKey(positive);
if (negativeHeld && positiveHeld)
{
return 0f;
}
if (negativeHeld)
{
return -1f;
}
if (positiveHeld)
{
return 1f;
}
return 0f;
}
}
}
그냥 복사해서 쓰면 됨
사용 방법은 다음과 같음
1. 인풋을 담당할 클래스 내에 Axis 만들어주고, 입력값 여부 판별할 moveVec 변수, 실제 움직임 값을 반환받을 curVec 변수를 생성
2. Input System의 OnMove(이건 Input Actions에 이름을 어떻게 설정했냐에 따라 다름) 함수를 생성해서 moveVec에서 InputValue value의 값을 받아옴
3. move.UpdateAxis 함수를 통해 curVec의 값을 갱신함
결과:
(Old Input은 기존의 Input.GetAxis("Horizontal")이랑 Input.GetAxis("Vertical"))
보다시피 방향키를 눌렀을 때 되도록 비슷하게 작동함
다만, 기존 Input.GetAxis랑 다르게 왼쪽과 오른쪽이 동시에 눌리면 움직임이 0으로 되돌아가게 설정했음
(기존 Input.GetAxis는 방향키를 누르는 도중에 반대 방향키를 누르면, 그냥 값이 그 자리에서 멈추는 현상이 발생함)
프로젝트 세팅에서 인풋 타입을 both로 바꾸면 되지 않나?
그래도 되긴 하는데 내가 원한 건 GetAxis의 키바인딩을 스크립트를 통해 제어해서 게임 내에서 키 세팅을 바꾸는 거여서 그럼
수저 놔두고 손으로 퍼먹는 법
굳이 왜요? 잘못쓰고 있는 것 같은데 - dc App
그럼 혹시 스크립트로 GetAxis 키 변경하는법 아시나요?
public float GetAxis(KeyCode left, KeyCodeRight) { bool leftInput = Input.GetKey(left); bool rightInput = Input.GetKey(right); return (leftInput ? -1 : 0) + (rightInput ? 1 : 0); } ㅋㅋㅋㅋㅋ
그건 GetAxisRaw지