C# C帧运行两次?
这让我完全困惑。我在脚本中使用unity3d和c,似乎代码每帧运行两次。然而,在按下按钮时,我有一个精灵改变位置,它只改变一次,至少我认为是这样 我在中添加了调试,得到的结果如下: 在第168帧3.569991处得1分 第168帧3.57414得2分 第183帧3.818392得3分 在第183帧3.820178处得4分 等等。我不会在任何其他脚本中更新分数。这个脚本还有更多内容,但它只是在屏幕上打印分数 脚本为什么会这样运行 完整脚本: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
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我也考虑过,但很可能在您提供的信息之外还有一些解释。