using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace UltraCombos.Frozen { public enum State { Standby, Day, Night, } public class SceneController : Singleton { public State state = State.Standby; [Range(0, 1)] public float rate = 0.0f; [SerializeField] UniformBlendedStructuredBuffer uniform; //[SerializeField] public List spaceMaterials = new List(); [SerializeField, Range(0.0f, 0.1f)] float daySnowSize = 0.01f; [SerializeField, Range(0.0f, 0.1f)] float nightSnowSize = 0.01f; [SerializeField] Material snowMaterial; [SerializeField] BlendedCosineGradient cosineGradient; [SerializeField] KinectOpticalFlow kinect; [SerializeField] float nightKinectAmount = 30.0f; [SerializeField] ParticleViewerProcedural particleViewer; [SerializeField, Range(0, 1)] float dayParticleRate = 1.0f; List characters; [SerializeField] List dayCharacters = new List(); [SerializeField] List nightCharacters = new List(); float target_rate = 0.0f; public UnityEvent onSceneStandby = new UnityEvent(); public UnityEvent onSceneDay = new UnityEvent(); public UnityEvent onSceneNight = new UnityEvent(); [SerializeField, Header("Debug")] bool mode = false; float stamp = 0.0f; private void Start() { var cbs = FindObjectsOfType(); characters = new List(cbs); //debug = false; } private void Update() { if (mode) { if (Time.time - stamp > 10.0f) { stamp = Time.time; target_rate = 1.0f - target_rate; } } if (state == State.Standby) { target_rate = 0.0f; if (Input.GetKeyDown(KeyCode.PageDown)) { state = State.Day; onSceneDay.Invoke(); } } else if (state == State.Day) { target_rate = 0.0f; if (Input.GetKeyDown(KeyCode.PageUp)) { state = State.Standby; onSceneStandby.Invoke(); } else if (Input.GetKeyDown(KeyCode.PageDown)) { state = State.Night; onSceneNight.Invoke(); } } else if (state == State.Night) { target_rate = 1.0f; if (Input.GetKeyDown(KeyCode.PageUp)) { state = State.Standby; onSceneStandby.Invoke(); } else if (Input.GetKeyDown(KeyCode.PageDown)) { state = State.Day; onSceneDay.Invoke(); } } rate = Mathf.Lerp(rate, target_rate, 0.02f); uniform.rate = rate; foreach (var mat in spaceMaterials) mat.SetFloat("_Rate", rate); //snowMaterial.SetFloat("_Size", Mathf.Lerp(0.0f, snowSize, rate)); snowMaterial.SetFloat("_Size", Mathf.Lerp(daySnowSize, nightSnowSize, rate)); cosineGradient.rate = rate; kinect.kinectAmount = Mathf.Lerp(1.0f, nightKinectAmount, rate); particleViewer.VertexCount = (int)(Mathf.Lerp(dayParticleRate, 1.0f, rate) * particleViewer.buffer.count); #if false foreach (var chr in dayCharacters) { chr.gameObject.SetActive(rate < 0.5); } foreach (var chr in nightCharacters) { chr.gameObject.SetActive(rate > 0.5); } #else foreach (var chr in characters) { chr.Active = chr.appearSataes.Contains(state); } #endif } } }