Files
DeviantMobile-Rohan/Assets/Scripts/Behaviours/Player/PlayerController.cs
2026-06-26 22:41:39 +05:30

210 lines
5.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.EventSystems;
public class PlayerControllerNew : 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;
}
}