Jump to content
Unity Insider Forum

Timer läuft nicht richtig


Recommended Posts

Hallo Leute

Ich versuche mit folgendem Script einen Timer zu programmieren. Leider läuft das nicht richtig, d.h. der Timer stoppt gar nicht sondern läuft immer weiter. Woran könnte das liegen?

Gruss, Peachplayer

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class mytimer_class : MonoBehaviour
{
    public Button btn1, btn2;
    bool timerActive = false;
    float cntdnw = 1.0f;
    public Text disvar;
    public DateTime dt;
    public Date_class Datum_neu;

    // Use this for initialization
    void Start()
    {
        btn1 = GameObject.Find("start_button").GetComponent<Button>();
        btn2 = GameObject.Find("stop_button").GetComponent<Button>();
       
    }
    public void starttimer()
    {
        string timer_stop = Datum_neu.Datum.ToShortDateString();

        // dt = new DateTime(2021, 01, 01).AddDays(Convert.ToDouble(timer_stop));
       // Debug.Log(timer_stop);
        btn2.interactable = true;
        btn1.enabled = true;
        btn2.enabled = false;
        timerActive = true;
    }

    public void stopptimer()
    {
        btn1.interactable = true;
        btn2.enabled = true;
        btn1.enabled = false;
        timerActive = false;

        string timer_stop = Datum_neu.Datum.ToShortDateString();
        disvar.text = Datum_neu.Datum.ToShortDateString();
        
    }
    // Update is called once per frame
    void Update()
    {

      

            if (timerActive == true)

            {
                cntdnw += Time.deltaTime;

                double b = System.Math.Round(cntdnw, 2);
                string dateTimeString = System.String.Format("{0:yyyy-MM-dd-hh}", b);

                var time = new DateTime(Convert.ToInt64(b));
                
                dt = new DateTime(2021, 01, 01).AddDays(b);
            Datum_neu.Datum = dt;
            // PlayerPrefs.SetString("stopped_time", dt.ToShortDateString());

            //DateTime dt = DateTime.FromOADate(b);
            disvar.text = (Datum_neu.Datum.ToString());
                Debug.Log(Datum_neu.Datum);


            }

            else if (timerActive == false)
            {
                disvar.text = "Game stopped....";
                disvar.text = Datum_neu.Datum.ToShortDateString();
            }

        }
    }

 

Link to post
Share on other sites
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using UnityEngine;
using UnityEngine.UI;

public class mytimer_class : MonoBehaviour
{
    float cntdnw = 1.0f;
    public Text disvar;
    public Button startButton;
    public Button stoppButton;

    private void Start()
    {
        startButton = GameObject.Find("start_button").GetComponent<Button>();
        stoppButton = GameObject.Find("stopp_button").GetComponent<Button>();

    }

    public void Startbutton()
    {
        startButton.enabled = true;
        stoppButton.enabled = false;
    }

    public void Stoppbutton()
    {
        stoppButton.enabled = true;
        startButton.enabled = false;
    }

    void Update()

    {

        if ((startButton.enabled))
        {

            cntdnw += Time.deltaTime;

            Time.timeScale = 0.5f;

            double b = System.Math.Round(cntdnw, 2);
            string dateTimeString = System.String.Format("{0:yyyy-MM-dd-hh}", b);

            disvar.text = TimeSpan.FromDays(b).ToString();
        }

        if (stoppButton.enabled)
        {
            Debug.Log("game stopped!");
            Time.timeScale = 0.0f;
        }
    }
}

Habs nochmals korrigiert, das korrekte Script sieht wie folgt aus.

 

Link to post
Share on other sites

Also wenn ich es richtig interpretiere, dann springst du beim Druck eines Buttons in die Methoden Startbutton() bzw. Stopbutton().

Dein Problem ist, dass du da immer einen Button abschaltest. Und diese Eigenschaft willst du dann als Kriterium in der Update nutzen.

Ich gehe davon aus, dass zu Beginn beide Buttons enabled sind, denn sonst würd ja garnichts gehen.

Also drückst du den Startbutton und der führt Startbutton() aus. Dort aktivierst du den bereits aktiven Startbutton und dekativierst den Stoppbutton. Da jetzt der Stoppbutton deaktiviert ist, kannst du da drauf drücken wie du willst. Er ist deaktivert und wird nix machen!

Also wenn ein Druck auf einen Button einen gewissen Button deaktivieren sollte, dann natürlich den, den man gerade gedrückt hat. Das würde Sinn machen, denn man braucht den ja nur einmal drücken.
Der Gegenspieler muss aber aktiv sein, denn sonst kann man ja die Stoppuhr nicht beenden, wenn sie läuft. Genauso will man ja die Stoppuhr wieder starten, wenn sie angehalten wurde.

Nimm einfach eine Boolsche Variable die du beim druck auf den Startbutton auf true setzt. Diese nutzt du dann für deinen Timer.
Wenn du auf den Stoppbutton drückst setzt du diese Variable wieder auf false zurück.

Warum spielst du eigentlich mit der Timescale rum? Das macht doch überhaupt keinen Sinn?!

 

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...