天津23维预案
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.

143 lines
4.2 KiB

2 years ago
using UnityEngine;
using System.Collections;
public class OilReveal : MonoBehaviour {
[SerializeField]
private float diffuseSpeed = 1f;//diffuse offset Y的变化速度
[SerializeField]
private float nodeSpeed = 1f;//node4372 offset Y的变化速度
[SerializeField]
private float alphaSpeed = 1f;//alpha变化速度
[SerializeField]
private float bulgeIntervalPeriod = 0.1f;//波动周期 取随机数的间隔时间
[SerializeField]
private float bulgeLateTime = 0f;//波动延迟时间
[SerializeField]
private float alphaLateTime = 1f;//透明变化延迟时间
[SerializeField]
private float colorLateTime = 1f;//颜色变化延迟时间
[SerializeField]
private float bulgeScaleMin = 0f;//bulgeScale最小值
[SerializeField]
private float bulgeScaleMax = 1f;//bulgeScale最大值
[SerializeField]
private float nodeYMin = 0f;//node4372 offset Y的最小值
//[SerializeField]
public float nodeYMax = 1f;//node4372 offset Y的最大值
[SerializeField]
private float alphaMin = 0f;//alpha的最小值
[SerializeField]
private float alphaMax = 1f;//alpha最大值
[SerializeField]
private Color color = new Color();//颜色
private MeshRenderer oil;//燃油的shander
private void Start () {
oil = GetComponent<MeshRenderer>();
//初始化数值
nodeValue = nodeYMin;//oil.material.GetTextureOffset("_node_4372").y;
diffuseValue = oil.material.GetTextureOffset("_Diffuse").y;
bulgeValue = bulgeScaleMin;//oil.material.GetFloat("_BulgeScale");
alphaValue = alphaMin;//oil.material.GetFloat("_alpha");
if (bulgeIsOn)
InvokeRepeating("Fluctuate", bulgeLateTime, bulgeIntervalPeriod);
if (alphaIsOn)
InvokeRepeating("AlphaChange", alphaLateTime, Time.deltaTime);
if (colorIsOn)
Invoke("SetColor", colorLateTime);
}
[SerializeField]
private bool diffuseIsOn;//燃油流动开关
[SerializeField]
private bool nodeIsOn;//延伸开关
[SerializeField]
private bool bulgeIsOn;//波动开关
[SerializeField]
private bool alphaIsOn;//透明通道变化开关
[SerializeField]
private bool colorIsOn;//透明通道变化开关
[SerializeField]
private bool bulgeTransitionIsOn;//开启波动过度
//面板数值
[SerializeField]
public float nodeValue;
private float diffuseValue;
private float bulgeValue;
private float alphaValue;
private void Update () {
//燃油流动效果
if (diffuseIsOn)
{
diffuseValue -= Time.deltaTime * diffuseSpeed;
oil.material.SetTextureOffset("_Diffuse", new Vector2(0, diffuseValue));
}
//燃油延伸效果
if (nodeIsOn && nodeValue < nodeYMax)
{
nodeValue += Time.deltaTime * nodeSpeed / 20;
oil.material.SetTextureOffset("_node_4372", new Vector2(0, nodeValue));
}
//波动效果
if (bulgeIsOn && bulgeUpdate)
{
if (bulgeTransitionIsOn)
bulgeValue = Lerp(bulgeValue, bulgeValue2);
oil.material.SetFloat("_BulgeScale", bulgeValue);
}
}
//private float bulgeValue1;
private float bulgeValue2;
private bool bulgeUpdate;
//波动效果
private void Fluctuate()
{
bulgeUpdate = true;
//波动效果
//bulgeValue = GetRandom(bulgeScaleMin, bulgeScaleMax);
//oil.material.SetFloat("_BulgeScale", bulgeValue);
if (bulgeTransitionIsOn)//开启过度
{
//bulgeValue1 = bulgeValue;
bulgeValue2 = GetRandom(bulgeScaleMin, bulgeScaleMax);
}
else//不使用过度
bulgeValue = GetRandom(bulgeScaleMin, bulgeScaleMax);
}
//开启透明变化
private void AlphaChange()
{
alphaValue += Time.deltaTime * alphaSpeed;
oil.material.SetFloat("_alpha", alphaValue);
if(alphaValue > alphaMax)
{
CancelInvoke("AlphaChange");
}
}
//颜色变化
private void SetColor()
{
oil.material.SetColor("_color", color);
}
private float random = 0;//上一次的随机数
//随机数
private float GetRandom(float min, float max)
{
float number = Random.Range(min, max);
if (number == random)
return GetRandom(min, max);
else
{
random = number;
return number;
}
}
//返回两个值之间周期内过渡数
private float Lerp(float value1,float value2)
{
//print(Time.time % bulgeIntervalPeriod / bulgeIntervalPeriod);
return Mathf.Lerp(value1, value2, Time.time % bulgeIntervalPeriod / bulgeIntervalPeriod);
}
}