Jump to content
Unity Insider Forum

Text wird nicht aktualisiert


Singular

Recommended Posts

(Vorne weg, ich war jetzt nicht sicher ob das Problem mein Script ist oder die UI. Verschiebt den Thread wenn er eher zur UI gehört)

Hallo Leute, ich habe ein kleines Problem und komme einfach nicht dahinter wo mein Fehler liegt. Ich habe sogar an einzelnen stellen den selben Code (mit anderen Variablen) verwendet und dort klappt es. Ich habe ein Upgrade Menü erstellt in dem der Spieler die Möglichkeit hat Punkte auszugeben um sein Raumschiff zu verbessern in einzelnen Bereichen. Funktioniert auch alles wunderbar. Jetzt ist der Fehler das meine Texte nicht immer aktualisiert werden. Der einfachhalt halber habe ich die Aktualisierung zunächst in die Update Methode reingeschmissen, damit ich das nicht jedem Knopf zuweisen muss. Das mache ich später.

Um es euch besser zeigen zu können mal hier ein paar Screenshots:

Sobald ich das Menü öffne werden die Kosten für die Aufwertung nicht angezeigt.

image.png.c983120a05025eeae0d07abe3b31208f.png

Sobald ich jedoch ein Update gekauft habe:

image.png.016cc4c96f5d7dcafc077cfa264be80e.png

werden mir die kosten für die nächste Stufe angezeigt...

wenn ich jetzt das Menü zu den Raketen wechsle und wieder zurück komme, wieder selbes Problem.

Der Witz ist, den selben Code verwende ich auch für die Minen und die Raketen. Bei den Raketen das selbe Problem. Bei den Minen nicht. da funktioniert alles einwandfrei.

Hier noch der Code. Wie gesagt steht alles in der Update Methode.

 

    public void UpdateTextLaser()
    {
        float fx; 
        float f;

        laserDamageKosten.text = u.laserDamageUP[1].ToString();
      //u ist meine UpgradeDataBase. Ein Scriptable Object, welches die Daten bezüglich Kosten für Aufwertgunen, derzeitiges Level usw. speichert.
      // Wobei [1] die kosten für die nächste Stufe sind. Diese werden geändert, wenn die Aufwertung gekauft wird.
      [...]
    }

    public void UpdateTextMinen()
    {
        float fx;
        float f;
        
        mineDamageKosten.text = u.mineDamageUP[1].ToString();
      [...]
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Singular! Also aus deinen code snippets ist kein fehler zu erkennen, die sind also nicht hilfreich. Deiner beschreibung nach zu urteilen würde ich sagen du aktualisierst dein UI nicht richtig / zur falschen zeit. Du sagst du hast rufst UpdateTextLaser() und UpdateTextMinen() in deiner Update funktion auf ? 🤔
 Also so eta :

private void Update()
{
	UpdateTextLaser();
	UpdateTextMinen();
}

dann sollte Unity ja deine Texte jedes Framne updaten und nicht erst beim kaufen. Vermutlich hast du dann in deiner Update funktion einen bug. Poste doch mal deine Update funktion

 

beste Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm okay da würde ich dir zustimmen das das nicht die Fehlerquelle ist xD

Falls du weist wie man in deiner IDE den debugger an Unity attached und du weist wie man einen breakpoint setzt würde ich an deiner stelle das mal versuchen und schauen was in der Zeile:

laserDamageKosten.text = u.laserDamageUP[1].ToString(); 

eigentlich so in im u.laserDamage array steht 🤔. Im moment hätte ich noch 2 mögliche erklärungen

1) Update() wird bei dir garnicht wirklich ausgeführt

2) u.laserDamageUP[1].ToString() returned aus irgendwelchen gründen einen leering string... was komisch wäre, aber bei Unitys serialization passieren allerhand sonderbare dinge ¯\_(ツ)_/¯

Falls du nicht weist wie das mit dem Debugger und dem breakpoint geht schreib einfach mal

Debug.Log($"LaserDamage : '{u.laserDamage[1].ToString()}'");

in deine UpdateTextLaser funktion und schau ob in deiner Console was passiert wenn dein game läuft

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Cxyda83:

Falls du weist wie man in deiner IDE den debugger an Unity attached und du weist wie man einen breakpoint setzt würde ich an deiner stelle das mal versuchen und schauen was in der Zeile:

Nein, weiß ich leider nicht, aber...

vor 3 Stunden schrieb Cxyda83:

Falls du nicht weist wie das mit dem Debugger und dem breakpoint geht schreib einfach mal


Debug.Log($"LaserDamage : '{u.laserDamage[1].ToString()}'");

in deine UpdateTextLaser funktion und schau ob in deiner Console was passiert wenn dein game läuft

...das was passiert, wenn ich das in die Konsole reinschaue ist, dass er mit LaserDamage: 150 ausgibt. Das sind die korrekten kosten, die mir angezeigt werden müssten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann ich gerne machen... aber sei gewarnt und zieh den Kopf ein bevor du erschlagen wirst ;)

Nur zum Verständnis:

  • "Kosten" gibt immer die Kosten für die nächste Aufwertung an. laserDamageKosten ist also der Preis um dem Laser mehr Schaden zu geben.
  • "LevelC" = Level Current - Die Stärke, auf dem sich ein Upgrade derzeit befindet. laserDamageLevelC ist 1, da es derzeit 1 Schaden macht.
  • "LevelN" = Level Next - Die Stärke auf der nächsten Stufe bei laserDamageLevelN also 2.

Dann noch ganz kurz zu meinem Array für jede Aufwertung:

  • laserDamageUP[0] = 0; Das derzeitige Level eines Upgrades. {get & set} (in diesen bereichen wird geschrieben und gelesen)
  • laserDamageUP[1] = 150; Die kosten für die nächste Stufe (also in diesem Fall von 0 auf 1) {get & set}
  • laserDamageUP[2] = 100; Die Preissteigerung pro gekauftes Level. Nach dem Kauf wird also [1] = [1] + [2] gerechnet {get}
  • laserDamageUP[3] = 1; Die Änderung an der Spielmechanik also in diesem Fall bekommt der Spieler +[3] Schaden pro Level {get}
  • laserDamageUP[4] = 0; Das Maximale Level für dieses Upgrade, wobei 0 keine Einschränkung ist.

Und wenn du jetzt noch nicht erschlagen bist, dann sei es jetzt ;):

public class TextManager : MonoBehaviour
{
  //Diese 4 DataBases sind alles Scriptable Objects. Damit über die Level hinweg, die Upgrades gespeichert und mitgenommen werden können.
    public UpdateDataBase u; 
    public WeaponsDataBase w;
    public EngineDataBase e;
    public SpezialDataBase s;

    public Text laserDamageKosten; public Text laserDamageLevelC; public Text laserDamageLevelN;
    public Text laserECKosten; public Text laserECLevelC; public Text laserECLevelN;
    public Text laserSpezialKosten; public Text laserSpezialLevelC; public Text laserSpezialLevelN;

    public Text raketeDamageKosten; public Text raketeDamageLevelC; public Text raketeDamageLevelN;
    public Text raketeAmmoMaxKosten; public Text raketeAmmoMaxLevelC; public Text raketeAmmoMaxLevelN;
    public Text raketeSpezialKosten; public Text raketeSpezialLevelC; public Text raketeSpezialLevelN;
    public Text raketeTurnKosten; public Text raketeTurnLevelC; public Text raketeTurnLevelN;
    public Text raketeReachKosten; public Text raketeReachLevelC; public Text raketeReachLevelN;

    public Text mineDamageKosten; public Text mineDamageLevelC; public Text mineDamageLevelN;
    public Text mineAmmoMaxKosten; public Text mineAmmoMaxLevelC; public Text mineAmmoMaxLevelN;
    public Text mineSpezial1Kosten; public Text mineSpezial1LevelC; public Text mineSpezial1LevelN;
    public Text mineReachKosten; public Text mineReachLevelC; public Text mineReachLevelN;
    public Text mineSpeedKosten; public Text mineSpeedLevelC; public Text mineSpeedLevelN;

    private void Start() 
    {
      //Ich weiß wäre nicht nötig, wenn ich es schon in der Update Methode habe aber ich hatte versucht, ob der Fehler dann weg ist...
        UpdateTextLaser();
        UpdateTextRaketen();
        UpdateTextMinen();
    }

    private void Update()
    {
        UpdateTextLaser();
        UpdateTextRaketen();
        UpdateTextMinen();
    }

    public void UpdateTextLaser()
    {
        float fx;
        float f;
	//1
//Etwas zur Übersicht: Die Zeilen sind immer gleich aufgebaut, welcher Text aktualisiert werden soll. Kosten, LevelC, LevelN
        laserDamageKosten.text = u.laserDamageUP[1].ToString();
        laserDamageLevelC.text = w.laserDamage.ToString();
        f = (w.laserDamage + u.laserDamageUP[3]); laserDamageLevelN.text = f.ToString();
        //2
        laserECKosten.text = u.laserECUP[1].ToString();
        laserECLevelC.text = w.laserEC.ToString("#.0");
        fx = u.laserECUP[3] * 0.1f;
        f = (w.laserEC + fx); laserECLevelN.text = f.ToString("#.0");
        //3
        if (u.laserSpezialUP[0] == 1)
        {
            laserSpezialKosten.text = "X";
            laserSpezialLevelN.text = "X";
            laserSpezialLevelC.text = "2";
        } 
        else
        {
            laserSpezialKosten.text = u.laserSpezialUP[1].ToString();
            laserSpezialLevelN.text = "2";
            laserSpezialLevelC.text = "1";
        }
    }

    public void UpdateTextMinen()
    {
        float f;
        //1
        mineDamageKosten.text = u.mineDamageUP[1].ToString();
        mineDamageLevelC.text = w.mineDamage.ToString();
        f = (w.mineDamage + u.mineDamageUP[3]); mineDamageLevelN.text = f.ToString();
        //2
        mineAmmoMaxKosten.text = u.mineMaxAmmoUP[1].ToString();
        mineAmmoMaxLevelC.text = w.minesAmmoMax.ToString();
        f = (w.minesAmmoMax + u.mineMaxAmmoUP[3]); mineAmmoMaxLevelN.text = f.ToString();
        //3
        if (u.mineSpezial1UP[0] == 1)
        {
            mineSpezial1Kosten.text = "X";
            mineSpezial1LevelN.text = "X";
            mineSpezial1LevelC.text = "1";
        }
        else
        {
            mineSpezial1Kosten.text = u.mineSpezial1UP[1].ToString();
            mineSpezial1LevelN.text = "1";
            mineSpezial1LevelC.text = "0";
        }
        //4
        mineReachKosten.text = u.mineReachUP[1].ToString();
        mineReachLevelC.text = w.mineReach.ToString();
        f = (w.mineReach + u.mineReachUP[3]); mineReachLevelN.text = f.ToString();
        //5
        mineSpeedKosten.text = u.mineSpeedUP[1].ToString();
        mineSpeedLevelC.text = w.mineSpeed.ToString();
        f = (w.mineSpeed + u.mineSpeedUP[3]); mineSpeedLevelN.text = f.ToString();
    }

    public void UpdateTextRaketen()
    {
        float f;
        //1
        raketeDamageKosten.text = u.raketeDamageUP[1].ToString();
        raketeDamageLevelC.text = w.missileDamage.ToString();
        f = (w.missileDamage + u.raketeDamageUP[3]); raketeDamageLevelN.text = f.ToString();
        //2
        raketeAmmoMaxKosten.text = u.raketeMaxAmmoUP[1].ToString();
        raketeAmmoMaxLevelC.text = w.missileDamage.ToString();
        f = (w.missileAmmoMax + u.raketeMaxAmmoUP[3]); raketeAmmoMaxLevelN.text = f.ToString();
        //3
        if (u.raketeSpezialUP[0] == 1)
        {
            raketeSpezialKosten.text = "X";
            raketeSpezialLevelN.text = "X";
            raketeSpezialLevelC.text = "1";
        }
        else
        {
            raketeSpezialKosten.text = u.raketeSpezialUP[1].ToString();
            raketeSpezialLevelN.text = "1";
            raketeSpezialLevelC.text = "0";
        }
        //4
        raketeTurnKosten.text = u.raketeTurnUP[1].ToString();
        raketeTurnLevelC.text = w.missileTurnspeed.ToString();
        f = (w.missileTurnspeed + u.raketeTurnUP[3]); raketeTurnLevelN.text = f.ToString();
        //5
        raketeReachKosten.text = u.raketeReachUP[1].ToString();
        raketeReachLevelC.text = w.missileReach.ToString();
        f = (w.missileReach + u.raketeReachUP[3]); raketeReachLevelN.text = f.ToString();
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

So krankheitsbedingt, habe ich es gerade erst geschafft mich mal da dran zu setzen. Keine Ahnung worin der Fehler genau lag aber jetzt ist er weg. Habe es gemacht wie du gesagt hast und habe den Button gelöscht und aus einem Funktionierenden ersetzt. Jetzt geht's. Ich danke dir.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...