这让我完全糊涂了。我使用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的精确副本。这是问题的标志吗?
解决方案:看起来将脚本分成两个较小的脚本已经解决了这个问题。我仍然不确定为什么它现在才出现,因为它之前一直在工作,但是哦,我想。谢谢。
答案 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 :(得分:0)
为避免某些事件在一帧中运行两次,请使用事件来获取输入操作:
from rest_framework import viewsets, mixins
class BazViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
...