249 lines
8.8 KiB
C#
249 lines
8.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Mirror;
|
|
using TTTSC.Player.Character;
|
|
using TTTSC.Player.Character.Controller;
|
|
|
|
namespace TTTSC.Player.NetworkCharacter
|
|
{
|
|
public class NetworkCharacterMover : NetworkBehaviour
|
|
{
|
|
[SerializeField]
|
|
private NetworkPlayerGhostReffrenceHub _playerGhostReffrenceHub;
|
|
|
|
[SerializeField]
|
|
private NetworkAliveReffrenceHub _aliveReffrenceHub;
|
|
private PlayerStateMachine _playerStateMachine;
|
|
private NetworkPlayerStateEnforcer _playerStateEnforcer;
|
|
private NetworkCharacterStateMachine characterStateMachine;
|
|
private CharacterMovementConfig _characterMovementConfig;
|
|
private NetworkCharacterHover _characterHover;
|
|
private PlayerInputReceiver _playerInputReceiver;
|
|
private Rigidbody _characterRigidbody;
|
|
|
|
|
|
[SerializeField]
|
|
private bool _autoB_Hop;
|
|
|
|
[SerializeField]
|
|
private ForceModes _hoverForceMode, _moveForceMode;
|
|
|
|
[SerializeField]
|
|
private float _characterDrag;
|
|
|
|
private float _jumpStageValue;
|
|
private bool _jumpInputHeld;
|
|
private bool _performingMoveInput;
|
|
private Vector3 _moveDirection;
|
|
|
|
private void Start()
|
|
{
|
|
_playerGhostReffrenceHub = GetComponentInParent<NetworkPlayerGhostReffrenceHub>();
|
|
_characterRigidbody = _playerGhostReffrenceHub.characterRigidbody;
|
|
_playerStateMachine = _playerGhostReffrenceHub.playerStateMachine;
|
|
_playerStateEnforcer = _playerGhostReffrenceHub.playerStateEnforcrer;
|
|
characterStateMachine = _aliveReffrenceHub.characterStateMachine;
|
|
_characterMovementConfig = _aliveReffrenceHub.characterMovementConfig;
|
|
_characterHover = _aliveReffrenceHub.characterHover;
|
|
_playerInputReceiver = _playerGhostReffrenceHub.playerInputReceiver;
|
|
|
|
|
|
_playerInputReceiver.MoveInputEvent += MoveInput;
|
|
_playerInputReceiver.JumpInputEvent += JumpInput;
|
|
|
|
_characterRigidbody = _playerGhostReffrenceHub.characterRigidbody;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
if (_playerInputReceiver != null)
|
|
{
|
|
_playerInputReceiver.MoveInputEvent -= MoveInput;
|
|
_playerInputReceiver.JumpInputEvent -= JumpInput;
|
|
}
|
|
}
|
|
|
|
#region Input event listeners
|
|
|
|
private void MoveInput(Vector2 moveDirection, bool performing)
|
|
{
|
|
_performingMoveInput = performing;
|
|
_moveDirection = new Vector2(moveDirection.x, moveDirection.y);
|
|
}
|
|
|
|
//Remember to change jumpPower from 0 to some other number that preferably is in the positives and not negatives
|
|
private void JumpInput(bool performed)
|
|
{
|
|
_jumpInputHeld = performed;
|
|
}
|
|
|
|
#endregion
|
|
|
|
enum ForceModes
|
|
{
|
|
force,
|
|
acceleration,
|
|
impulse,
|
|
velocityChange
|
|
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
|
|
Vector3 downVector = transform.TransformDirection(Vector3.down);
|
|
|
|
Drag();
|
|
|
|
switch (characterStateMachine.characterState)
|
|
{
|
|
case NetworkCharacterStateMachine.CharacterStates.Grounded:
|
|
if (characterStateMachine.movementState == NetworkCharacterStateMachine.MovementStates.Idle)
|
|
{
|
|
_characterDrag = _characterMovementConfig.idleDrag;
|
|
}
|
|
else
|
|
{
|
|
_characterDrag = _characterMovementConfig.moveDrag;
|
|
}
|
|
|
|
Move();
|
|
|
|
Jump();
|
|
|
|
break;
|
|
case NetworkCharacterStateMachine.CharacterStates.InAir:
|
|
_characterDrag = _characterMovementConfig.inAirDrag;
|
|
InAirMove();
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
_characterRigidbody.AddForce(_characterHover.hoverForce * downVector, ForceMode.VelocityChange);
|
|
|
|
|
|
}
|
|
|
|
private void Drag()
|
|
{
|
|
float multiplier = 1.0f - _characterDrag * Time.fixedDeltaTime;
|
|
if (multiplier < 0.0f) multiplier = 0.0f;
|
|
|
|
Vector3 newVelocity = new(_characterRigidbody.velocity.x * multiplier, _characterRigidbody.velocity.y, multiplier * _characterRigidbody.velocity.z);
|
|
|
|
_characterRigidbody.velocity = newVelocity;
|
|
}
|
|
|
|
private void Move()
|
|
{
|
|
switch (characterStateMachine.movementState)
|
|
{
|
|
case NetworkCharacterStateMachine.MovementStates.Walking:
|
|
Walking();
|
|
break;
|
|
|
|
case NetworkCharacterStateMachine.MovementStates.Crouching:
|
|
Crouching();
|
|
break;
|
|
|
|
case NetworkCharacterStateMachine.MovementStates.Sprinting:
|
|
Sprinting();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void InAirMove()
|
|
{
|
|
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
|
|
|
|
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlForce;
|
|
|
|
Vector3 counterForce = -movement.normalized * _characterMovementConfig.airControlCounterForce;
|
|
|
|
|
|
|
|
|
|
if (characterStateMachine.movementState == NetworkCharacterStateMachine.MovementStates.Walking)
|
|
{
|
|
_characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange);
|
|
_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange);
|
|
}
|
|
|
|
}
|
|
|
|
private void Jump()
|
|
{
|
|
|
|
switch (_autoB_Hop)
|
|
{
|
|
case true:
|
|
if (_jumpInputHeld && characterStateMachine.movementState != NetworkCharacterStateMachine.MovementStates.Crouching)
|
|
{
|
|
_characterRigidbody.velocity = new Vector3(_characterRigidbody.velocity.x, 0f, _characterRigidbody.velocity.z);
|
|
_characterRigidbody.AddForce(_characterMovementConfig.jumpForce * transform.up, ForceMode.VelocityChange);
|
|
}
|
|
break;
|
|
case false:
|
|
if (_jumpStageValue == 1 && characterStateMachine.movementState != NetworkCharacterStateMachine.MovementStates.Crouching)
|
|
{
|
|
_characterRigidbody.velocity = new Vector3(_characterRigidbody.velocity.x, 0f, _characterRigidbody.velocity.z);
|
|
_characterRigidbody.AddForce(_characterMovementConfig.jumpForce * transform.up, ForceMode.VelocityChange);
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private void Walking()
|
|
{
|
|
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
|
|
|
|
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveForce;
|
|
|
|
//Vector3 counterForce = -movement.normalized * _characterMovementConfig.moveCounterForce;
|
|
|
|
_characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange);
|
|
//_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange);
|
|
}
|
|
|
|
private void Crouching()
|
|
{
|
|
//bool switched;
|
|
|
|
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
|
|
|
|
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.crouchMoveForce;
|
|
|
|
//Vector3 counterForce = -movement.normalized * _characterMovementConfig.crouchMoveCounterForce;
|
|
|
|
/*(switch (switched)
|
|
{
|
|
case false:
|
|
_characterRigidbody.AddForce(_characterRigidbody.velocity, ForceMode.VelocityChange);
|
|
switched = true;
|
|
break;
|
|
}*/
|
|
|
|
_characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange);
|
|
//_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange);
|
|
}
|
|
|
|
private void Sprinting()
|
|
{
|
|
|
|
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
|
|
|
|
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.sprintMoveForce;
|
|
|
|
//Vector3 counterForce = -movement.normalized *_characterMovementConfig.sprintMoveCounterForce;
|
|
|
|
_characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange);
|
|
//_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange);
|
|
}
|
|
|
|
}
|
|
}
|