내일배움캠프/TIL

내일배움캠프 19일차 TIL - New Input System : 1회만 입력받기

서보훈 2024. 10. 11. 21:26

New Input System 으로 버튼 입력을 사용해보면 Press Only 에서는 누를때 true, Release Only 에서는 뗄때 false

Press And Release 에서는 누를때 true, 뗄때 false를 반환하는것을 볼 수 있습니다.

//스페이스바 입력시 bool 값 매개변수로 받음
public void OnInteracte(InputValue value)
{
    InteracteInput(value.isPressed);
    Debug.Log(value.isPressed);
}

 

이 경우, 변수나 프로퍼티를 통해 외부에서 입력을 인식할경우, 눌렀다 뗄때까지 입력이 연속으로 들어가는경우가 발생합니다.

//입력받은 값을 변수로 전달
public void InteracteInput(bool interacteState)
{
    interacte = interacteState;
}
//상호작용, 상호작용이 가능하면서, 스페이스바를 눌러야 작동
if (CanInteracte && _input.interacte)
{
    //상호작용 UI 활성화
    interacteObject.InteracteAction();
    Debug.Log("입력");
}

 

이런경우 단 한번의 입력만 받아내는 방법이 필요합니다.

이런 상황에서 사용할 수 있는 방법입니다.

 

먼저 임시로 입력값을 받아줄 변수를 하나 준비해줍니다.

public bool interacte = false;

//상호작용 관련 - 1회만 작동하게 만들기
private bool tempInteracte = false;

//스페이스바 입력시 bool 값 매개변수로 받음
public void OnInteracte(InputValue value)
{
    InteracteInput(value.isPressed);
    Debug.Log(value.isPressed);
}

//입력받은 값을 변수로 전달
public void InteracteInput(bool interacteState)
{
    tempInteracte = interacteState;
}

상호작용 입력인 스페이스바 입력을 임시로 tempInteracte 변수에 받아준 상태입니다.

 

이후, 입력을 받는 스크립트에 Update문을 사용해줍니다.

누를때만 true를 반환하기 위해 임시 입력값 변수가 true일때의 조건과

And 조건으로 interacte 변수와 tempInteracte 변수의 값이 다를때만 작동하는 if문을 만들어줍니다.

if문이 true 일때, 외부에서 참조할 변수를 true로 만들어주고, else로 false로 만든뒤, if문이 끝나면 tempInteracte 도 false로 변경해줍니다.

private void Update()
{
    //스페이스바를 누르면 1회만 true를 넘겨주는 매커니즘
    if (tempInteracte == true && interacte != tempInteracte)
    {
        interacte = true;
    }
    else
    {
        interacte = false;
    }

    tempInteracte = false;
}

 

Update에 이 코드를 사용함으로써 누를때 1회만 true를 반환하고, 이후로 다시 false를 반환하는 코드를 만들 수 있습니다.

 

원리는 다음과 같습니다.

입력을 받기 전에는 양쪽 모두 false로, if문이 충족되지 않아 update문이 작동하지 않습니다.

여기서 입력을 받게되면 temp로 지정한 변수가 true가 되고, 기존 변수는 false상태를 유지하고 있는상태입니다.

이때, 이번 업데이트 프레임 에서는 temp = true 이며 두 변수의 값이 다르기 때문에 일반 변수가 true로 바뀌게 됩니다.

if문이 종료되면 tempInteracte 는 다시 false가 됩니다.

이때, 이번 업데이트 1프레임 동안 외부에 값을 넘겨주는 bool 변수가 true 상태로 남아있습니다.

다음 업데이트 프레임 입니다.

temp 변수는 false이며, 일반변수는 true인 상태입니다.

이 경우 if문의 조건을  충족하지 않아 else문을 실행하게 됩니다. 

그 결과로 일반 변수가 false로 다시 변경되게 됩니다.

3회차 업데이트 프레임 입니다.

temp와 일반 양쪽 모두 false가 되어 초기와 같은 상태가 되었습니다.

이처럼 입력을 받은 2회차 업데이트 1프레임동안만 interacte 변수가 true로 유지되고 이후 프레임에서는 다시 false가 되면서 외부에서는 1회만 true코드가 작동하게 되는 원리입니다.