210 lines
5.1 KiB
C#
210 lines
5.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
using UnityEngine.EventSystems;
|
|
|
|
public class PlayerController : MonoBehaviour
|
|
{
|
|
|
|
//Player ID
|
|
private int playerID;
|
|
|
|
[Header("Sub Behaviours")]
|
|
public PlayerMovementBehaviour playerMovementBehaviour;
|
|
public PlayerAnimationBehaviour playerAnimationBehaviour;
|
|
public PlayerVisualsBehaviour playerVisualsBehaviour;
|
|
|
|
|
|
[Header("Input Settings")]
|
|
public PlayerInput playerInput;
|
|
public float movementSmoothingSpeed = 1f;
|
|
private Vector3 rawInputMovement;
|
|
private Vector3 smoothInputMovement;
|
|
|
|
//Action Maps
|
|
private string actionMapPlayerControls = "Player Controls";
|
|
private string actionMapMenuControls = "Menu Controls";
|
|
|
|
//Current Control Scheme
|
|
private string currentControlScheme;
|
|
|
|
|
|
//This is called from the GameManager; when the game is being setup.
|
|
public void SetupPlayer(int newPlayerID)
|
|
{
|
|
playerID = newPlayerID;
|
|
|
|
currentControlScheme = playerInput.currentControlScheme;
|
|
|
|
playerMovementBehaviour.SetupBehaviour();
|
|
playerAnimationBehaviour.SetupBehaviour();
|
|
playerVisualsBehaviour.SetupBehaviour(playerID, playerInput);
|
|
}
|
|
|
|
|
|
//INPUT SYSTEM ACTION METHODS --------------
|
|
|
|
//This is called from PlayerInput; when a joystick or arrow keys has been pushed.
|
|
//It stores the input Vector as a Vector3 to then be used by the smoothing function.
|
|
|
|
|
|
public void OnMovement(InputAction.CallbackContext value)
|
|
{
|
|
Vector2 inputMovement = value.ReadValue<Vector2>();
|
|
rawInputMovement = new Vector3(inputMovement.x, 0, inputMovement.y);
|
|
}
|
|
|
|
//This is called from PlayerInput, when a button has been pushed, that corresponds with the 'Attack' action
|
|
public void OnAttack(InputAction.CallbackContext value)
|
|
{
|
|
// If the unified InputToAnimation exists on this GameObject, let it handle attacks exclusively
|
|
if (GetComponent<InputToAnimation>() != null)
|
|
return;
|
|
|
|
if(value.started)
|
|
{
|
|
playerAnimationBehaviour.PlayAttackAnimation();
|
|
}
|
|
}
|
|
|
|
//This is called from Player Input, when a button has been pushed, that correspons with the 'TogglePause' action
|
|
public void OnTogglePause(InputAction.CallbackContext value)
|
|
{
|
|
if(value.started)
|
|
{
|
|
//GameObject.Find("GameManager").GetComponent<GameManager>().TogglePauseState(this);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//INPUT SYSTEM AUTOMATIC CALLBACKS --------------
|
|
|
|
//This is automatically called from PlayerInput, when the input device has changed
|
|
//(IE: Keyboard -> Xbox Controller)
|
|
public void OnControlsChanged()
|
|
{
|
|
|
|
if(playerInput.currentControlScheme != currentControlScheme)
|
|
{
|
|
currentControlScheme = playerInput.currentControlScheme;
|
|
|
|
playerVisualsBehaviour.UpdatePlayerVisuals();
|
|
RemoveAllBindingOverrides();
|
|
}
|
|
}
|
|
|
|
//This is automatically called from PlayerInput, when the input device has been disconnected and can not be identified
|
|
//IE: Device unplugged or has run out of batteries
|
|
|
|
|
|
|
|
public void OnDeviceLost()
|
|
{
|
|
playerVisualsBehaviour.SetDisconnectedDeviceVisuals();
|
|
}
|
|
|
|
|
|
public void OnDeviceRegained()
|
|
{
|
|
StartCoroutine(WaitForDeviceToBeRegained());
|
|
}
|
|
|
|
IEnumerator WaitForDeviceToBeRegained()
|
|
{
|
|
yield return new WaitForSeconds(0.1f);
|
|
playerVisualsBehaviour.UpdatePlayerVisuals();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Update Loop - Used for calculating frame-based data
|
|
void Update()
|
|
{
|
|
CalculateMovementInputSmoothing();
|
|
UpdatePlayerMovement();
|
|
UpdatePlayerAnimationMovement();
|
|
}
|
|
|
|
//Input's Axes values are raw
|
|
|
|
|
|
void CalculateMovementInputSmoothing()
|
|
{
|
|
|
|
smoothInputMovement = Vector3.Lerp(smoothInputMovement, rawInputMovement, Time.deltaTime * movementSmoothingSpeed);
|
|
|
|
}
|
|
|
|
void UpdatePlayerMovement()
|
|
{
|
|
playerMovementBehaviour.UpdateMovementData(smoothInputMovement);
|
|
}
|
|
|
|
void UpdatePlayerAnimationMovement()
|
|
{
|
|
playerAnimationBehaviour.UpdateMovementAnimation(smoothInputMovement.magnitude);
|
|
}
|
|
|
|
|
|
public void SetInputActiveState(bool gameIsPaused)
|
|
{
|
|
switch (gameIsPaused)
|
|
{
|
|
case true:
|
|
playerInput.DeactivateInput();
|
|
break;
|
|
|
|
case false:
|
|
playerInput.ActivateInput();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void RemoveAllBindingOverrides()
|
|
{
|
|
InputActionRebindingExtensions.RemoveAllBindingOverrides(playerInput.currentActionMap);
|
|
}
|
|
|
|
|
|
|
|
//Switching Action Maps ----
|
|
|
|
|
|
|
|
public void EnableGameplayControls()
|
|
{
|
|
playerInput.SwitchCurrentActionMap(actionMapPlayerControls);
|
|
}
|
|
|
|
public void EnablePauseMenuControls()
|
|
{
|
|
playerInput.SwitchCurrentActionMap(actionMapMenuControls);
|
|
}
|
|
|
|
|
|
//Get Data ----
|
|
public int GetPlayerID()
|
|
{
|
|
return playerID;
|
|
}
|
|
|
|
public InputActionAsset GetActionAsset()
|
|
{
|
|
return playerInput.actions;
|
|
}
|
|
|
|
public PlayerInput GetPlayerInput()
|
|
{
|
|
return playerInput;
|
|
}
|
|
|
|
|
|
}
|