using Games.Scene; using GCGame.Table; using Module.Log; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; public class CameraTestPanel : UIControllerBase { private void OnEnable() { SetInstance(this); InitPos(); } private void OnDisable() { SetInstance(null); CleanPos(); } public void CloseWindow() { UIManager.CloseUI(UIInfo.CameraTest); } #region public Slider _SlideX; public Slider _SlideY; public Slider _SlideZ; public Slider _SlideV; public Text _TextX; public Text _TextY; public Text _TextZ; public Text _TextV; private SliderControl[] _sliderControls; private bool _AfterInit; private void InitPos() { CleanPos(); if (SceneLogic.CameraController == null) LogModule.ErrorLog("摄像机控制组件无法找到摄像机控制器!"); else { _sliderControls = new SliderControl[4]; _sliderControls[0] = new SliderControl("仰角", 0f, 60f, SceneLogic.CameraController.Pitch, _SlideX, _TextX, a => SceneLogic.CameraController.Pitch = a); _sliderControls[1] = new SliderControl("水平角", 0f, 360f, SceneLogic.CameraController.Yaw, _SlideY, _TextY, a => SceneLogic.CameraController.Yaw = a); _sliderControls[2] = new SliderControl("距离", 5f, 30f, SceneLogic.CameraController.Distance, _SlideZ, _TextZ, a => SceneLogic.CameraController.Distance = a); _sliderControls[3] = new SliderControl("视角比例", 0f, 1f, SceneLogic.CameraController.FoVScale, _SlideV, _TextV, a => SceneLogic.CameraController.FoVScale = a); } } private void CleanPos() { if (_sliderControls != null) { for (var i = 0; i < _sliderControls.Length; i++) _sliderControls[i].Clear(); } _sliderControls = null; } private class SliderControl { private readonly string name; private readonly float minValue; private readonly float maxValue; private readonly float defaultValue; private readonly UnityAction action; private readonly Text text; private readonly Slider slider; public SliderControl(string name, float minValue, float maxValue, float defaultValue, Slider slider, Text text, UnityAction action) { this.name = name; this.minValue = minValue; this.maxValue = maxValue; this.action = action; this.text = text; this.slider = slider; // 注:不精确,浮点计算精度问题,可以忽略 slider.value = (defaultValue - minValue) / (maxValue - minValue); OnSliderValue(slider.value); slider.onValueChanged.AddListener(OnSliderValue); } private void OnSliderValue(float ratio) { var value = Mathf.Lerp(minValue, maxValue, ratio); text.text = string.Format("{0}:{1:0.00}", name, value); action(value); } public void Clear() { slider.onValueChanged.RemoveListener(OnSliderValue); } } #endregion }