如何使用Update或StartCoroutine改变-1和1之间的浮动值?

问题描述 投票:0回答:2
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里面做。

c# unity3d
2个回答
3
投票

你可以使用 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);
}

或者,你也可以简单地移动范围,如

这将在 -11 结果 PingPong 作为插值因子,在 01 在给定的持续时间内。

或者,您也可以直接将范围内的 PingPong 喜欢

var currentValue = Mathf.PingPong(Time.time / duration, 2) - 1f;

1
投票

试试这个(我没有测试过,但应该可以)。

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;
       }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.