You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.8 KiB
C#

using Fusion;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Projectiles
{
/// <summary>
/// Handles general game input and debug input - cursor locking, peer switching.
/// </summary>
public class GeneralInput : MonoBehaviour
{
// PUBLIC MEMBERS
public bool IsLocked => Cursor.lockState == CursorLockMode.Locked;
// PRIVATE MEMBERS
private static int _lastSingleInputChange;
private static int _cursorLockRequests;
// PUBLIC METHODS
public void RequestCursorLock()
{
// Static requests count is used for multi-peer setup
_cursorLockRequests++;
if (_cursorLockRequests == 1)
{
// First lock request, let's lock
SetLockedState(true);
}
}
public void RequestCursorRelease()
{
_cursorLockRequests--;
Assert.Check(_cursorLockRequests >= 0, "Cursor lock requests are negative, this should not happen");
if (_cursorLockRequests == 0)
{
SetLockedState(false);
}
}
// MONOBEHAVIOUR
private void Update()
{
// Only one single input change per frame is possible (important for multi-peer multi-input game)
if (_lastSingleInputChange == Time.frameCount)
return;
var keyboard = Keyboard.current;
if (keyboard == null)
return;
// Enter key is used for locking/unlocking cursor in game view
if (keyboard.enterKey.wasPressedThisFrame || keyboard.numpadEnterKey.wasPressedThisFrame || keyboard.escapeKey.wasPressedThisFrame)
{
SetLockedState(Cursor.lockState != CursorLockMode.Locked);
_lastSingleInputChange = Time.frameCount;
}
// Check switching peer in multi-peer mode
if (keyboard.numpad0Key.wasPressedThisFrame || keyboard.uKey.wasPressedThisFrame)
{
SetActiveRunner(-1);
}
else if (keyboard.numpad1Key.wasPressedThisFrame || keyboard.iKey.wasPressedThisFrame)
{
SetActiveRunner(0);
}
else if (keyboard.numpad2Key.wasPressedThisFrame || keyboard.oKey.wasPressedThisFrame)
{
SetActiveRunner(1);
}
else if (keyboard.numpad3Key.wasPressedThisFrame || keyboard.pKey.wasPressedThisFrame)
{
SetActiveRunner(2);
}
}
// PRIVATE METHODS
private void SetLockedState(bool value)
{
Cursor.lockState = value == true ? CursorLockMode.Locked : CursorLockMode.None;
Cursor.visible = !value;
//Debug.Log($"Cursor lock state {Cursor.lockState}, visibility {Cursor.visible}");
}
private void SetActiveRunner(int index)
{
var enumerator = NetworkRunner.GetInstancesEnumerator();
int currentIndex = -1;
while (enumerator.MoveNext() == true)
{
var runner = enumerator.Current;
// Skip temporary runner
if (runner.LocalPlayer.IsRealPlayer == false)
continue;
currentIndex++;
runner.SetVisible(index < 0 || currentIndex == index);
runner.ProvideInput = index < 0 || currentIndex == index;
}
}
}
}