projectEli/Assets/NeoFPS/Core/Settings/Contexts/FpsGraphicsSettings.cs
2022-11-06 20:28:33 -05:00

259 lines
6.1 KiB
C#

#if UNITY_STANDALONE // Should other platforms use Json text files saved to disk?
#define SETTINGS_USES_JSON
#endif
using System;
using UnityEngine;
using UnityEngine.Events;
namespace NeoFPS
{
[HelpURL("https://docs.neofps.com/manual/neofpsref-mb-fpsgraphicssettings.html")]
[CreateAssetMenu(fileName = "FpsSettings_Graphics", menuName = "NeoFPS/Settings/Graphics", order = NeoFpsMenuPriorities.settings_graphics)]
public class FpsGraphicsSettings : SettingsContext<FpsGraphicsSettings>
{
protected override string contextName { get { return "Graphics"; } }
public override string displayTitle { get { return "NeoFPS Graphics Settings"; } }
public override string tocName { get { return "Graphics Settings"; } }
public override string tocID { get { return "settings_graphics"; } }
[SerializeField, HideInInspector]
private bool m_SetResolution = false;
[SerializeField, HideInInspector]
private int m_ResolutionWidth = 1920;
[SerializeField, HideInInspector]
private int m_ResolutionHeight = 1080;
[SerializeField, HideInInspector]
private bool m_Fullscreen = true;
[SerializeField, HideInInspector]
private int m_Quality = 0;
[SerializeField, HideInInspector]
private int m_VSync = 0;
[SerializeField, HideInInspector]
private int m_FrameRateCap = -1;
[Header("FoV")]
[SerializeField, Tooltip("The vertical FoV of the first person camera. In a 16:9 monitor, this is 9/16 * the horizontal FoV (90 -> 50.625). Using vertical allows for consistent settings for all portrait aspect ratios.")]
private float m_VerticalFOV = 50.625f;
public event UnityAction<float> onVerticalFoVChanged;
public event UnityAction onResolutionChanged;
public readonly int[] frameRateCapOptions =
{
30,
60,
75,
120,
144,
150,
165,
180,
200,
240
};
public override void Load ()
{
base.Load ();
if (m_SetResolution)
{
ApplyResolutionChanges();
if (QualitySettings.GetQualityLevel() != m_Quality)
QualitySettings.SetQualityLevel(m_Quality, true);
QualitySettings.vSyncCount = m_VSync;
}
else
{
// Get the starting settings if not in the editor
if (!Application.isEditor)
{
Resolution current = Screen.currentResolution;
m_ResolutionWidth = current.width;
m_ResolutionHeight = current.height;
m_Fullscreen = Screen.fullScreen;
m_VSync = QualitySettings.vSyncCount;
m_Quality = QualitySettings.GetQualityLevel();
//m_FrameRateCap = current.refreshRate; - default to -1 (uncapped)
m_SetResolution = true;
Save();
}
}
}
public void ApplyResolutionChanges ()
{
if (!Application.isEditor)
{
Resolution target = resolution;
Screen.SetResolution(target.width, target.height, fullscreen);
if (onResolutionChanged != null)
onResolutionChanged();
}
}
protected override bool CheckIfCurrent ()
{
return FpsSettings.graphics == this;
}
#if SETTINGS_USES_JSON
public Resolution resolution
{
get { return new Resolution { width = m_ResolutionWidth, height = m_ResolutionHeight }; }
set
{
SetValue (ref m_ResolutionWidth, value.width);
SetValue (ref m_ResolutionHeight, value.height);
}
}
public bool fullscreen
{
get { return m_Fullscreen; }
set
{
SetValue (ref m_Fullscreen, value);
}
}
public int vSync
{
get { return m_VSync; }
set
{
SetValue (ref m_VSync, value);
QualitySettings.vSyncCount = m_VSync;
}
}
public int frameRateCap
{
get { return m_FrameRateCap; }
set
{
SetValue(ref m_FrameRateCap, value);
Application.targetFrameRate = m_FrameRateCap;
}
}
public int quality
{
get { return m_Quality; }
set
{
SetValue(ref m_Quality, value);
ResetQuality();
}
}
public float verticalFoV
{
get { return m_VerticalFOV; }
set
{
SetValue(ref m_VerticalFOV, value);
if (onVerticalFoVChanged != null)
onVerticalFoVChanged(m_VerticalFOV);
}
}
#else
public Resolution resolution
{
get
{
return new Resolution
{
width = GetInt ("gs.resolutionWidth", m_ResolutionWidth),
height = GetInt ("gs.resolutionHeight", m_ResolutionHeight)
};
}
set
{
SetInt ("gs.resolutionWidth", value.width);
SetInt ("gs.resolutionHeight", value.height);
ApplyResolutionChanges ();
}
}
public bool fullscreen
{
get { return GetBool ("gs.fullscreen", m_Fullscreen); }
set
{
SetBool ("gs.fullscreen", value);
Screen.fullScreen = value;
}
}
public int vSync
{
get { return GetInt ("gs.vsync", m_VSync); }
set
{
SetInt ("gs.vsync", value);
QualitySettings.vSyncCount = value;
}
}
public int frameRateCap
{
get { return GetInt ("gs.fpsCap", m_FrameRateCap); }
set
{
SetInt ("gs.fpsCap", value);
Application.targetFrameRate = value;
}
}
public int quality
{
get { return GetInt("gs.quality", m_Quality); }
set
{
SetInt("gs.quality", value);
ResetQuality();
}
}
public float verticalFoV
{
get { return GetFloat("gs.verticalFoV", m_VerticalFOV); }
set
{
SetFloat("gs.verticalFoV", value);
if (onVerticalFoVChanged != null)
onVerticalFoVChanged(m_VerticalFOV);
}
}
#endif
public void ResetQuality()
{
if (!Application.isEditor && m_Quality != QualitySettings.GetQualityLevel())
{
QualitySettings.SetQualityLevel(quality, true);
QualitySettings.vSyncCount = vSync;
}
}
}
}