Изменяйте значения lerp с течением времени

В настоящее время я работаю над динамическим скайбоксом. Мой скайбокс состоит из 3 отдельных скриптов:

CustomList, CustomListEditor., TOD.CS

CustomList.cs имеет класс, в котором хранятся переменные для каждой переменной в определенный момент времени. Пример: время, цвет облаков, цвет горизонта и т. Д.

CustomListEditor.cs - это пользовательский инспектор для установки значений и добавления / удаления их в список времени суток (TOD).

TOD.cs - это место, где я вычисляю время прохождения и изменения переменных от одного TOD к другому.

Проблема, с которой я сталкиваюсь в настоящее время: я не могу равномерно отображать каждый TOD. в основном проблема, с которой я сталкиваюсь, заключается в том, что мой lerp не работает гладко между каждым временем дня, а вместо этого имеет части, которые работают медленнее, а некоторые - быстрее. Я признаю, что это математическая проблема, и я не совсем уверен, как найти правильное уравнение для правильной работы.

если бы кто-то мог помочь, это было бы удивительно. Вот я нарисовал время и отдельное время суток. Имейте в виду, что TOD могут быть размещены в любом месте во времени, поэтому числовые значения не являются определенными в примере.

<!-- language: lang-c# -->

public float TODspeed = 0.02    
     private float currentValue = 0.00f
     public int TODindex = 0;
     public Color horizon;

    void Start()
    {

        GetTarget = new SerializedObject(this.GetComponent<CustomList>());
        ThisList = GetTarget.FindProperty("MyList"); // Find the List in our script and create a refrence of it
        SerializedProperty MyListRef = ThisList.GetArrayElementAtIndex(TODindex);
        SerializedProperty myHorizon = MyListRef.FindPropertyRelative("horizon");
        horizon = myHorizon.colorValue;
    }


    void Update()
    {
        //Grab serialized properties from my List
        //MyListRef is getting a reference of the current TOD

        SerializedProperty MyListRef = ThisList.GetArrayElementAtIndex(TODindex);

        //NextListRef is getting a reference of the next TOD that we will be lerping to.

        SerializedProperty NextListRef = ThisList.GetArrayElementAtIndex(TODindex + 1);
        SerializedProperty myTime = NextListRef.FindPropertyRelative("time");

        //mixTime is supposed to be my equation for the speed of the times of day. I presume that this code is incorrect and I have no idea how to fix it.
        float mixTime = TODspeed * (myTime.floatValue - MyListRef.FindPropertyRelative("time").floatValue);

        //This is where I lerp my TOD variables, so long as CurrentValue ,which is the game time, is less than the next TOD's time value.
        if (currentValue < myTime.floatValue)
        {
            currentValue += (Time.deltaTime*TODspeed);

            horizon = Color.Lerp(horizon, nextHorizon.colorValue, mixTime);
            this.GetComponent<CustomList>().atmosphereGradient.SetColor("_BottomColor", horizon);
        }


        // if game time is greater than my next TOD's time variable, It will compare the TODIndex to what would be the last TOD in the script. If it is smaller than the last TOD it will incriment , If it is bigger or equal to it, it will restart to time of days.
        if (currentValue >= myTime.floatValue)
        {
            int compareValue = ThisList.arraySize - 2;
            if (TODindex < compareValue)
            {
                TODindex++;
            }
            else if (TODindex >= compareValue)
            {
                TODindex = 0;
                currentValue = 0.00f;
            }
        }
    }

1 ответ

Ваша проблема в линии

horizon = Color.Lerp(horizon, nextHorizon.colorValue, mixTime);

Вы всегда интерполируете между текущим значением и целевым значением => разница между ними всегда меньше => "затухание" становится медленнее и медленнее во времени.

Вместо этого вы хотите постоянное замирание между исходным и целевым значением. Я не вижу где horizon объявлен, но вы должны вместо этого сохранить оригинал Color вне Update например как startColor и чем изменить свою линию на

horizon = Color.Lerp(startColor, nextHorizon.colorValue, mixTime);

Примечание: я не совсем понимаю остальную часть вашего кода, но, как я понял, ваша проблема в основном заключалась в эффекте рывка, поэтому я предположил, что все остальное работает нормально.

Другие вопросы по тегам