Как я могу использовать кривые для плавного изгиба 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;
}
Затем введите кривую для вашей функции.