267 lines
8.2 KiB
C#
267 lines
8.2 KiB
C#
using Unity.FPS.Game;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.FPS.Gameplay
|
|
{
|
|
public class PlayerInputHandler : MonoBehaviour
|
|
{
|
|
[Tooltip("Sensitivity multiplier for moving the camera around")]
|
|
public float LookSensitivity = 1f;
|
|
|
|
[Tooltip("Additional sensitivity multiplier for WebGL")]
|
|
public float WebglLookSensitivityMultiplier = 0.25f;
|
|
|
|
[Tooltip("Limit to consider an input when using a trigger on a controller")]
|
|
public float TriggerAxisThreshold = 0.4f;
|
|
|
|
[Tooltip("Used to flip the vertical input axis")]
|
|
public bool InvertYAxis = false;
|
|
|
|
[Tooltip("Used to flip the horizontal input axis")]
|
|
public bool InvertXAxis = false;
|
|
|
|
GameFlowManager m_GameFlowManager;
|
|
PlayerCharacterController m_PlayerCharacterController;
|
|
bool m_FireInputWasHeld;
|
|
|
|
void Start()
|
|
{
|
|
m_PlayerCharacterController = GetComponent<PlayerCharacterController>();
|
|
DebugUtility.HandleErrorIfNullGetComponent<PlayerCharacterController, PlayerInputHandler>(
|
|
m_PlayerCharacterController, this, gameObject);
|
|
m_GameFlowManager = FindFirstObjectByType<GameFlowManager>();
|
|
DebugUtility.HandleErrorIfNullFindObject<GameFlowManager, PlayerInputHandler>(m_GameFlowManager, this);
|
|
|
|
Cursor.lockState = CursorLockMode.Locked;
|
|
Cursor.visible = false;
|
|
}
|
|
|
|
void LateUpdate()
|
|
{
|
|
m_FireInputWasHeld = GetFireInputHeld();
|
|
}
|
|
|
|
public bool CanProcessInput()
|
|
{
|
|
return Cursor.lockState == CursorLockMode.Locked && !m_GameFlowManager.GameIsEnding;
|
|
}
|
|
|
|
public Vector3 GetMoveInput()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
Vector3 move = new Vector3(Input.GetAxisRaw(GameConstants.k_AxisNameHorizontal), 0f,
|
|
Input.GetAxisRaw(GameConstants.k_AxisNameVertical));
|
|
|
|
// constrain move input to a maximum magnitude of 1, otherwise diagonal movement might exceed the max move speed defined
|
|
move = Vector3.ClampMagnitude(move, 1);
|
|
|
|
return move;
|
|
}
|
|
|
|
return Vector3.zero;
|
|
}
|
|
|
|
public float GetLookInputsHorizontal()
|
|
{
|
|
return GetMouseOrStickLookAxis(GameConstants.k_MouseAxisNameHorizontal,
|
|
GameConstants.k_AxisNameJoystickLookHorizontal);
|
|
}
|
|
|
|
public float GetLookInputsVertical()
|
|
{
|
|
return GetMouseOrStickLookAxis(GameConstants.k_MouseAxisNameVertical,
|
|
GameConstants.k_AxisNameJoystickLookVertical);
|
|
}
|
|
|
|
public bool GetJumpInputDown()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButtonDown(GameConstants.k_ButtonNameJump);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetJumpInputHeld()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButton(GameConstants.k_ButtonNameJump);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetFireInputDown()
|
|
{
|
|
return GetFireInputHeld() && !m_FireInputWasHeld;
|
|
}
|
|
|
|
public bool GetFireInputReleased()
|
|
{
|
|
return !GetFireInputHeld() && m_FireInputWasHeld;
|
|
}
|
|
|
|
public bool GetFireInputHeld()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
bool isGamepad = Input.GetAxis(GameConstants.k_ButtonNameGamepadFire) != 0f;
|
|
if (isGamepad)
|
|
{
|
|
return Input.GetAxis(GameConstants.k_ButtonNameGamepadFire) >= TriggerAxisThreshold;
|
|
}
|
|
else
|
|
{
|
|
return Input.GetButton(GameConstants.k_ButtonNameFire);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetAimInputHeld()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
bool isGamepad = Input.GetAxis(GameConstants.k_ButtonNameGamepadAim) != 0f;
|
|
bool i = isGamepad
|
|
? (Input.GetAxis(GameConstants.k_ButtonNameGamepadAim) > 0f)
|
|
: Input.GetButton(GameConstants.k_ButtonNameAim);
|
|
return i;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetSprintInputHeld()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButton(GameConstants.k_ButtonNameSprint);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetCrouchInputDown()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButtonDown(GameConstants.k_ButtonNameCrouch);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetCrouchInputReleased()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButtonUp(GameConstants.k_ButtonNameCrouch);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool GetReloadButtonDown()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
return Input.GetButtonDown(GameConstants.k_ButtonReload);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public int GetSwitchWeaponInput()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
|
|
bool isGamepad = Input.GetAxis(GameConstants.k_ButtonNameGamepadSwitchWeapon) != 0f;
|
|
string axisName = isGamepad
|
|
? GameConstants.k_ButtonNameGamepadSwitchWeapon
|
|
: GameConstants.k_ButtonNameSwitchWeapon;
|
|
|
|
if (Input.GetAxis(axisName) > 0f)
|
|
return -1;
|
|
else if (Input.GetAxis(axisName) < 0f)
|
|
return 1;
|
|
else if (Input.GetAxis(GameConstants.k_ButtonNameNextWeapon) > 0f)
|
|
return -1;
|
|
else if (Input.GetAxis(GameConstants.k_ButtonNameNextWeapon) < 0f)
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
public int GetSelectWeaponInput()
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.Alpha1))
|
|
return 1;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha2))
|
|
return 2;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha3))
|
|
return 3;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha4))
|
|
return 4;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha5))
|
|
return 5;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha6))
|
|
return 6;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha7))
|
|
return 7;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha8))
|
|
return 8;
|
|
else if (Input.GetKeyDown(KeyCode.Alpha9))
|
|
return 9;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float GetMouseOrStickLookAxis(string mouseInputName, string stickInputName)
|
|
{
|
|
if (CanProcessInput())
|
|
{
|
|
// Check if this look input is coming from the mouse
|
|
bool isGamepad = Input.GetAxis(stickInputName) != 0f;
|
|
float i = isGamepad ? Input.GetAxis(stickInputName) : Input.GetAxisRaw(mouseInputName);
|
|
|
|
// handle inverting vertical input
|
|
if (InvertYAxis)
|
|
i *= -1f;
|
|
|
|
// apply sensitivity multiplier
|
|
i *= LookSensitivity;
|
|
|
|
if (isGamepad)
|
|
{
|
|
// since mouse input is already deltaTime-dependant, only scale input with frame time if it's coming from sticks
|
|
i *= Time.deltaTime;
|
|
}
|
|
else
|
|
{
|
|
// reduce mouse input amount to be equivalent to stick movement
|
|
i *= 0.01f;
|
|
#if UNITY_WEBGL
|
|
// Mouse tends to be even more sensitive in WebGL due to mouse acceleration, so reduce it even more
|
|
i *= WebglLookSensitivityMultiplier;
|
|
#endif
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
return 0f;
|
|
}
|
|
}
|
|
} |