C#帧运行两次?

时间:2015-07-22 18:19:11

标签: c# unity3d

这让我完全糊涂了。我使用unity3d和c#作为脚本,似乎代码每帧运行两次。然而,在按下按钮时,我有一个精灵更改位置,它至少只会改变一次我认为它。

我添加了Debug,我得到的结果如下:

在第168帧的3.569991得1分

在第168帧的3.57414得分2

在第183帧获得3分,分数为3.818392

在第183帧的3.820178得分4

等等继续进行。我没有在任何其他脚本中更新分数。这个脚本还有更多内容,但它只是在屏幕上打印出分数。

脚本可能会像这样运行吗?

完整的脚本:

 using UnityEngine;
 using System.Collections;

public class Score : MonoBehaviour {

    public static int highScore;
    public static int myScore;
    public static bool allowScore;
    public GUIText myText;

    public static bool WhichScene;

     //only allows score to start when first object has passed player object
     void OnTriggerEnter2D(Collider2D collisionObject) {
         allowScore = true;
         Debug.Log ("allowScore is true");
     }

     void Start () {

         highScore = PlayerPrefs.GetInt("highScore");

         int scale = Screen.height / 20;
         myText.fontSize = scale;
     }

     //add 1 to score every switch
     void Update () {

         // need to stop score counting
         if (DeathOnImpact.dead == true) {
            allowScore = false;

         } if (Input.GetMouseButtonDown (0) && allowScore == true && WhichScene == true) { // added SpawnerObjectMovement.WhichScene == true
             //Input.GetMouseButtonDown (0)
             //Input.GetKeyDown("space")
             myScore = myScore + 1;
            Debug.Log ("My score is " + myScore + " point(s)" + " at time:" + Time.realtimeSinceStartup + " at frame:" + Time.frameCount);

        } if (myScore > highScore) {
            highScore = myScore;
            PlayerPrefs.SetInt("highScore", highScore);
         }

        myText.text = myScore.ToString ();
        //myText.text = "Score: " + myScore.ToString ();

        if (Score.WhichScene == false) {
            int scale = Screen.height / 40;
            myText.fontSize = scale;
            myText.text = "practice mode";
         }
     }
}

脚本附加到TriggerObject,sprite和Gui Text

WhichScene引用了我按下的按钮,“正常播放”或“练习模式”以获得更简单的版本。 “练习模式”的分数已被禁用。

更新:我刚刚编辑了自问题出现后我已添加的所有内容,但尚未修复。我要检查所有统一设置,看看是否有任何变化。似乎在构建设置中,当问题出现时我删除的旧场景没有被选中但只是'阴影'所以我无法选择它。场景是PlayScene的精确副本。这是问题的标志吗?

解决方案:看起来将脚本分成两个较小的脚本已经解决了这个问题。我仍然不确定为什么它现在才出现,因为它之前一直在工作,但是哦,我想。谢谢。

2 个答案:

答案 0 :(得分:3)

根据您的评论,您已经说过您的脚本附加到3个GameObjects,这意味着每帧调用Update()方法3次。

public class Score : MonoBehaviour {
    public static int myScore;

您已将myScore声明为static int。这在功能上意味着它将由运行的Score脚本的所有实例共享。

对于每个附加了此脚本的GameObject,每帧调用一次MonoBehaviour的Update()方法。你有3个附加了这个脚本的GameObjects。因此,每个人都会在Update()脚本的各个实例上调用Score

我不确定你究竟打算发生什么,所以除了指出问题之外,我很难提出任何建议。

我认为您需要将此脚本拆分为多个脚本。这个脚本做得太多了。它违反了Single Responsibility Principal (SRP)。这是编程中最重要的原则之一。我建议将其拆分为至少3个脚本。我可能会制作以下脚本:

  1. PlayerStatistics - 将此脚本附加到您的播放器对象(我假设这是您提到的精灵)。它只会保存玩家的统计数据,包括得分。每个玩家应该只有一个。
  2. ScoreBoard - 将此脚本附加到GUI组件。它将引用PlayerStatistics。请注意,这是对您的播放器上的单个实例的引用。您的ScoreBoard脚本只会从PlayerStatistics脚本中读取得分值。
  3. ScoringTrigger - 将其附加到TriggerObject。它还可以引用PlayerStatistics脚本。它将有代码检查是否应该完成评分,并更新PlayerStatistics脚本的值。

答案 1 :(得分:0)

为避免某些事件在一帧中运行两次,请使用事件来获取输入操作:

from rest_framework import viewsets, mixins

class BazViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
   ...