Jump to content
Unity Insider Forum

Button klickt jeden Frame


Peanut

Recommended Posts

Hallo allerseits,

ich habe ein kleines Problem un zwar möchte ich in einem Shop Buttons haben die man mehrmals benutzen kann(1 mal Klicken 50 Gold 1. Power Up , 2 mal Klicken 100 Gold 2.Power Up usw...).Nur scheinbar wird die void Methode für den Butten jeden Frame aufgerufen sodass ich bis zur letzten Kaufmöglichkeit durchkomme ohne es zu wollen. Hat jemand ne Idee :)? 

Hier der Code 

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

public class ShopController : MonoBehaviour
{
    //3ShootShit

    public int PointAmount;
    public Text ThreeShootFaster;
    public int w3SFasterShooting, w3SMoreDamage, w3SMoreShoots;
    private float timer;
    

    // Start is called before the first frame update
    void Start()
    {
        PointAmount = PlayerPrefs.GetInt("Points");
        ThreeShootFaster.text = "30";

        w3SFasterShooting =PlayerPrefs.GetInt("w3sFS");
        w3SMoreDamage = PlayerPrefs.GetInt("w3sMD");
        w3SMoreShoots = PlayerPrefs.GetInt("w3sMS");
    }

    // Update is called once per frame
    void Update()
    {
    
    }

        public void ws3FasterShootingMethode()
    {
            if (w3SFasterShooting == 1)
            {
                ThreeShootFaster.text = "30";
                PointAmount -= 30;
                PlayerPrefs.SetFloat("3ShootTimer", 0.75f);
                PlayerPrefs.SetInt("Points", PointAmount);
                PlayerPrefs.SetInt("w3sFS", 2);
                w3SFasterShooting = PlayerPrefs.GetInt("w3sFS");
                timer = 1;
                Debug.Log("Miepen1");
            }
            if (w3SFasterShooting == 2)
            {

                ThreeShootFaster.text = "50";
                PointAmount -= 70;
                PlayerPrefs.SetFloat("3ShootTimer", 0.5f);
                PlayerPrefs.SetInt("Points", PointAmount);
                PlayerPrefs.SetInt("w3sFS", 3);
                StartCoroutine(Wait1Sec());
                w3SFasterShooting = PlayerPrefs.GetInt("w3sFS");
                Debug.Log("Miepen2");
            }
            if (w3SFasterShooting == 3)
            {
                ThreeShootFaster.text = "SOLD";
                PointAmount -= 100;
                PlayerPrefs.SetFloat("3ShootTimer", 0.25f);
                PlayerPrefs.SetInt("Points", PointAmount);
                Debug.Log("Miepen3");
                timer = 1;
        }
 

    }


    IEnumerator Wait1Sec()
    {
        yield return new WaitForSeconds(1f);
    }


}

 

LG Peanut

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb Peanut:

Hi. Ich frage mal aus der Kalten. Deine Varibale w3SFasterShooting , sollte da nach deiner Frage her auf 3 stehen, oder? In der Start wird ja ein Wert geholt. Der sollte daher 3 sein, oder?
Wird die Methode ws3FasterShootingMethode auch von einem Button aufgerufen, oder woher rufst Du die auf?

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich das richtig sehe, könnte das beim ersten Mal funktioniert haben.

Aber setzt Du die PlayerPref Variable "w3sFS" irgendwo wieder auf 0?

Weil sonst ist sie bei jedem Start bereits auf 3, was dazu führt, dass Du immer in die letzte Bedingung springst (PlayerPrefs sind sessionübergreifende Speicherzustände).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was ich noch dazu sagen möchte:
PlayerPrafs sind nicht dazu da, wie Variablen gehandhabt zu werden!
Man liest die Werte mit Get aus und speichert sie in Variablen. Mit diesen Variablen wird dann gearbeitet, nicht mit den Playerprefs direkt.
Erst wenn es Zeit ist, die Variablen auf die Platte zurück zu schreiben, weil jetzt das Spiel beendet wird oder ein Szenenwechsel stattfindet , werden sie mit Set geschrieben.

Du machst mit der ws3FasterShooting komische Dinge. Du liest mit GetInt das Playerpref w3sFS aus und übergibst sie dieser Variable.
Hat sie z.B. den Wert 1, dann soll sie in der Funktion den Wert 2 bekommen. Anstatt du aber jetzt ws3FasterShooting direkt beschreibst, speicherst du den Wert in w3sFS, nur um ihn direkt wieder auszulesen und der Variable ws3FasterShooting zu übergeben.
Das ist schon mal nicht so dolle.
Aber dein Problem, was da jetzt entsteht, ist: ws3FasterShooting hat jetzt den Wert 2 und somit ist die Bedingung für die nächste If Abfrage erfüllt.
Da drin bekommt die Variable jetzt den Wert 3 und nun ist auch die Nächste If Abfrage erfüllt!

Also entweder drehst du die If-Abfragen um, fängst also mit der Abfrage 3 an, dann die 2 dann die 1, denn kleiner kanns ja nicht werden, oder aber du nutzt else if.
 

if(wert==1){ 
  // ich bin 1 also mache was
}
else if(wert==2){ 
  // ich bin nicht 1, ich bin 2 also mache was anderes
}
else{ 
  // ich bin weder 1 noch 2 also mache das was noch übrig bleibt
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...