지연된 마우스 입력 방법


11

나는 자동차 게임을하고 있으며 아이디어는 플레이어가 취한 것입니다. 마우스의 입력이 지연되어 마우스를 좌우로 움직여 회전하고 싶습니다.

사용자가 입력 한 값과 차량의 회 전량 사이에 일정한 지연을 설정하려면 어떻게해야합니까?

지금 나는 이것을 가지고있다 :

h = Mathf.Lerp(h, (((Input.mousePosition.x / Screen.width) * 2) - 1), Time.deltaTime * 2);

마우스가 매우 빠르게 움직이면 자동차가 매우 느리게 회전하지만 승수를 크랭크 Time.deltaTime하면 자동차가 더 빨리 회전하지만 지연 효과는 최소화됩니다. .

다른 방법으로는 어떻게 할 수 있습니까?

답변:


31

시간 지연을 시뮬레이션하려면 원형 버퍼를 사용하여 마지막 N 프레임의 마우스 위치 를 저장하십시오 . 각 프레임마다 현재 마우스 위치를 저장하십시오. 컨트롤 계산에서 현재 마우스 위치 대신 버퍼에서 가장 오래된 마우스 위치를 사용하십시오.


1
나는 실제로 그것을 해결했다. 방금 기다린 코 루틴을 사용했다. 이 기술의 성능에 대해 걱정할 것입니다. 정말 빠른 장치를 사용하는 경우 모바일보다 지연 시간이 훨씬 짧습니다.
mr-matt

2
이와 같이 입력을 지연 시키면 폴링 속도에 따라 결과가 변경됩니다.
Joey

6
매튜, 난 좀 어리둥절 해 .. 정말 성능을 의미합니까? 프레임 당 메모리에 몇 바이트를 쓰는 데 따른 성능 저하는 무시할 수있는 수준이며 모든 메시지 (Windows 이상)에서 마우스 위치를 자유롭게 할 수 있습니다. 코 루틴 솔루션이 정확히 어떻게 작동한다고 생각하십니까? 타이머가 몇 개나 만료되고 언제 어떤 코드를 실행할지 누가 추적합니까? 꽤 무겁게 들립니다.
버스터

아뇨, 지연의 실제 작업의 성능을 의미하는 것이 아니라 전반적인 성능을 의미합니다. 예를 들어, 마지막 10 프레임의 마우스 위치를 가져 와서 전화로 실행하고 20fps를 얻는 경우 지연 시간은 0.5 초입니다. 그러나 이것을 데스크탑에서 실행하고 200fps를 얻는 경우 지연 시간은 0.05 초입니다. 무슨 말인지 알 겠어?
mr-matt

이를 피하기 위해 N을 선택하지만 더 큰 문제는 이와 같이 프레임 당 한 번 폴링하면 많은 양의 데이터가 삭제된다는 것입니다. 모든 마우스 이벤트를 처리하는 것이 좋습니다 (답이하는 것처럼 보입니다).
버스터

3

게임을 실행하는 장치의 성능에 관계없이 지연이 일정하기 때문에 코 루틴을 사용했습니다.

이것은 내 코드입니다.

private IEnumerator DelayedInput()
{
    Vector3 a = Input.acceleration;
    Vector2 m = Input.mousePosition;

    yield return new WaitForSeconds(delay);

    accelerometer = Vector3.Lerp(accelerometer, a, Time.deltaTime * turnSpeed);
    mouse = Vector2.Lerp(mouse, m, Time.deltaTime * turnSpeed);
}

이것은 모든 입력에 응답한다는 장점이 있습니다 (모든 프레임을 폴링하는 아이디어와는 다릅니다). 나는 C #을 모른다. 어딘가에 누군가가 그 모든 타이머에 대해 많은 부기를 가지고있는 것처럼 보인다. 그러나 그것이 잘 수행되고 원하는 느낌이 있다면 나는 그것을 좋아합니다.
버스터

나는 이것이 더 좋은 방법이라고 생각합니다. 타이머가 게임에 크게 영향을 미치지 않을 것이라고 생각합니다. 물론 성능에 대한 경험의 결과 (이후 참조를 위해) 로이 질문으로 돌아갈 수 있습니다. 어쨌든, 당신은 계속해서 이것을 대답으로 선택해야합니다 (이것은 단지 알림 일뿐입니다).
존 해밀턴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.