【问题标题】:Unity3D: Speed up highscore count upUnity3D:加快高分计数
【发布时间】:2019-01-09 22:52:44
【问题描述】:

我有一个整数来保存玩家的最高分,当玩家在我的游戏中死亡时会显示它。当玩家获得新的高分时,我创建了一个增加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 ();
  }
 }

【问题讨论】:

  • 是的,不要一次增加 1 个值,得到 2 个值之间的差值,计算出您希望他计算它的速度,并计算在该时间内它需要多快计数并增加它。例如,您想以 100 分的 5 秒差 100/5 × time.deltaTime。

标签: c# unity3d


【解决方案1】:

这是使用 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 将一个数字作为它的第一个参数,一个目标作为它的第二个参数,并将一个“最大距离”作为它的第三个参数,它将第一个参数移向目标参数,但只加或减到第三个参数为了达到它。 MoveTowards 永远不会超过目标。你可以把它想象成MoveTowards(from, to, amount)

Lerp 采用相似的参数 (Lerp(from, to, t) 但行为不同。它采用相同的 from 和 to 参数,但第三个参数是它应该线性放置结果的位置。你可以想象一条从“from”以“to”结尾,第三个参数“t”是沿着这条线放置多远,0正好在“from”上,1正好在“to”上,0.5正好在中间。

这里我们使用 movetowards 来增加我们的内部变量“t”,我们将其用作从 0 到 1 的计时器,我们使用 Time.deltaTime,它本质上是当前帧的持续时间(以秒为单位),以将我们的计算与我们的帧率分开,这意味着该过程在 10fps 或 60fps 时应该几乎相同。我们所做的只是将“t”从 0 移动到 1,超过“highScoreAnimationLength”(2)秒。

然后,我们使用 t 的结果作为 Lerp 的参数,这意味着在这 2 秒内,我们将在初始分数 (0) 和目标分数 (highScore) 之间进行线性插值(更简单地说,滑动)。

这样做的好处是多方面的:

  • 无论高分是10还是100000,总是需要2秒
  • 它与帧率无关,因此在每台机器上总是需要 2 秒
  • 我们的编辑器变量采用易于理解的单位,秒。这使得调整值​​更加直观,因为您可以轻松预测和估计它的行为方式。 (这样的一个常见缺陷是变量只被称为“速度”之类的东西并且没有真实世界的单位,因此您必须通过反复试验进行编辑以使其正确)

额外积分:您可以查看“缓动函数”,以对动画进行更具体、更精细的控制。 Lerp 看起来非常僵硬,因为它没有加速和减速,缓动功能本质上是 Lerp 的一种方式,但运动更平滑。我已经把它弄得相当复杂了,所以我不会用更多的信息让你陷入困境,但它们非常值得研究一下。

【讨论】:

  • 非常感谢您的帮助和信息,非常有帮助!再次感谢您,我真的很感激! :)
  • @empty 你能检查一下我根据你的回答创建的主题吗? stackoverflow.com/questions/59598597/…
【解决方案2】:

它没有快速上升的原因是因为这段代码在Update 函数中,这意味着它将在游戏的每一帧中被调用。因此,数字将每帧增加一次,这意味着每秒帧数越低,达到高分所需的时间就越多。例如,如果游戏以 20 fps 运行,并且最高分是 400,那么达到最高分需要 20 秒。这也意味着动画的速度会因系统而异。我会尝试将数字增加更大的数量以加快动画速度,

【讨论】:

  • 感谢您的建议,但我有点困惑。你可以给我举个例子吗?再次感谢您!
  • 当然!没问题!在您的代码中,它有i++。为了让它运行得更快,请将其更改为 i += 10 或其他任何数字。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多