using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.PlayerLoop;
public class ChangeShaders : MonoBehaviour
{
private int val;
// Start is called before the first frame update
void Start()
{
//StartCoroutine(EffectSliderChanger());
}
private void Update()
{
gameObject.GetComponent<Renderer>().material.SetFloat("Effect Slider", val);
Mathf.Lerp(-1, 1, Time.deltaTime);
}
/*IEnumerator EffectSliderChanger()
{
gameObject.GetComponent<Renderer>().material.SetFloat("Effect Slider", 1);
}*/
}
我想在-1和1之间不停地改变效果值,从-1到1,当它要到1的时候又回到-1,以此类推。
我不知道该怎么做,是用StartCoroutine还是在Update里面做。
你可以使用 Mathf.PingPong
为此
Material material;
// Adjust via Inspector
public float duration = 1;
private void Awake()
{
material = GetComponent<Renderer>().material;
}
void Update()
{
var currentValue = Mathf.Lerp(-1 , 1, Mathf.PingPong(Time.time / duration, 1));
material.SetFloat("Effect Slider", currentValue);
}
或者,你也可以简单地移动范围,如
这将在 -1
和 1
结果 PingPong
作为插值因子,在 0
和 1
在给定的持续时间内。
或者,您也可以直接将范围内的 PingPong
喜欢
var currentValue = Mathf.PingPong(Time.time / duration, 2) - 1f;
试试这个(我没有测试过,但应该可以)。
public class ChangeShaders : MonoBehaviour
{
private float fromValue = -1f;
private float toValue = 1f;
private float timeStep = 0f;
private float val = 0f;
private void Update()
{
gameObject.GetComponent<Renderer>().material.SetFloat("Effect Slider", val);
val = Mathf.Lerp(fromValue, toValue, timeStep);
timeStep += Time.deltaTime;
// If you want the values to go back and forth faster use the line below instead
// timeStep += 0.2f + Time.deltaTime;
if (timeStep >= 1f) {
float tempVal = toValue;
toValue = fromValue;
fromValue = tempVal;
timeStep = 0f;
}
}
}