【问题标题】:How can I use curves to bend Horizons smoothly?如何使用曲线平滑地弯曲 Horizo​​ns?
【发布时间】:2016-07-31 05:39:56
【问题描述】:

我一直在开发一个无尽的跑步游戏,我希望它尝试让环境像地铁表面一样随机弯曲地平线。我从商店下载了这个 Horizon Bending 资产,效果很好。在资产中,我有一个名为ApplyCurvature(float val) 的方法,它将它应用到场景中并弯曲所需的量(现在它只向左弯曲ApplyCurvature(5f);)。

我希望它随机改变曲率,例如左、中或右。我确实尝试了 Random 方法,只是为了确保我可以为游戏中的每一帧应用曲率,但这不是我想要的。我考虑过使用统一脚本给出的曲线,但我不知道如何应用它们。谁可以帮我这个事?我是 unity3d 的新手,所以如何使用曲线通过我下载的资产应用效果。帮助将不胜感激。

using Battlehub.HorizonBending; //the asset package import

private float hb;

void Update () 
    {

        //HB.ApplyCurvature(5);
        if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
        {
            if (activeTiles.Count < (NumberOfTilesThatFitOnScreen + 1))
            {
                var spawnedTile = SpawnTileAtFront();

                activeTiles.Add(spawnedTile);
            }
            else
            {
                var movedTile = activeTiles[0];
                MoveTileToTheFront(movedTile);
                activeTiles.RemoveAt(0);
                activeTiles.Add(movedTile);
                //HB.ApplyCurvature(5);

                hb = Random.Range(-5, 5); //Randomly bend road left and right
                HB.ApplyCurvature(hb);
            }
        }
    }

上面的代码是我尝试随机更新左右弯曲量的代码。

【问题讨论】:

    标签: c# unity3d unity5 curves curvesmoothing


    【解决方案1】:

    这是你想要做的吗?

    在这种情况下,我认为您不能使用 ApplyCurvature 函数来获得所需的效果。我的猜测是它正在制作一个二次方程并更改 k 值以弯曲图形。示例:https://www.desmos.com/calculator/djv3r9enl3 (使用 k 滑块看看会发生什么)

    我对统一中的相机效果如何工作几乎一无所知,但我确实知道一些关于图表的事情。如果你能弄清楚如何从一个函数中改变地平线的外观,这些应该很方便:

    左:k * x^2 + sP

    其中 k = (tP - sP) / t^2

    中间:k * x^2

    k 是你想要的值

    右:k * (t - x)^2 + tP

    其中 k = (sP - tP) / t^2

    k:“曲率”

    t:目标 x(屏幕右侧)

    sP:起始位置y(最低点)

    tP:目标位置y(最高点)

    我希望这对您有所帮助。

    编辑:

    要逐渐减少值,您可以制作一个计时器并使用 Time.deltaTime。

    像这样:

    float curveTimer = 0;
    float curve;
    
    void Start() {
    }
    
    void Update () {
        if (curveTimer < yourTargetTime)
            curveTimer += Time.deltaTime;
        else
            curveTimer = 0;
    
        curve = 5 - (curveTimer / yourTargetTime) * 10;
    }
    

    然后将曲线输入到您的函数中。

    【讨论】:

    • 嗨,这就是我想要的。我有数字,-5f 会将瓷砖向左弯曲,0 没有任何反应,5f 会将瓷砖向左弯曲。所以基本上我想要的是逐渐减少5f到0等待几秒钟,然后逐渐减少到-5f,然后将它们增加到0然后到5f。然后我可以将更改的答案应用于ApplyCurvature()。你能告诉我我该怎么做吗?
    • 感谢 :) 的帮助。
    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2021-11-28
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多