Jump to content
Unity Insider Forum
Sign in to follow this  
Peanut

Button klickt jeden Frame

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

Die  ws3FasterShootingMethode wird wie du schon sagst über einen Button aufgerufen. Die Variable w3SFasterShooting soll anfangs auf 0 stehen und immer wenn man auf den Button drückt um 1 hoch springen damit man in die nächste IfAnweisung kommt.

Share this post


Link to post
Share on other sites

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).

Share this post


Link to post
Share on other sites

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
}

 

  • Like 2

Share this post


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...
Sign in to follow this  

×
×
  • Create New...