Изменяйте значения lerp с течением времени - PullRequest
0 голосов
/ 05 октября 2018

Я сейчас работаю над динамическим скайбоксом.Мой скайбокс состоит из 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 Ответ

0 голосов
/ 05 октября 2018

Ваша проблема в строке

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

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

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

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

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

...