[英]C# frames running twice?
這讓我完全困惑。 我正在腳本中使用unity3d和c#,似乎代碼每幀運行兩次。 但是在按下按鈕時,我有一個精靈更改位置,並且它至少一次更改了一次,我認為確實如此。
我在其中添加了Debug,並得到如下結果:
在第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指的是我按下的按鈕,“ play”代表正常播放,“'practice mode”代表更簡單的版本。 分數未啟用“練習模式”。
更新:自問題出現以來,我剛剛編輯了添加的所有內容,但尚未修復。 我將檢查所有統一設置,以查看是否有任何更改。 似乎在構建設置中出現了一個舊場景,當出現問題時,我將其刪除了,但沒有選擇,而只是“陰影化了”,所以我無法選擇它。 場景是PlayScene的精確副本。 這是問題的征兆嗎?
解決方案:看來將腳本分成兩個較小的腳本已解決了該問題。 我仍然不確定為什么它只是從一開始就出現至今才出現,但是哦,我猜。 謝謝。
根據您的評論,您說過您的腳本已附加到3個GameObjects,這意味着Update()方法每幀被調用3次。
public class Score : MonoBehaviour {
public static int myScore;
您已將myScore聲明為static int
。 從功能上講,這將由運行的Score
腳本的所有實例共享。
對於每個附加了此腳本的GameObject,MonoBehaviour的Update()
方法每幀調用一次。 您有3個附帶此腳本的GameObjects。 因此,每個人都將在各自的Score
腳本實例上調用Update()
。
我不確定您確切打算做什么,所以除了指出問題之外,我很難給出任何建議。
我認為您需要將此腳本拆分為多個腳本。 這個腳本做得太多了。 這違反了單一責任主體(SRP) 。 這是編程中要遵循的最重要的原則之一。 我建議將其分成至少三個腳本。 我可能會編寫以下腳本:
為了避免某些事件在一幀中運行兩次,請使用“事件”來獲得輸入操作:
if(Event.current.type == EventType.MouseDown){
if(Event.current.button == 0 && allowScore && WhichScene) {
// do it once!
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.