Unity3D: ускорение счета рекордов - PullRequest
0 голосов
/ 10 января 2019

У меня есть целое число, которое хранит рекорд игрока, и оно отображается, когда игрок умирает в моей игре поверх панели. Когда игрок получает новый рекорд, я создал функцию для увеличения int, чтобы сделать крутой результат подсчета рекордов; это работает, однако это не так быстро, как хотелось бы, особенно если бы игрок получил очень высокий рекорд, как, например, 400. Есть ли способ сделать так, чтобы функция моего счета рекордов была намного быстрее?

Это мой код:

 public int i;
 public Text highScore;

 void Update () {
  if(playerDeath == false) {
     i = 0;
  }  
   else if (playerDeath == true) {
     i++;
     if (i >= PlayerPrefs.GetInt ("Highest", 0)) {
         i = PlayerPrefs.GetInt ("Highest", 0);
     }
    highCoinText.text = "" + i.ToString ();
  }
 }

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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

0 голосов
/ 10 января 2019

Причина, по которой он не очень быстро растет, состоит в том, что этот код находится в функции Update, что означает, что он будет вызываться в каждом кадре игры. Таким образом, число будет увеличиваться один раз за кадр, что означает, что чем меньше количество кадров в секунду, тем больше времени потребуется для достижения рекорда. Например, если игра работала со скоростью 20 кадров в секунду, а рекорд был 400, для достижения рекорда потребовалось бы 20 секунд. Это также означает, что скорость анимации будет варьироваться от системы к системе. Я бы попытался увеличить число на большее, чтобы ускорить анимацию,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...