Как я могу использовать кривые для плавного изгиба Horizons?

Некоторое время я занимался разработкой бесконечной игры для раннеров, и я хотел, чтобы она пыталась заставить среду случайным образом изгибать горизонт, как поверхности метро. Я загружаю этот актив 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);
            }
        }
    }

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

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

к: "кривизна"

t: target 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;
}

Затем введите кривую для вашей функции.

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