我有一个介于 0 和 1 之间的振荡值,但问题是该值可能从 0 和 1 之间的任何值开始,具体取决于时间值。
那就是你的问题。您可以很容易地将着色器更改为从 0 开始振荡并且独立于内置着色器时间,不是吗?这将意味着从脚本驱动着色器,这是您不想要的,但我认为在这种情况下这不是坏习惯,因为听起来您希望振荡直接与游戏中的特定事件相关联- 所以非常努力地将着色器代码与应用程序代码分离在这里有点多余 - 它们需要以某种方式链接到某个地方。
要将着色器与内置着色器时间分离,而不是Abs(Time * speed)
将 Time 替换为您控制的属性,即Abs(phase * speed)
.
我使用以下代码来播放冲击波效果,并始终确保它从我想要的位置开始:
// ensures shockwave plays once and does a full wave over duration
IEnumerator PlayShockwave(float duration, Renderer shockwave)
{
float timeElapsed = 0f;
float speed = Mathf.Abs(shockwave.material.GetFloat("_Speed"));
float phase = shockwave.material.GetFloat("_Phase");
float targetPhase = 1 / speed;
while (timeElapsed <= duration)
{
timeElapsed += Time.deltaTime;
shockwave.material.SetFloat("_Phase", Mathf.Lerp(phase, targetPhase, timeElapsed / duration));
yield return new WaitForEndOfFrame();
}
}
并调用它StartCoroutine(PlayShockwave(2.0f, YourRenderer));