Это идеальное место для использования lerp (линейная интерполяция)
public float t = 0.0f; //renamed i to t, for convention (i is for loops, t is for lerping or easing function "time" variables
public Text highScore;
public float highScoreAnimationLength = 2.0f; //how long in seconds it should take to go from score 0 to the players final score
void Update () {
if(playerDeath == false) {
t = 0.0f;
}
else if (playerDeath == true) {
t = Mathf.MoveTowards(t, 1.0f, Time.deltaTime/highScoreAnimationLength); //move t closer to 1.0, we use Time.deltaTime to make it move in "realtime" rather than frame time, MoveTowards will always stop at the target value, so we never go over it.
int displayedScore = (int)Mathf.Lerp(0, highScore, t); //Here we use a lerp to calculate what number to display, we then cast it to an int to display it correctly (no decimals)
highCoinText.text = "" + displayedScore.ToString ();
}
}
Здесь мы используем 2 удобные функции, MoveTowards и Lerp, они похожи и очень удобны.
MoveTowards принимает число в качестве первого аргумента, цель в качестве 2-го и «максимальное расстояние» в качестве третьего, оно будет перемещать первый аргумент в направлении целевого аргумента, но только прибавит или вычтет до третьего аргумента в чтобы добраться до него. MoveTowards никогда не пройдет над целью. Вы можете думать об этом как MoveTowards (от, до, количество)
Lerp принимает аналогичные аргументы (Lerp (от, до, t), но ведет себя по-разному. Он принимает то же самое из аргументов и в аргументы, но третий аргумент - это то, где он должен размещать свой результат линейно. Вы можете представить числовую строку, начинающуюся с «от», заканчивающийся на «до», и третий аргумент «t» - это то, как далеко он расположен вдоль этой линии, где 0 находится точно на «от», 1 - точно на «до», а 0,5 - точно посередине.
Здесь мы используем movetowards для увеличения нашей внутренней переменной "t", которую мы используем в качестве таймера для отметки от 0 до 1, мы используем Time.deltaTime, который по сути является продолжительностью текущего кадра в секундах, чтобы отделите наши расчеты от частоты кадров, что означает, что процесс должен быть практически одинаковым при 10 кадрах в секунду или 60 кадрах в секунду. Все, что мы делаем, это перемещаем «t» от 0 до 1, за «highScoreAnimationLength» (2) секунды.
Затем мы используем результат от t в качестве аргумента для Lerp, что означает, что в течение этих 2 секунд мы будем линейно интерполировать (проще говоря, скользить) между нашей начальной оценкой (0) и нашей целевой оценкой (highScore).
Преимущества такого подхода многочисленны:
- Это всегда занимает 2 секунды, независимо от того, является ли высокий балл 10 или 100000
- Он не привязан к частоте кадров, поэтому на каждой машине это всегда будет занимать 2 секунды
- Наша переменная редактора представлена в понятных единицах, секундах. Это делает интуитивно понятным изменение значения, поскольку вы можете легко предсказать и оценить, как оно будет себя вести. (Распространенной ошибкой при подобных вещах является то, что переменная просто называется чем-то вроде «скорость» и не имеет единицы измерения реального мира, поэтому вам нужно отредактировать методом проб и ошибок, чтобы получить ее правильно)
Дополнительные кредиты: Вы можете изучить "функции замедления" для более точного и точного управления анимацией. Lerp выглядит очень жестким, так как он не имеет ускорения и замедления, функции замедления по сути являются способом Lerp, но с более плавным движением. Я уже сделал это довольно запутанным, так что я не буду утомлять вас дополнительной информацией, но их стоит потратить на дополнительную полировку.