1

我目前正在研究动态天空盒。我的天空盒由 3 个独立的脚本组成:

自定义列表,自定义列表编辑器,TOD.CS

CustomList.cs 具有存储变量的类,用于存储每个变量在特定时间的含义。示例:时间、云颜色、地平线颜色等。

CustomListEditor.cs 是一个自定义检查器,用于设置值并将它们添加/删除到时间 (TOD) 列表中。

TOD.cs 是计算从一个 TOD 到另一个 TOD 的时间传递和 lerping 变量的地方。

我目前遇到的问题:我无法均匀地处理每个 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;
            }
        }
    }
4

1 回答 1

0

你的问题是在线

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

你总是在当前值和目标值之间进行插值=>它们之间的差异每次都变小=>“褪色”变得越来越慢。

相反,您想要做的是原始值和目标值之间的不断衰减。我没有看到horizon声明的位置,但是您应该将原始内容存储在例如 asColor之外, 而不是将您的行更改为UpdatestartColor

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

注意:我不完全理解您的其余代码,但据我了解,您的问题主要是 lerping 效果,所以我认为其余的工作正常。

于 2018-10-05T05:45:25.760 回答