当我打电话给方法时,为什么我的游戏会变得很大?

时间:2014-08-03 01:15:14

标签: c# for-loop unity3d

我一直在努力为我的游戏创建一个模拟风格评分系统,我正在使用Unity3D进行构建,当我从updateScore()函数调用AnalogScoreProcessing()时,我注意到了一个巨大的延迟:

/******************************** Update Score ********************************/

public void updateScore (int newScore)
{
    // Send the old score/new score to AnalogScoreProcessing()
    if (oldScore != newScore) 
    {
        AnalogScoreProcessing(oldScore, newScore);
    }

    // Display GUI score
    oldScore = newScore;
    guiText.text = "" + oldScore;
}

/*************************** Analog Scoring System ****************************/

void AnalogScoreProcessing(int oldScore, int newScore){
    for(int i = oldScore; i <= newScore; i++){
        print (i);
    }
}

我是否必须创建新线程或协同例程来完成循环任务,同时执行updateScore()的其余部分?我从来没有做任何线程,但我使用过惯例。我不确定我应该在这里使用什么。

3 个答案:

答案 0 :(得分:1)

最简单的解决方案是在这里使用协同程序。

你基本上希望玩家能够看到正确计算的效果吗?

所以说你希望向用户显示最少+1帧的用户计数,这样才能计算出数量。

...试

我会这样做

int current =0;
int target = 0;
float percentateOfTarget = 0;
float step = 0.1f;
IEnumerable AnalogScoreProcessing()
{
    while(current <= target)
    {
      current = (int)Math.Ceiling(Mathf.Lerp(current, target, percentateOfTarget));
      return yield new WaitForSeconds(step);
      percentageOfTarget += step;
      // Display GUI score
      guiText.text = "" + current;
    }

}

public void updateScore (int newScore)
{
    // Send the old score/new score to AnalogScoreProcessing()
    if (oldScore != newScore) 
    {
        StopCoroutine("AnalogScoreProcessing");
        current = oldScore;
        target = newScore;
        StartCoroutine("AnalogScoreProcessing");
    }


}

请注意,这段代码是直接从我的头上拉出来的,所以你可能不得不在这里和那里调整一些东西但是应该给你一些接近你想要的东西。 您可以/甚至应该在协同程序运行时扩展GUIText以获得更显着的效果。让我知道它是怎么回事。

正如我所说,协同程序不是单独的线程,它们是在团结的主线上运行的。

答案 1 :(得分:0)

如果oldScorenewScore之间存在较大差异,则print中的AnalogScoreProcessing函数将会多次运行。

您可能希望使用补间来更改显示的值,因为无论如何您无法在每个帧中显示多个值。或者,如果你要打印到控制台那么......你为什么这样做?

修改已移动quick and dirty solution a more appropriate question/answer

答案 2 :(得分:0)

嗯,我不理解这个功能背后的逻辑,但你不能只是在它改变后打印得分吗?

if (oldScore != newScore) 
{
    //AnalogScoreProcessing(oldScore, newScore);
    Debug.log(newScore);
}

你还必须在里面设置GUI调用 OnGUI() 文件内的功能。