简易的游戏通用设置页面

本文章包含所有代码及UI结构

页面效果:

UI结构(便于管理):

代码:

思路:

整个页面的父物体SettingPanel上挂载管理代码,用于获取设置页面中所有的功能按钮,拖动条,下拉框等,做一个单例以便其他Panel获取.

有三个按钮有二级页面,所以还需要分别写三个Panel管理代码管理不同的页面,他们都有一个相同点,打开关闭(渐变)激活状态等,所以把这些功能写道一个代码里作为他们的父物体,

先抛开需求如何实现,这些数据必须是要保存的,不能打开游戏又需要重新设置一遍,需要创建一个数据保存类,其功能就是,保存数据(保存到本地),读取数据,默认数据等…,可以在关闭页面时统一保存到本地,打开游戏时读取并加载本地数据,加载数据与保存数据(保存到缓存)的功能应该是SettingPanel来完成,因为所有的按钮,拖动条,下拉框都在这个代码上,也便于赋值.

功能实现问题:

1.内容中的亮度,对比饱和这种是Shader效果,所以并不能通用与各种渲染管线,目前只考虑通用渲染管线,如果有自己的渲染管线,也很好修改.
2.在制作过程中Slider不能仅仅是拖动效果,还需要显示具体的数值并修改数值,所以每一个Slider后都需要一个输入框连接拖拽值.
3.分辨率窗口化帧率等这些可以调用系统设置来完成,抗锯齿,阴影,图像质量(根据项目设定,暂时用系统),按键输入就必须是自己写功能,是时候上代码了.

其中用到了几个小工具

文件工具
using System.Collections.Generic;
using System.IO;
using UnityEngine;namespace TFramework
{public partial class FileUtil{/// <summary>/// 错误内容/// </summary>static string Error = "错误!没有寻找到文件,建议查看文件名称是否输入错误?";//暂时存储的文件内容static List<string> datas = new List<string>();/// <summary>/// 在本地读取文件全部数据/// </summary>/// <param name="txtName">文件名</param>/// <returns>返回每行</returns>public static List<string> ReadLocalData(string txtName){datas.Clear();StreamReader sr = null;//读取if (new FileInfo(Application.persistentDataPath + "\\" + txtName).Exists)sr = File.OpenText(Application.persistentDataPath + "\\" + txtName);//读取文件else{datas.Add(Error);return datas;}//读取所有行string data = null;do{data = sr.ReadLine();if (data != null)datas.Add(data);} while (data != null);sr.Close();//关闭流sr.Dispose();//销毁流return datas;}/// <summary>/// 在本地写入一行数据/// </summary>/// <param name="txtName">文件名</param>/// <param name="data">写入数据</param>public static void WriteLocalTxt(string txtName, string data){StreamWriter sw;//写入FileInfo t = new FileInfo(Application.persistentDataPath + "\\" + txtName);//文件流 if (!t.Exists){sw = t.CreateText();//创建}else{sw = t.AppendText();//打开文件}sw.WriteLine(data);//写入数据sw.Flush();//清除缓冲区sw.Close();//关闭流sw.Dispose();//销毁流}/// <summary>/// 删除本地文件/// </summary>/// <param name="txtName"></param>public static void DeleteLocalTxt(string txtName){FileInfo t = new FileInfo(Application.persistentDataPath + "\\" + txtName);//文件流 t.Delete();}/// <summary>/// 清空StreamingAssetsData/// </summary>/// <param name="txtName"></param>public static void ClearStreamingAssetsData(string txtName){string Path = GetStreamingAssetsPath();txtName = Path + txtName;StreamWriter tmpWrite = new StreamWriter(txtName);tmpWrite.WriteLine("");tmpWrite.Close();}/// <summary>/// 读取StreamingAssets目录文件/// </summary>/// <param name="path">路径:"/文件名加后缀"</param>/// <returns>返回字符串</returns>public static List<string> ReadStreamingAssetsData(string path){FileInfo t = new FileInfo(GetStreamingAssetsPath() + "\\" + path);//文件流 if (!t.Exists){return null;}string Path = GetStreamingAssetsPath();path = Path + path;//打开文件StreamReader tmpReader = new StreamReader(path);datas.Clear();string ReadRow = tmpReader.ReadLine();while (ReadRow != null){datas.Add(ReadRow);ReadRow = tmpReader.ReadLine();}tmpReader.Close();return datas;}/// <summary>/// StreamingAssets目录写入一行数据/// </summary>/// <param name="path"></param>public static void WriteStreamingAssetsData(string path, string data){ReadStreamingAssetsData(path);//string Path = GetStreamingAssetsPath();//path = Path + path;//StreamWriter tmpWrite = new StreamWriter(path);StreamWriter tmpWrite;FileInfo t = new FileInfo(GetStreamingAssetsPath() + "\\" + path);//文件流 if (!t.Exists){tmpWrite = t.CreateText();//创建}else{tmpWrite = t.AppendText();//打开文件}//foreach (string linedata in datas)//{//    tmpWrite.WriteLine(linedata);//}tmpWrite.WriteLine(data);tmpWrite.Close();}/// <summary>/// 得到StreamingAssets目录/// </summary>/// <returns></returns>static string GetStreamingAssetsPath(){string str = Application.streamingAssetsPath + "/";return str;}}}
字符串功能扩展
using System.Collections.Generic;namespace TFramework
{public partial class StringUtil{/// <summary>/// 替换字符/// </summary>/// <param name="str">需要修改的字符串</param>/// <param name="Target">需要替换的字符串</param>/// <param name="ModifyTarget">替换为ModifyTarget</param>/// <returns></returns>public static string Replace(string str, string Target, string ModifyTarget){string ModifyStr = "";ModifyStr = System.Text.RegularExpressions.Regex.Replace(str, Target, ModifyTarget);return ModifyStr;}/// <summary>/// 替换字符/// </summary>/// <param name="str">需要修改的字符串</param>/// <param name="Target1">需要替换的其中一个字符串</param>/// <param name="Target2">需要替换的其中一个字符串</param>/// <param name="ModifyTarget1">Target1替换为ModifyTarget1</param>/// <param name="ModifyTarget2">Target2替换为ModifyTarget2</param>/// <returns></returns>public static string Replace(string str, string Target1, string Target2, string ModifyTarget1, string ModifyTarget2){string ModifyStr = "";ModifyStr = System.Text.RegularExpressions.Regex.Replace(str, Target1, ModifyTarget1);return System.Text.RegularExpressions.Regex.Replace(ModifyStr, Target2, ModifyTarget2);}/// <summary>/// 字符串截取(两个字符中间的字符串)/// </summary>/// <param name="str">需要截取的字符串</param>/// <param name="LocationStart">从这个地方开始截取</param>/// <param name="LocationEnd">截取到这个地方</param>/// <returns></returns>public static string Substring(string str, char LocationStart, char LocationEnd){if (str.Length < 3)return "字符串少于3,无法截取";string ModifyStr = "";int index0 = 0;int index1 = 0;for (int j = 0; j < str.Length; j++){if (str[j] == LocationStart){index0 = j;}if (str[j] == LocationEnd){index1 = j;}}ModifyStr = str.Substring(index0 + 1, index1 - index0 - 1);return ModifyStr;}/// <summary>/// 字符串截取(字符到开始或结束)/// </summary>/// <param name="str"></param>/// <param name="TargetChar"></param>/// <param name="IsAback"></param>/// <returns></returns>public static string Substring(string str, char TargetChar, bool IsAback){if (str.Length < 3)return "字符串少于3,无法截取";string ModifyStr = "";int index = 0;for (int j = 0; j < str.Length; j++){if (str[j] == TargetChar){index = j;}}if (IsAback){ModifyStr = str.Substring(index + 1, str.Length - 1 - index);}else{ModifyStr = str.Substring(0, index);}return ModifyStr;}/// <summary>/// 字符串截取/// </summary>/// <param name="str">需要截取的字符串</param>/// <param name="LocationStart">从这个地方开始截取</param>/// <param name="LocationEnd">截取到这个地方</param>/// <returns></returns>public static List<string> Substrings(string str, char LocationStart, char LocationEnd){List<string> ModifyStrs = new List<string>();if (str.Length < 3)return null;int index0 = 0;int index1 = 0;for (int j = 0; j < str.Length; j++){if (str[j] == LocationStart){index0 = j;}if (str[j] == LocationEnd){index1 = j;ModifyStrs.Add(str.Substring(index0 + 1, index1 - index0 - 1));}}return ModifyStrs;}public static List<string> Substrings(string str, char LocationStart1, char LocationEnd1, char LocationStart2, char LocationEnd2){List<string> ModifyStrs = new List<string>();if (str.Length < 3)return null;int index0 = -1;int index1 = -1;int index2 = -1;int index3 = -1;for (int j = 0; j < str.Length; j++){if (str[j] == LocationStart1)index0 = j;if (str[j] == LocationStart2)index2 = j;if (str[j] == LocationEnd1 && index0 != -1){index1 = j;ModifyStrs.Add(str.Substring(index0 + 1, index1 - index0 - 1));}if (str[j] == LocationEnd2 && index2 != -1){index3 = j;ModifyStrs.Add(str.Substring(index2 + 1, index3 - index2 - 1));}}return ModifyStrs;}}
}
PanelBase(页面父类)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PanelBase : MonoBehaviour
{CanvasGroup CanvasGroup_Panel;bool ActivateChangeAlpha = false;float AlphaValue = 0;[HideInInspector]public bool ActivateState=false;protected virtual void Start(){CanvasGroup_Panel = GetComponent<CanvasGroup>();}public virtual void ShowPanel(){AlphaValue = 1;ActivateChangeAlpha = true;CanvasGroup_Panel.blocksRaycasts = true;ActivateState = true;}public virtual void HidePanel(){AlphaValue = 0;ActivateChangeAlpha = true;CanvasGroup_Panel.blocksRaycasts = false ;ActivateState = false;}protected virtual void Update(){if (ActivateChangeAlpha){CanvasGroup_Panel.alpha = Mathf.Lerp(CanvasGroup_Panel.alpha, AlphaValue, 0.1f);if (Mathf.Abs(CanvasGroup_Panel.alpha - AlphaValue) < .1f){CanvasGroup_Panel.alpha = AlphaValue;ActivateChangeAlpha = false;}}}
}
DataProcessing(数据保存类)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TFramework;public class DataProcessing : MonoBehaviour
{public float Data_LuminanceValue=1, Data_ContrastValue=1, Data_SaturationValue=1, Data_AudioValue=1, Data_VisibilityValue=200;public int Data_ResolutionIndex = 0, Data_FPSIndex = 1, Data_AntiAliasingIndex=0, Data_ShadowQualityIndex=2, Data_GrainQualityIndex=2;public bool Data_IsWindow=false, Data_IsVsync=false;public List<int> Keypads = new List<int>();private void Awake(){ReadDate();}/// <summary>/// 数据保存在本地StreamingAssets文件夹/// </summary>public void SaveDate(){FileUtil.ClearStreamingAssetsData("SettingData");//清空之前的数据FileUtil.WriteStreamingAssetsData("SettingData", "Data_LuminanceValue=" + Data_LuminanceValue);FileUtil.WriteStreamingAssetsData("SettingData", "Data_ContrastValue=" + Data_ContrastValue);FileUtil.WriteStreamingAssetsData("SettingData", "Data_SaturationValue=" + Data_SaturationValue);FileUtil.WriteStreamingAssetsData("SettingData", "Data_AudioValue=" + Data_AudioValue);FileUtil.WriteStreamingAssetsData("SettingData", "Data_VisibilityValue=" + Data_VisibilityValue);FileUtil.WriteStreamingAssetsData("SettingData", "");FileUtil.WriteStreamingAssetsData("SettingData", "Data_ResolutionIndex=" + Data_ResolutionIndex);FileUtil.WriteStreamingAssetsData("SettingData", "Data_FPSIndex=" + Data_FPSIndex);FileUtil.WriteStreamingAssetsData("SettingData", "Data_AntiAliasingIndex=" + Data_AntiAliasingIndex);FileUtil.WriteStreamingAssetsData("SettingData", "Data_ShadowQualityIndex=" + Data_ShadowQualityIndex);FileUtil.WriteStreamingAssetsData("SettingData", "Data_GrainQualityIndex=" + Data_GrainQualityIndex);FileUtil.WriteStreamingAssetsData("SettingData", "");FileUtil.WriteStreamingAssetsData("SettingData", "Data_IsWindow=" + Data_IsWindow);FileUtil.WriteStreamingAssetsData("SettingData", "Data_IsVsync=" + Data_IsVsync);FileUtil.WriteStreamingAssetsData("SettingData", "");int keyIndex = 1;foreach (int key in Keypads){FileUtil.WriteStreamingAssetsData("SettingData", "Key"+ keyIndex+"=" + key);keyIndex++;}}void ReadDate(){Keypads.Clear();List<string> SettingDate = FileUtil.ReadStreamingAssetsData("SettingData");if (SettingDate == null){SetDefaultData();return;}foreach (var item in SettingDate){if (item=="")continue;string str = StringUtil.Substring(item, '=', false);string value = StringUtil.Substring(item, '=', true);switch (str){case "Data_LuminanceValue":Data_LuminanceValue = float.Parse(value);break;case "Data_ContrastValue":Data_ContrastValue = float.Parse(value);break;case "Data_SaturationValue":Data_SaturationValue = float.Parse(value);break;case "Data_AudioValue":Data_AudioValue = float.Parse(value);break;case "Data_VisibilityValue":Data_VisibilityValue = float.Parse(value);break;case "Data_ResolutionIndex":Data_ResolutionIndex = int.Parse(value);break;case "Data_FPSIndex":Data_FPSIndex = int.Parse(value);break;case "Data_AntiAliasingIndex":Data_AntiAliasingIndex = int.Parse(value);break;case "Data_ShadowQualityIndex":Data_ShadowQualityIndex = int.Parse(value);break;case "Data_GrainQualityIndex":Data_GrainQualityIndex = int.Parse(value);break;case "Data_IsWindow":Data_IsWindow = bool.Parse(value);break;case "Data_IsVsync":Data_IsVsync = bool.Parse(value);break;}if (str.Substring(0,3)=="Key"){Keypads.Add(int.Parse(value));}}}void SetDefaultData(){Data_LuminanceValue = 1;Data_ContrastValue = 1;Data_SaturationValue = 1;Data_AudioValue = 1;Data_VisibilityValue = 200;Data_ResolutionIndex = 0;Data_FPSIndex = 1;Data_AntiAliasingIndex = 1;Data_ShadowQualityIndex = 1;Data_GrainQualityIndex = 2;Data_IsWindow = false;Data_IsVsync = false;}
}
SettingPanel(管理类)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class SettingPanel : PanelBase
{static SettingPanel settingPanel;public static SettingPanel instance{get { return settingPanel; }}[HideInInspector]public Camera m_Camera;//得到相机public DataProcessing dataProcessing;CameraFilterPack_Blur Blur;//屏幕虚化效果//得到三个页面private GameSetPanel Panel_GameSet;private GraphicsSetPanel Panel_GraphicsSet;private KeypadSetPanel Panel_KeypadSet;//各种可调参数[HideInInspector]public Slider LuminanceValueSlider, ContrastValueSlider, SaturationValueSlider, AudioValueSlider, VisibilityValueSlider;[HideInInspector]public InputField LuminanceValueInputField, ContrastValueInputField, SaturationValueInputField, AudioValueInputField, VisibilityValueInputField;[HideInInspector]public Dropdown ResolutionDropdown, FPSDropdown, AntiAliasingDropdown, ShadowQualityDropdown, GrainQualityDropdown;[HideInInspector]public Toggle WindowToggle, VsyncToggle;[HideInInspector]public Button GameSetPanelQuitButton, KeypadSetPanelQuitButton, GraphicsSetPanelQuitButton;bool IsActivate = false;void GetData(){dataProcessing.Data_LuminanceValue = LuminanceValueSlider.value;dataProcessing.Data_ContrastValue = ContrastValueSlider.value;dataProcessing.Data_SaturationValue = SaturationValueSlider.value;dataProcessing.Data_AudioValue = AudioValueSlider.value;dataProcessing.Data_VisibilityValue = VisibilityValueSlider.value;dataProcessing.Data_ResolutionIndex = ResolutionDropdown.value;dataProcessing.Data_FPSIndex = FPSDropdown.value;dataProcessing.Data_AntiAliasingIndex = AntiAliasingDropdown.value;dataProcessing.Data_ShadowQualityIndex = ShadowQualityDropdown.value;dataProcessing.Data_GrainQualityIndex = GrainQualityDropdown.value;dataProcessing.Data_IsWindow = WindowToggle.isOn;dataProcessing.Data_IsVsync = VsyncToggle.isOn;dataProcessing.Keypads.Clear();foreach (var key in Panel_KeypadSet.downAnyKeys){dataProcessing.Keypads.Add((int)key.key);}}void SetData(){LuminanceValueSlider.value = dataProcessing.Data_LuminanceValue;ContrastValueSlider.value = dataProcessing.Data_ContrastValue;SaturationValueSlider.value = dataProcessing.Data_SaturationValue;AudioValueSlider.value = dataProcessing.Data_AudioValue;VisibilityValueSlider.value = dataProcessing.Data_VisibilityValue;ResolutionDropdown.value = dataProcessing.Data_ResolutionIndex;Panel_GameSet.ResolutionChange(dataProcessing.Data_ResolutionIndex);FPSDropdown.value = dataProcessing.Data_FPSIndex;Panel_GameSet.GameFPSChange(dataProcessing.Data_FPSIndex);AntiAliasingDropdown.value = dataProcessing.Data_AntiAliasingIndex;Panel_GraphicsSet.AntiAliasingChange(dataProcessing.Data_AntiAliasingIndex);ShadowQualityDropdown.value = dataProcessing.Data_ShadowQualityIndex;Panel_GraphicsSet.ShadowQualityChange(dataProcessing.Data_ShadowQualityIndex);GrainQualityDropdown.value = dataProcessing.Data_GrainQualityIndex;Panel_GraphicsSet.GrainQualityChange(dataProcessing.Data_GrainQualityIndex);WindowToggle.isOn = dataProcessing.Data_IsWindow;Panel_GameSet.WindowStateChange(dataProcessing.Data_IsWindow);VsyncToggle.isOn = dataProcessing.Data_IsVsync;Panel_GameSet.VsyncStateChange(dataProcessing.Data_IsVsync);for (int Index = 0; Index < dataProcessing.Keypads.Count; Index++){Panel_KeypadSet.downAnyKeys[Index].SetKeyValue(dataProcessing.Keypads[Index]);}}/// <summary>/// 用于得到全部可控参数/// </summary>private void Awake(){settingPanel = this;m_Camera = Camera.main;Blur = m_Camera.GetComponent<CameraFilterPack_Blur>();foreach (var button in GetComponentsInChildren<Button>()){switch (button.name){case "游戏设置Button":button.onClick.AddListener(GameSetButtonClicked);break;case "按键设置Button":button.onClick.AddListener(KeypadSetButtonClicked);break;case "图像设置Button":button.onClick.AddListener(GraphicsSetButtonClicked);break;case "退出游戏Button":button.onClick.AddListener(QuitGameButtonClicked);break;case "游戏设置退出Button":GameSetPanelQuitButton = button;break;case "按键设置退出Button":KeypadSetPanelQuitButton = button;break;case "图像设置退出Button":GraphicsSetPanelQuitButton = button;break;}}foreach (RectTransform panel in transform){switch (panel.name){case "游戏设置Panel":Panel_GameSet = panel.GetComponent<GameSetPanel>();break;case "按键设置Panel":Panel_KeypadSet = panel.GetComponent<KeypadSetPanel>();break;case "图像设置Panel":Panel_GraphicsSet = panel.GetComponent<GraphicsSetPanel>();break;}}foreach (var slider in GetComponentsInChildren<Slider>()){switch (slider.name){case "亮度调节Slider":LuminanceValueSlider = slider;break;case "对比度调节Slider":ContrastValueSlider = slider;break;case "饱和度调节Slider":SaturationValueSlider = slider;break;case "全局音量调节Slider":AudioValueSlider = slider;break;case "整体可见度Slider":VisibilityValueSlider = slider;break;}}foreach (var inputField in GetComponentsInChildren<InputField>()){switch (inputField.name){case "亮度调节InputField":LuminanceValueInputField = inputField;break;case "对比度调节InputField":ContrastValueInputField = inputField;break;case "饱和度调节InputField":SaturationValueInputField = inputField;break;case "全局音量调节InputField":AudioValueInputField = inputField;break;case "整体可见度InputField":VisibilityValueInputField = inputField;break;}}foreach (var dropDown in GetComponentsInChildren<Dropdown>()){switch (dropDown.name){case "分辨率设置Dropdown":ResolutionDropdown = dropDown;break;case "帧率设置Dropdown":FPSDropdown = dropDown;break;case "抗锯齿设置Dropdown":AntiAliasingDropdown = dropDown;break;case "阴影质量Dropdown":ShadowQualityDropdown = dropDown;break;case "纹理质量Dropdown":GrainQualityDropdown = dropDown;break;}}foreach (var toggle in GetComponentsInChildren<Toggle>()){switch (toggle.name){case "窗口化Toggle":WindowToggle = toggle;break;case "垂直同步Toggle":VsyncToggle = toggle;break;}}}/// <summary>/// 初始化/// </summary>protected override void Start(){base.Start();SetData();HideAllPanel();HidePanel();}/// <summary>/// 关闭所有打开的页面/// </summary>public void HideAllPanel(){Panel_GameSet.HidePanel();Panel_GraphicsSet.HidePanel();Panel_KeypadSet.HidePanel();}/// <summary>/// 得到页面的状态,一旦有一个打开则返回true/// </summary>/// <returns></returns>bool AllPanelState(){if (Panel_GameSet.ActivateState || Panel_GraphicsSet.ActivateState || Panel_KeypadSet.ActivateState){return true;}return false;}#region 按钮事件void GameSetButtonClicked(){Panel_GameSet.ShowPanel();}void KeypadSetButtonClicked(){Panel_KeypadSet.ShowPanel();}void GraphicsSetButtonClicked(){Panel_GraphicsSet.ShowPanel();}void QuitGameButtonClicked(){GetData();dataProcessing.SaveDate();Application.Quit();}#endregion/// <summary>/// 打开设置页面/// </summary>public override void ShowPanel(){base.ShowPanel();Blur.enabled = true;IsActivate = true;}/// <summary>/// 关闭设置页面/// </summary>public override void HidePanel(){if (AllPanelState())//如果有页面打开则先关闭页面{HideAllPanel();}else{base.HidePanel();GetData();dataProcessing.SaveDate();Blur.enabled = false;IsActivate = false;}}protected override void Update(){base.Update();if (Input.GetKeyDown(KeyCode.Escape)){if (IsActivate){HidePanel();}else{ShowPanel();}}}
}
GameSetPanel(游戏设置页面)
效果:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameSetPanel : PanelBase
{SettingPanel settingPanel;int Wide = 1920, High = 1080;bool IsWindow=false;CameraFilterPack_BrightnessSaturationAndContrast BrightnessSaturationAndContrast;protected override void Start(){base.Start();settingPanel = SettingPanel.instance;BrightnessSaturationAndContrast = settingPanel.m_Camera.GetComponent<CameraFilterPack_BrightnessSaturationAndContrast>();settingPanel.GameSetPanelQuitButton.onClick.AddListener(QuitButtonClicked);settingPanel.LuminanceValueSlider.onValueChanged.AddListener(LuminanceValueChange);settingPanel.ContrastValueSlider.onValueChanged.AddListener(ContrastValueChange);settingPanel.SaturationValueSlider.onValueChanged.AddListener(SaturationValueChange);settingPanel.AudioValueSlider.onValueChanged.AddListener(AudioValueChange);settingPanel.LuminanceValueInputField.onValueChanged.AddListener(LuminanceInput);settingPanel.ContrastValueInputField.onValueChanged.AddListener(ContrastInput);settingPanel.SaturationValueInputField.onValueChanged.AddListener(SaturationInput);settingPanel.AudioValueInputField.onValueChanged.AddListener(AudioInput);settingPanel.ResolutionDropdown.onValueChanged.AddListener(ResolutionChange);settingPanel.WindowToggle.onValueChanged.AddListener(WindowStateChange);settingPanel.FPSDropdown.onValueChanged.AddListener(GameFPSChange);settingPanel.VsyncToggle.onValueChanged.AddListener(VsyncStateChange);InitInputValue();}/// <summary>/// 整体亮度/// </summary>/// <param name="value"></param>void LuminanceValueChange(float value){BrightnessSaturationAndContrast.Brightness = value;settingPanel.LuminanceValueInputField.text = value.ToString();}/// <summary>/// 对比度/// </summary>/// <param name="value"></param>void ContrastValueChange(float value){BrightnessSaturationAndContrast.Contrast = value;settingPanel.ContrastValueInputField.text = value.ToString();}/// <summary>/// 饱和度/// </summary>/// <param name="value"></param>void SaturationValueChange(float value){BrightnessSaturationAndContrast.Saturation = value;settingPanel.SaturationValueInputField.text = value.ToString();}/// <summary>/// 音量/// </summary>/// <param name="value"></param>void AudioValueChange(float value){AudioListener.volume = value;settingPanel.AudioValueInputField.text = value.ToString();}void InitInputValue(){settingPanel.LuminanceValueInputField.text = settingPanel.LuminanceValueSlider.value.ToString();settingPanel.ContrastValueInputField.text = settingPanel.ContrastValueSlider.value.ToString();settingPanel.SaturationValueInputField.text = settingPanel.SaturationValueSlider.value.ToString();settingPanel.AudioValueInputField.text = settingPanel.AudioValueSlider.value.ToString();}/// <summary>/// 亮度输入/// </summary>/// <param name="value"></param>void LuminanceInput(string value){if (value == "")return;float mValue = float.Parse(value);if (mValue < settingPanel.LuminanceValueSlider.minValue){mValue = settingPanel.LuminanceValueSlider.minValue;}if (mValue > settingPanel.LuminanceValueSlider.maxValue){mValue = settingPanel.LuminanceValueSlider.maxValue;}//限制大小settingPanel.LuminanceValueSlider.value = mValue;BrightnessSaturationAndContrast.Brightness = mValue;}/// <summary>/// 对比度输入/// </summary>/// <param name="value"></param>void ContrastInput(string value){if (value == "")return;float mValue = float.Parse(value);if (mValue < settingPanel.ContrastValueSlider.minValue){mValue = settingPanel.ContrastValueSlider.minValue;}if (mValue > settingPanel.ContrastValueSlider.maxValue){mValue = settingPanel.ContrastValueSlider.maxValue;}//限制大小settingPanel.ContrastValueSlider.value = mValue;BrightnessSaturationAndContrast.Contrast = mValue;}/// <summary>/// 饱和度输入/// </summary>/// <param name="value"></param>void SaturationInput(string value){if (value == "")return;float mValue = float.Parse(value);if (mValue < settingPanel.SaturationValueSlider.minValue){mValue = settingPanel.SaturationValueSlider.minValue;}if (mValue > settingPanel.SaturationValueSlider.maxValue){mValue = settingPanel.SaturationValueSlider.maxValue;}//限制大小settingPanel.SaturationValueSlider.value = mValue;BrightnessSaturationAndContrast.Saturation = mValue;}void AudioInput(string value){if (value == "")return;float mValue = float.Parse(value);if (mValue < settingPanel.AudioValueSlider.minValue){mValue = settingPanel.AudioValueSlider.minValue;}if (mValue > settingPanel.AudioValueSlider.maxValue){mValue = settingPanel.AudioValueSlider.maxValue;}//限制大小settingPanel.AudioValueSlider.value = mValue;AudioListener.volume = mValue;}/// <summary>/// 分辨率/// </summary>/// <param name="value"></param>public void ResolutionChange(int value){switch (value){case 0:Wide = 1920;High = 1080;break;case 1:Wide = 1680;High = 1050;break;case 2:Wide = 1600;High = 1024;break;case 3:Wide = 1600;High = 900;break;case 4:Wide = 1400;High = 900;break;case 5:Wide = 1366;High = 768;break;case 6:Wide = 1360;High = 768;break;case 7:Wide = 1280;High = 1024;break;case 8:Wide = 1280;High = 960;break;case 9:Wide = 1280;High = 768;break;case 10:Wide = 1280;High = 720;break;case 11:Wide = 1152;High = 864;break;case 12:Wide = 1024;High = 768;break;case 13:Wide = 800;High = 600;break;}ResolutionSet(Wide,High, !IsWindow);}/// <summary>/// 窗口化/// </summary>/// <param name="value"></param>public void WindowStateChange(bool value){IsWindow = value;ResolutionSet(Wide, High, !IsWindow);}/// <summary>/// 帧速率/// </summary>/// <param name="value"></param>public void GameFPSChange(int value){switch (value){case 0:Application.targetFrameRate = 30;break;case 1:Application.targetFrameRate = 60;break;case 2:Application.targetFrameRate = 144;break;case 3:Application.targetFrameRate = -1;break;}ResolutionSet(Wide, High, !IsWindow);}/// <summary>/// 垂直同步/// </summary>/// <param name="value"></param>public void VsyncStateChange(bool value){if (value){QualitySettings.vSyncCount = 1;}else{QualitySettings.vSyncCount = 0;}}public void ResolutionSet(int wide, int high, bool isFullscreen){Screen.SetResolution(wide, high, isFullscreen, 60);}/// <summary>/// 退出按钮/// </summary>void QuitButtonClicked(){settingPanel.HideAllPanel();}
}
KeypadSetPanel(按键设置页面)
效果:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class KeypadSetPanel : PanelBase
{SettingPanel settingPanel;[HideInInspector]public DownAnyKey[] downAnyKeys;private void Awake(){downAnyKeys = GetComponentsInChildren<DownAnyKey>();}protected override void Start(){base.Start();settingPanel = SettingPanel.instance;settingPanel.KeypadSetPanelQuitButton.onClick.AddListener(QuitButtonClicked);}/// <summary>/// 退出按钮/// </summary>void QuitButtonClicked(){RecoverKeypadSetting();settingPanel.HideAllPanel();}bool RecoverKeypadSetting(){foreach (var item in downAnyKeys){if (item.IsChangeKey){item.RecoverState();return true;}}return false;}
}
按键获取功能代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class DownAnyKey : MonoBehaviour
{Button button;Text inputtext;public KeyCode key;[HideInInspector]public bool IsChangeKey = false; //是否改键位private void Start(){button = GetComponent<Button>();button.onClick.AddListener(ButtonClicked);inputtext = GetComponentInChildren<Text>();inputtext.text = key.ToString(); buttonColor = button.image.color;}// Update is called once per framevoid Update(){if (IsChangeKey)getKeyDownCode();}void ButtonClicked(){IsChangeKey = true;ButtonSelect();}void ButtonSelect(){button.image.color = Color.black;}Color buttonColor;void ButtonUnSelect(){button.image.color = buttonColor;}public KeyCode getKeyDownCode(){if (Input.anyKeyDown){foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))){if (Input.GetKeyDown(keyCode) && keyCode != KeyCode.Mouse0){IsChangeKey = false;ButtonUnSelect();if (keyCode == KeyCode.Escape)return key;key = keyCode;inputtext.text = keyCode.ToString();return keyCode;}}RecoverState();}return KeyCode.None;}public void SetKeyValue(int mKey){RecoverState(); this.key = (KeyCode)mKey;inputtext.text = key.ToString();}public void RecoverState(){IsChangeKey = false;ButtonUnSelect();}
}
GraphicsSetPanel(图像设置页面)
效果:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GraphicsSetPanel : PanelBase
{SettingPanel settingPanel;protected override void Start(){base.Start();settingPanel = SettingPanel.instance;settingPanel.GraphicsSetPanelQuitButton.onClick.AddListener(QuitButtonClicked);settingPanel.VisibilityValueSlider.onValueChanged.AddListener(VisibilityValueChange);settingPanel.VisibilityValueInputField.onValueChanged.AddListener(VisibilityInput);settingPanel.AntiAliasingDropdown.onValueChanged.AddListener(AntiAliasingChange);settingPanel.ShadowQualityDropdown.onValueChanged.AddListener(ShadowQualityChange);settingPanel.GrainQualityDropdown.onValueChanged.AddListener(GrainQualityChange);InitInputValue();}/// <summary>/// 整体可见度/// </summary>/// <param name="value"></param>void VisibilityValueChange(float value){settingPanel.m_Camera.farClipPlane = value;settingPanel.VisibilityValueInputField.text = value.ToString();}/// <summary>/// 可见度输入/// </summary>/// <param name="value"></param>void VisibilityInput(string value){if (value == "")return;float mValue = float.Parse(value);if (mValue < settingPanel.VisibilityValueSlider.minValue){mValue = settingPanel.VisibilityValueSlider.minValue;}if (mValue > settingPanel.VisibilityValueSlider.maxValue){mValue = settingPanel.VisibilityValueSlider.maxValue;}//限制大小settingPanel.VisibilityValueSlider.value = mValue;settingPanel.m_Camera.farClipPlane = mValue;}void InitInputValue(){settingPanel.VisibilityValueInputField.text = settingPanel.VisibilityValueSlider.value.ToString();}/// <summary>/// 抗锯齿/// </summary>/// <param name="value"></param>public void AntiAliasingChange(int value){switch (value){case 0:settingPanel.m_Camera.GetComponent<FXAA>().enabled = true;break;case 1:settingPanel.m_Camera.GetComponent<FXAA>().enabled = false;break;case 2:settingPanel.m_Camera.GetComponent<FXAA>().enabled = false;break;}}/// <summary>/// 阴影质量/// </summary>/// <param name="value"></param>public void ShadowQualityChange(int value){switch (value){case 0:QualitySettings.shadows = ShadowQuality.Disable;break;case 1:QualitySettings.shadows = ShadowQuality.All;break;case 2:break;}}/// <summary>/// 纹理质量/// </summary>/// <param name="value"></param>public void GrainQualityChange(int value){switch (value){case 0:QualitySettings.pixelLightCount = 0;break;case 1:QualitySettings.pixelLightCount = 2;break;case 2:QualitySettings.pixelLightCount = 4;break;}}/// <summary>/// 退出按钮/// </summary>void QuitButtonClicked(){settingPanel.HideAllPanel();}
}
显示FPS功能
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// 打印FPS
/// </summary>
public class ShowFPS : MonoBehaviour
{public Text Fps;float _updateInterval = 1f;//设定更新帧率的时间间隔为1秒  float _accum = .0f;//累积时间  int _frames = 0;//在_updateInterval时间内运行了多少帧  float _timeLeft;string fpsFormat;void Start(){_timeLeft = _updateInterval;}void Update(){_timeLeft -= Time.deltaTime;//Time.timeScale可以控制Update 和LateUpdate 的执行速度,  //Time.deltaTime是以秒计算,完成最后一帧的时间  //相除即可得到相应的一帧所用的时间  _accum += Time.timeScale / Time.deltaTime;++_frames;//帧数  if (_timeLeft <= 0){float fps = _accum / _frames;fpsFormat = System.String.Format("{0:F2}FPS", fps);//保留两位小数  Fps.text = fpsFormat;_timeLeft = _updateInterval;_accum = .0f;_frames = 0;}}
}

其中的亮度,对比度,饱和度,抗锯齿代码我就不放出来了,都是Shader效果,不能通用与所有渲染管线,而且我相信每个人都有不同的解决方案.
Demo下载链接

Unity 3D 游戏通用系统设置页面,自定义按键设置,背景虚化,图像设置,亮度对比度饱和度音量调节,分辨率窗口化,帧率垂直同步,抗锯齿,阴影质量,纹理质量设置相关推荐

  1. 雨松MOMO《Unity 3D游戏开发》源码公布

    原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...

  2. Unity 3D 环境特效||Unity 3D 游戏场景设计实例

    Unity 3D 环境特效 一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程. Unity 3D 游戏开发引擎为了能够简单地还原真实世界中 ...

  3. Unity 3D游戏开发项目《战斗吧!勇士》

    目录 版权声明:本博客涉及的内容是对本人游戏作品<战斗吧!勇士>项目的总结,发布在网络上,旨在大家交流学习.互相促进.严禁用于其他一切用途. 摘要 游戏开发技术概述 Unity 3D 游戏 ...

  4. Unity 3D - 游戏开发中的Lua

    Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...

  5. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games

    Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...

  6. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  7. 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍

    随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...

  8. unity 3d游戏开发_使用Unity 5开发3D游戏

    unity 3d游戏开发 If there's one thing cooler than playing games, it's building games. 如果有比玩游戏更酷的一件事,那就是构 ...

  9. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

最新文章

  1. CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
  2. 苹果设置网易邮箱收件服务器,如何在iPhone 3/4、iPod touch的邮件应用程序中使用IMAP服务...
  3. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D
  4. 16道嵌入式C语言面试题(转载)
  5. 互联网1分钟 |1204
  6. java计算两个文本框的值,java 文本框自动获取另外两个文本框的值的乘积
  7. [Spring5]IOC容器_Bean管理_工厂Bean
  8. internet地址java表示
  9. 图书馆管理系统项目思路
  10. python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能
  11. 吴恩达发布了大型X光数据集,斯坦福AI诊断部分超越人类 | AAAI 2019
  12. mysql通用mapper_通用Mapper(Mybatis)
  13. 中间表为什么可以不用实体类_法国蜗牛供不应求,为什么不用中国蜗牛代替?看完才知道真不可以...
  14. 129个百度网盘资源搜索网站大全(建议收藏)
  15. USB 协议Audio应用
  16. 用ReadyBoost提高Windows 7系统性能
  17. QThread: Destroyed while thread is still running 解决方法
  18. 负载均衡器部署方式和工作原理
  19. GDSOI2019退役祭
  20. qq发消息时键盘挡住了_QQ的说说被键盘挡住了怎么办

热门文章

  1. 将MQTT收到的数据保存到MySQL数据库
  2. 电脑开机启动php,window_Win10开机自动启动在哪?win10如何设置软件开机启动?,windows 10系统的开机启动项如果 - phpStudy...
  3. SpringBoot 使用 Redis 分布式锁解决并发问题
  4. 中国穷人与富人的差别:你就输在人情上
  5. 永恒python配合什么主武器_《毁灭战士永恒》武器数据及用法分析
  6. JS键盘键捕捉 ctrlKey和shiftKey
  7. 【LeetCode15】三数之和
  8. Android Q Beta版本
  9. 工厂航拍全景车间VR全景线上展厅应用
  10. PS CS6之工具箱(1)