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

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

CustomList, CustomListEditor., TOD.CS

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

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

TOD.cs - это то, где вычисляется время прохождения и lerping переменных от одного 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);

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


Есть идеи?

10000