C# C帧运行两次?

C# C帧运行两次?,c#,unity3d,C#,Unity3d,这让我完全困惑。我在脚本中使用unity3d和c,似乎代码每帧运行两次。然而,在按下按钮时,我有一个精灵改变位置,它只改变一次,至少我认为是这样 我在中添加了调试,得到的结果如下: 在第168帧3.569991处得1分 第168帧3.57414得2分 第183帧3.818392得3分 在第183帧3.820178处得4分 等等。我不会在任何其他脚本中更新分数。这个脚本还有更多内容,但它只是在屏幕上打印分数 脚本为什么会这样运行 完整脚本: using UnityEngine; using S

这让我完全困惑。我在脚本中使用unity3d和c,似乎代码每帧运行两次。然而,在按下按钮时,我有一个精灵改变位置,它只改变一次,至少我认为是这样

我在中添加了调试,得到的结果如下:

在第168帧3.569991处得1分

第168帧3.57414得2分

第183帧3.818392得3分

在第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文本

WhichScene指的是我按下的按钮,“播放”表示正常播放,或“练习模式”表示更简单的版本。“练习模式”的分数已禁用

更新:我刚刚删除了自问题出现以来添加的所有内容,但尚未修复。我将检查所有unity设置,看看是否有任何更改。似乎在构建设置中,我在出现问题时删除了一个旧场景,但该场景没有被选择,只是“阴影化”,因此我无法选择它。这一幕与戏剧场景一模一样。这是问题的征兆吗


解决方案:将脚本分成两个较小的脚本似乎解决了这个问题。我仍然不确定为什么它只出现在现在,因为它以前作为一个整体工作,但哦,我猜。多谢各位

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

if(Event.current.type == EventType.MouseDown){
    if(Event.current.button == 0 && allowScore && WhichScene) {
        // do it once!
    }
}

根据您的评论,您已经说过您的脚本连接到3个游戏对象,这意味着更新方法每帧调用3次

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

对于每个附加此脚本的游戏对象,每帧调用一次MonoBehavior方法。您有3个附加了此脚本的游戏对象。因此,每个人都将在各自的Score脚本实例上调用Update

我不确定你到底打算发生什么,所以除了指出问题外,我很难给出任何建议

我认为您需要将此脚本拆分为多个脚本。这个脚本做得太多了。这违反了法律。这是编程中要遵循的最重要的原则之一。我建议至少把它分成3个脚本。我可能会制作以下脚本:

PlayerStatistics-将此脚本附加到您的玩家对象,我假设这就是您提到的精灵。它只会保存玩家的统计数据,包括分数。每个玩家只能有一个。 记分板-将此脚本附加到GUI组件。这将参考球员统计数据。请注意,这是对播放器上单个实例的引用。记分板脚本将仅从PlayerStatistics脚本读取分数值。 ScoringTrigger-将其连接到Trigger对象。它还将参考PlayerStatistics脚本。它将具有检查是否应该进行评分的代码,并更新PlayerStatistics脚本的值。
您是否仅将此脚本附加到单个游戏对象,或者是否可能有多个游戏对象附加了此脚本的实例?另外,你把这个代码放在哪种方法中?刚刚选中,它只附加到三个需要的方法。真正奇怪的是,它在不久前就开始工作了。我真的需要看看整个脚本,或者至少知道你在MonoBehavior上放置这个片段的方法。此外,如果它连接到多个游戏对象,根据您使用的方法,每帧可以为所有三个对象运行相同的代码。只是需要更多关于您的脚本的信息,以及它是如何配置的,以便提供帮助!好的,那么你是说你已经将这个分数单行为脚本附加到了3个游戏对象上,对吗?@Frohlich这是一个静态int,所以不是。它们将受到每个实例的影响,因为该值在所有实例中共享。对于脚本的每个实例,每帧调用更新。有3个,所以在每一帧上,该逻辑被调用3次。虽然使用事件可能是一个更好的主意,但这不会解决问题。crush是对的,我只是尝试了它,但它删除了分数,这是完全令人遗憾的。基本上,我正在创建一个游戏,分数取决于你可以在两个级别之间切换多少次。你必须避开障碍物,所以我添加了allowScore以允许得分开始第一个障碍物已经通过,并且是练习模式还是正常模式。我为你添加了一些额外的指导-如果你需要更多细节,请告诉我。我开始工作:可能要到明天,因为da快结束了
我现在在哪里。谢谢我在想,如果这是个问题,分数应该加三而不是二,因为它适用于三个对象。@8673589我也考虑过,但很可能在您提供的信息之外还有一些解释。