You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
3.9 KiB

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<SceneController>
{
public State state = State.Standby;
[Range(0, 1)]
public float rate = 0.0f;
[SerializeField]
UniformBlendedStructuredBuffer uniform;
//[SerializeField]
public List<Material> spaceMaterials = new List<Material>();
[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<CharacterBehaviour> characters;
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<CharacterBehaviour>();
characters = new List<CharacterBehaviour>(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))
{
GoDay();
}
}
else if (state == State.Day)
{
target_rate = 0.0f;
if (Input.GetKeyDown(KeyCode.PageUp))
{
GoStandby();
}
else if (Input.GetKeyDown(KeyCode.PageDown))
{
GoNight();
}
}
else if (state == State.Night)
{
target_rate = 1.0f;
if (Input.GetKeyDown(KeyCode.PageUp))
{
GoStandby();
}
else if (Input.GetKeyDown(KeyCode.PageDown))
{
GoStandby();
}
}
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);
foreach (var chr in characters)
{
chr.Active = chr.appearSataes.Contains(state);
}
}
public void GoStandby()
{
state = State.Standby;
onSceneStandby.Invoke();
}
public void GoDay()
{
state = State.Day;
onSceneDay.Invoke();
}
public void GoNight()
{
state = State.Night;
onSceneNight.Invoke();
}
}
}