Mathf.PingPong
возвращает значения между 0
и заданным length
.
Вы уже передали 6
, поэтому вам нужно только сдвинуть его назад на -3
.
Или в качестве альтернативы используйте Mathf.Lerp
и используйте PingPong
от 0
до 1
в качестве коэффициента для большей гибкости.
Вы также проходите Time.deltaTime * 5
но PingPong
ожидает абсолютное значение времени в качестве входных данных, поэтому используйте Time.time
.
PingPong
требует, чтобы значение t
было с самоинкрементом значение, например Time.time
и Time.unscaledTime
.
Умножив его на 5, вы сделаете его в 5 раз быстрее .. если вы хотите, чтобы он был медленным, вы, вероятно, захотите разделить как
// only needed if using Lerp
public float minValue = -3;
public float maxValue = 3;
public float durationInSeconds = 5;
void Update()
{
var value = Mathf.PingPong(Time.time / durationInSeconds, 6) - 3;
// Or using Lerp
//float value = Mathf.Lerp(minValue, maxValue, Mathf.PingPong(Time.time / durationInSeconds, 1));
material.SetFloat("_DissolveAmount", value);
}
Что касается того, как исчезнуть один раз от -3 до 3
, я бы использовал сопрограмму, например
private bool alreadyFading;
IEnumerator FadeOnce(float from, float to, float duration)
{
alreadyFading = true;
var timePassed = 0f;
while(timePassed < duration)
{
var factor = timePassed / duration;
var value = Mathf.Lerp(from, to, factor;
material.SetFloat("_DissolveAmount", value);
yield return null;
}
material.SetFloat("_DissolveAmount", to);
alreadyFading = false;
}
И назову ее, например,
public void Fade()
{
if(!alreadyFading) StartCoroutine (FadeOnce(-3, 3, 5f);
}