Files
jelito/Assets/jelycho/Code/Player/FPPCamera.cs
2025-07-01 18:57:49 +02:00

81 lines
2.7 KiB
C#

using System;
using RebootKit.Engine.Foundation;
using RebootKit.Engine.Services.Simulation.Sensors;
using RebootKit.Engine.Simulation.Sensors;
using RebootReality.jelycho.Main;
using Unity.Cinemachine;
using UnityEngine;
using UnityEngine.Assertions;
namespace RebootReality.jelycho.Player {
[AddComponentMenu(GameConsts.k_AddComponentMenu + "Player/First Person Camera")]
public class FPPCamera : MonoBehaviour {
[ConfigVar("fpp.camera.fov", 60.0f, "Field of view for the first person camera.")]
static ConfigVar s_cameraFOV;
[Header("Base")]
[field: SerializeField]
public float Sensitivity { get; set; }
[SerializeField] float m_PitchMin = -80f;
[SerializeField] float m_PitchMax = 80f;
[field: SerializeField]
public CinemachineCamera Camera { get; private set; }
CinemachineBasicMultiChannelPerlin m_BobbingNoiseComponent;
[SerializeField] float m_BobbingFrequency = 0.5f;
[SerializeField] float m_BobbingAmplitude = 0.75f;
[Header("Picking")]
[SerializeField] float m_PickDistance = 5.0f;
[SerializeField] LayerMask m_PickLayer;
readonly RaycastSensor m_RaycastSensor = new RaycastSensor();
[NonSerialized] public float Pitch;
[NonSerialized] public float Yaw;
public ISensor Sensor {
get {
m_RaycastSensor.ray = new Ray(Camera.transform.position, Camera.transform.forward);
m_RaycastSensor.maxDistance = m_PickDistance;
m_RaycastSensor.layerMask = m_PickLayer;
return m_RaycastSensor;
}
}
void Awake() {
m_BobbingNoiseComponent =
Camera.GetCinemachineComponent(CinemachineCore.Stage.Noise) as CinemachineBasicMultiChannelPerlin;
Assert.IsNotNull(m_BobbingNoiseComponent);
SetBobbing(0.0f);
}
public void Tick() {
Camera.Lens.FieldOfView = s_cameraFOV.FloatValue;
// Camera.transform.localRotation = Quaternion.Euler(Pitch, 0f, 0f);
}
public void Rotate(float x, float y) {
float sens = Sensitivity;
Pitch -= y * sens;
Pitch = Mathf.Clamp(Pitch, m_PitchMin, m_PitchMax);
Yaw += x * sens;
}
public void SetLookDirection(Vector3 forward) {
Pitch = Mathf.Asin(-forward.y) * Mathf.Rad2Deg;
Yaw = Mathf.Atan2(forward.x, forward.z) * Mathf.Rad2Deg;
}
public void SetBobbing(float t) {
m_BobbingNoiseComponent.AmplitudeGain = m_BobbingAmplitude * t;
m_BobbingNoiseComponent.FrequencyGain = m_BobbingFrequency * t;
}
}
}