Files
jelito/Assets/jelycho/Code/Player/PlayerController.cs
2025-06-22 12:12:46 +02:00

126 lines
4.3 KiB
C#
Executable File

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using RebootKit.Engine.Foundation;
using RebootKit.Engine.Main;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.InputSystem;
using Logger = RebootKit.Engine.Foundation.Logger;
using Object = UnityEngine.Object;
namespace RebootReality.jelycho.Player {
public class PlayerController : IController {
readonly Logger m_Logger = new Logger(nameof(PlayerController));
readonly Config m_Config;
PlayerActor m_FPPActor;
public PlayerController(Config config) {
m_Config = config;
}
public void Dispose() {
}
public async UniTask OnStart(CancellationToken cancellationToken) {
RR.Input.LockCursor();
RR.Input.EnableControls();
m_FPPActor = await RR.World.SpawnActor<PlayerActor>(m_Config.playerActorPrefab, cancellationToken);
m_FPPActor.IsPlaying = true;
if (RR.World.Context is WorldContext worldContext) {
m_FPPActor.WarpTo(worldContext.PlayerSpawnPoint.position);
}
await UniTask.Yield(cancellationToken);
}
public void OnStop() {
RR.Input.DisableControls();
RR.Input.UnlockCursor();
RR.World.KillActor(m_FPPActor);
}
public void OnTick() {
if (m_FPPActor is null) {
m_Logger.Error("Player actor is not initialized. Make sure to call OnStart() before OnTick().");
return;
}
Vector2 lookInput = SensitivityReader.Read(m_Config.lookActionReference.action);
m_FPPActor.Look(lookInput * FPPConfig.MouseSensitivity.FloatValue);
Vector2 moveInput = m_Config.moveActionReference.action.ReadValue<Vector2>();
m_FPPActor.SetMoveInput(moveInput);
m_FPPActor.SetSprint(m_Config.sprintActionReference.action.IsPressed());
if (m_Config.jumpActionReference.action.WasPerformedThisFrame()) {
m_FPPActor.Jump();
}
if (m_Config.dragObjectActionReference.action.WasPressedThisFrame()) {
m_FPPActor.StartDrag();
}
if (m_Config.dragObjectActionReference.action.WasReleasedThisFrame()) {
m_FPPActor.StopDrag();
}
if (m_Config.primaryActionReference.action.WasReleasedThisFrame()) {
m_FPPActor.PrimaryAction();
}
if (m_Config.secondaryActionReference.action.WasReleasedThisFrame()) {
m_FPPActor.SecondaryAction();
}
}
[Serializable]
public class Config {
public AssetReferenceT<GameObject> playerActorPrefab;
public InputActionReference moveActionReference;
public InputActionReference lookActionReference;
public InputActionReference jumpActionReference;
public InputActionReference sprintActionReference;
public InputActionReference dragObjectActionReference;
public InputActionReference primaryActionReference;
public InputActionReference secondaryActionReference;
}
}
public static class FPPConfig {
[ConfigVar("fpp.mouse.sens", 0.25f, "Mouse look sensitivity")] public static ConfigVar MouseSensitivity;
[ConfigVar("fpp.mouse.invert.y", 0, "Invert mouse look")] public static ConfigVar MouseInvertY;
[ConfigVar("fpp.gamepad.sens", 4.0f, "Gamepad look sensitivity")] public static ConfigVar GamepadSensitivity;
}
public static class SensitivityReader {
public static float2 Read(InputAction action) {
if (action == null || action.activeControl == null) {
return float2.zero;
}
float2 sensitivity = action.ReadValue<Vector2>();
bool isGamepad = action.activeControl.device is Gamepad;
if (isGamepad) {
sensitivity *= FPPConfig.GamepadSensitivity.FloatValue;
} else {
sensitivity *= FPPConfig.MouseSensitivity.FloatValue;
if (FPPConfig.MouseInvertY.IndexValue == 1) {
sensitivity.y *= -1;
}
}
return sensitivity;
}
}
}