Thanny08 Geschrieben 1. November 2022 Melden Share Geschrieben 1. November 2022 Hallo liebe Com, Beim erstellen meines Shop System in meinem Spiel, sind heute 2 Probleme aufgetreten. Zum einen erscheint, wenn ich nun in die Level Szene gehe (nur dann) , folgende Fehlermeldung: IndexOutOfRangeException: Index was outside the bounds of the array. ShopSystem.UpdateUI () (at Assets/Scrips/ShopSystem/ShopSystem.cs:71) ShopSystem.Update () (at Assets/Scrips/ShopSystem/ShopSystem.cs:54) Mein Script sieht in dieser Zeile so aus: public void UpdateUI() { PlayerBluePrint p = players[selectedOption]; //Es geht um diese Zeile if (p.isunlocked) { buyButton.gameObject.SetActive(false); } else { buyButton.gameObject.SetActive(true); buyButton.GetComponentInChildren<TextMeshProUGUI>().text = "Buy- " + p.price; if (p.price <= PlayerPrefs.GetInt("NumberOfCoins")) { buyButton.interactable = true; } else { buyButton.interactable = false; } } } private void Update() { UpdateUI(); //Und eben noch Update Methode weil dei Dort die ganze zeit ausgefürt wird... } private void UpdateCharacter(int selectedOption) { Character character = characterDB.GetCharacter(selectedOption); artworkSprite.sprite = character.characterSprite; nameText.text = character.characterName; PlayerBluePrint p = players[selectedOption]; //Hier ist das Problem auch noch if (!p.isunlocked) { return; } Save(); } public void UnlockPlayer() { PlayerBluePrint p = players[selectedOption]; //Hier funktioniert es ohne Probleme PlayerPrefs.SetInt(p.name, 1); PlayerPrefs.SetInt("SelectedPlayer", selectedOption); p.isunlocked = true; PlayerPrefs.SetInt("NumberOfCoins", PlayerPrefs.GetInt("NumberOfCoins", 0) - p.price); } Nun weiß ich nichjt woran das liegen könnte weil ich habe die gleiche zeile code auch woanders verbaut, und dort funktioniert es ohne Probleme. Na ja ich hab schon viel versucht und es nicht hinbekommen. Für Hilfe wäre ich sher dankbar! Das zweite Problem ist das Der Skin, wenn er nicht gekauft wurde trozdem in meiner LevelSzene spielbar ist. Habe das Problem nichjt gefunden.. Hier nochmal mein gesamtes Script für meinen Shop: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class ShopSystem : MonoBehaviour { public CharacterDatabase characterDB; public Text nameText; public SpriteRenderer artworkSprite; private int selectedOption = 0; public Text MünzenAnzahl; public int münzenAnzahl; public PlayerBluePrint[] players; public Character[] characters; public Button buyButton; void Start() { PlayerPrefs.SetInt("NumberOfCoins", 40); münzenAnzahl = PlayerPrefs.GetInt("NumberOfCoins"); MünzenAnzahl.text = münzenAnzahl.ToString(); foreach(PlayerBluePrint player in players) { if (player.price == 0) player.isunlocked = true; else player.isunlocked = PlayerPrefs.GetInt(player.name, 0) != 0; } MünzenAnzahl.text = "100"; if (!PlayerPrefs.HasKey("selectedOption")) { selectedOption = 0; } else { Load(); } UpdateCharacter(selectedOption); } private void Update() { UpdateUI(); } public void NextOption() { selectedOption++; if (selectedOption >= characterDB.CharacterCount) { selectedOption = 0; } UpdateCharacter(selectedOption); Save(); } public void UpdateUI() { PlayerBluePrint p = players[selectedOption]; if (p.isunlocked) { buyButton.gameObject.SetActive(false); } else { buyButton.gameObject.SetActive(true); buyButton.GetComponentInChildren<TextMeshProUGUI>().text = "Buy- " + p.price; if (p.price <= PlayerPrefs.GetInt("NumberOfCoins")) { buyButton.interactable = true; } else { buyButton.interactable = false; } } } public void BackOption() { selectedOption--; if (selectedOption < 0) { selectedOption = characterDB.CharacterCount - 1; } UpdateCharacter(selectedOption); Save(); } private void UpdateCharacter(int selectedOption) { Character character = characterDB.GetCharacter(selectedOption); artworkSprite.sprite = character.characterSprite; nameText.text = character.characterName; PlayerBluePrint p = players[selectedOption]; if (!p.isunlocked) { return; } Save(); } public void UnlockPlayer() { PlayerBluePrint p = players[selectedOption]; PlayerPrefs.SetInt(p.name, 1); PlayerPrefs.SetInt("SelectedPlayer", selectedOption); p.isunlocked = true; PlayerPrefs.SetInt("NumberOfCoins", PlayerPrefs.GetInt("NumberOfCoins", 0) - p.price); } private void Load() { selectedOption = PlayerPrefs.GetInt("selectedOption"); } private void Save() { PlayerPrefs.SetInt("selectedOption", selectedOption); } } Vielen Dank schonmal im Vorraus für dei Hilfe!! Liebe Grüße Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. November 2022 Melden Share Geschrieben 1. November 2022 Moin, ich würde mal vermuten, dass characterDB.CharacterCount nicht denselben Wert hat wie players.Length. Denn ansonsten arbeitest du mit if (selectedOption < 0) { selectedOption = characterDB.CharacterCount - 1; } und if (selectedOption >= characterDB.CharacterCount) { selectedOption = 0; } schon richtig. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thanny08 Geschrieben 6. November 2022 Autor Melden Share Geschrieben 6. November 2022 Moin! Erstmal Danke für deine fixe Antwort! Egal was ich versucht habe, ich habe es nicht geschafft, Das Problem zu beheben. Könntest du vieleicht die entsprechenden Codezeilen, einmal als Beispiel so umschreiben das der Fehler nicht mehr angezeigt werden müsste? Wäre super nett! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 6. November 2022 Melden Share Geschrieben 6. November 2022 Wenn ich wüsste, wo der Fehler genau liegt, könnte ich diese Erkenntnis mit dir teilen, und dann reparierst du es selber - ich weiß es aber nicht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thanny08 Geschrieben 6. November 2022 Autor Melden Share Geschrieben 6. November 2022 Okay dann versuch ich es weiter. Trozdem vielen Dank! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.