97 lines
3.2 KiB
C#
Raw Normal View History

2024-02-19 21:00:36 +03:00
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Mirror.Examples.MultipleAdditiveScenes
{
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(CharacterController))]
[RequireComponent(typeof(NetworkTransform))]
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : NetworkBehaviour
{
public CharacterController characterController;
void OnValidate()
{
if (characterController == null)
characterController = GetComponent<CharacterController>();
characterController.enabled = false;
GetComponent<Rigidbody>().isKinematic = true;
GetComponent<NetworkTransform>().clientAuthority = true;
}
public override void OnStartLocalPlayer()
{
characterController.enabled = true;
}
[Header("Movement Settings")]
public float moveSpeed = 8f;
public float turnSensitivity = 5f;
public float maxTurnSpeed = 100f;
[Header("Diagnostics")]
public float horizontal;
public float vertical;
public float turn;
public float jumpSpeed;
public bool isGrounded = true;
public bool isFalling;
public Vector3 velocity;
void Update()
{
if (!isLocalPlayer || characterController == null || !characterController.enabled)
return;
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
// Q and E cancel each other out, reducing the turn to zero
if (Input.GetKey(KeyCode.Q))
turn = Mathf.MoveTowards(turn, -maxTurnSpeed, turnSensitivity);
if (Input.GetKey(KeyCode.E))
turn = Mathf.MoveTowards(turn, maxTurnSpeed, turnSensitivity);
if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.E))
turn = Mathf.MoveTowards(turn, 0, turnSensitivity);
if (!Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E))
turn = Mathf.MoveTowards(turn, 0, turnSensitivity);
if (isGrounded)
isFalling = false;
if ((isGrounded || !isFalling) && jumpSpeed < 1f && Input.GetKey(KeyCode.Space))
{
jumpSpeed = Mathf.Lerp(jumpSpeed, 1f, 0.5f);
}
else if (!isGrounded)
{
isFalling = true;
jumpSpeed = 0;
}
}
void FixedUpdate()
{
if (!isLocalPlayer || characterController == null || !characterController.enabled)
return;
transform.Rotate(0f, turn * Time.fixedDeltaTime, 0f);
Vector3 direction = new Vector3(horizontal, jumpSpeed, vertical);
direction = Vector3.ClampMagnitude(direction, 1f);
direction = transform.TransformDirection(direction);
direction *= moveSpeed;
if (jumpSpeed > 0)
characterController.Move(direction * Time.fixedDeltaTime);
else
characterController.SimpleMove(direction);
isGrounded = characterController.isGrounded;
velocity = characterController.velocity;
}
}
}