簡體   English   中英

C#框架運行兩次?

[英]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) 這是編程中要遵循的最重要的原則之一。 我建議將其分成至少三個腳本。 我可能會編寫以下腳本:

  1. PlayerStatistics-將此腳本附加到播放器對象(我假設那是您提到的sprite)。 它只會保存玩家的統計信息,包括得分。 每個玩家只能附上一個。
  2. ScoreBoard-將此腳本附加到您的GUI組件。 它將引用PlayerStatistics。 注意,這是對Player上的單個實例的引用。 您的ScoreBoard腳本將僅從PlayerStatistics腳本中讀取分數的值。
  3. ScoringTrigger-將此附加到TriggerObject。 它還將引用PlayerStatistics腳本。 它將具有檢查是否應進行計分的代碼,並更新PlayerStatistics腳本的值。

為了避免某些事件在一幀中運行兩次,請使用“事件”來獲得輸入操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM