Jump to content
Unity Insider Forum

Script Problem


Thanny08

Recommended Posts

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

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

Archiviert

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

×
×
  • Neu erstellen...