Jump to content
Unity Insider Forum

Probleme mit einem Inventoryscript C#!!


Selan12

Recommended Posts

Hallo ich habe ein Problem mit den folgenden Scripts und zwar bin ich dabei ein 2D spiel zu erstellen das klappte alles auch ganz gut ich konnte Items mit der Maus anklicken die dann in meinem Inventar angezeigt wurden ich konnte auch z.b mit dem Gegenstand DoorKey wenn dieser in meinem Inventar war ein Tor öffnen doch als ich mein Menü Script erstellte und einen Back Button in meine Scene in der auch das Spiel(Die obengenannte problematik) stattfinden erstellte und das spiel exportierte konnte ich plötzlich keine dinge mehr aufheben also ging ich zurück in Unity und bekam die Meldung: " NullReferenceException: Object reference not set to an instance of an object
PickableItem.OnMouseDown () (at Assets/Scripts/PickableItem.cs:22)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)
 " ich muss dazu sagen das Ich das InventoryItem zum Test noch einmal neu erstellt habe und dort das selbe Problem hatte hier nun die Scripts um die es sich dabei handelt (Ich habe kein Hintergrundwissen um mache das mit toturials/und dem Buch (Spieleentwickeln mit Unity5 von Carsten seifert)).

die mit Gelb markierte Zeile wird mir Angezeigt wenn ich doppelt auf die Fehlermeldung klicke.

 

ICH DANKE SCHON MAL IM VORRAUS

Script 1 Inventory

<

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

public class Inventory : MonoBehaviour {
    public Image[] guiItemImages;
    private Dictionary<InventoryItem, int> items = new Dictionary<InventoryItem, int>();


    // Use this for initialization
    void Start ()
    {
        UpdateView();


        
    }
    public bool AddItem(InventoryItem ip)
    {
        if (!items.ContainsKey(ip))
        {
            if (items.Count < guiItemImages.Length)
                items.Add(ip, 1);
            else
                return false;
        }
        else
        {
            items[ip]++;
        }
        UpdateView();
        return true;
    }
        public bool RemoveItem(InventoryItem ip)
    {
        if(items.ContainsKey(ip))
        {
            if(items[ip]> 0)
            {
                items[ip]--;
                if(items[ip] <= 0)
                {
                    items.Remove(ip);

                }
                UpdateView();
                return true;

            }
        }
        return false;
        
    }
    void UpdateView()
    {
        int guiCount = guiItemImages.Length;
        for(int i = 0; i< guiCount; i++)
        {
            guiItemImages.enabled = false;
            guiItemImages.GetComponentInChildren<Text>().text = "";
        }
        int index = 0;
        foreach(KeyValuePair<InventoryItem,int>current in items)
        {
            guiItemImages[index].enabled = true;
            guiItemImages[index].sprite = current.Key.sprite;
            guiItemImages[index].GetComponentInChildren<Text>().text = current.Value.ToString();
            index++;

        }
    }
}
 

 >

 

Script 2 InventoryItem

 <

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

public class InventoryItem : ScriptableObject
{

    public string Itemname;
    public Sprite sprite;
    public GameObject prefab;

}

 

Script 3 PickableItem

 

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

public class PickableItem : MonoBehaviour {

    public InventoryItem inventoryItem;
    private Inventory inventory;
    private Transform player;

    // Use this for initialization
    void Start ()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        inventory = player.GetComponent<Inventory>();
        
    }

    void OnMouseDown()
    {
       
                if (inventory.AddItem(inventoryItem))                      

                                                                                   
                {                                                                 
                    Destroy(gameObject);
                }
            
        
    }
}

 >

Script 4 CreateInventoryItem

 

<  

using UnityEditor;
using UnityEngine;
using System.Collections;


public class CreateInventoryItem : MonoBehaviour {
#if UNITY_EDITOR
    [MenuItem("Assets/Create/Inventory Item")]
    static void CreateAsset()
    {

        if(!AssetDatabase.IsValidFolder("Assets/Inventory Items"))

        {
            AssetDatabase.CreateFolder("Assets", "Inventory Items");
        }

        ScriptableObject asset = ScriptableObject.CreateInstance(typeof(InventoryItem));
        AssetDatabase.CreateAsset(asset, "Assets/Inventory Items/" + "New InventoryItem" + System.Guid.NewGuid() + ".asset");
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = asset;
    }
#endif

    

}

 

 >

 

Viele Danke für eure zeit ich hoffe ihr könnt mir Helfen

 

Mit freundlichen Grüßen Selan12
 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ein null reference exception kommt immer dann wenn du auf ein Objekt zugreift was allerdings noch nicht zugewiesen ist. Also ist entweder dein inventory object null oder dein inventoryItem object null. kannst ja mal an der Stelle einen Haltepunkt hinsetzen dann kannst alle werte auslesen und schnell herausfinden was den Wert Null hat. Vermute es ist dein inventoryItem

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Selan12:

Hallo danke für die schnell antwort aber ich habe allen items das zu gewiesen was sie brauchen die skripts das inventoryItem wie können die dann null sein und wie muss ich das machen damit ich das auslesen kann

 

gerne auch über skype für ein besseres verständnis meiner seits 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du effizient und schnell Hilfe möchtest, empfehle ich dir,

  1. einen vernünftigen Threadtitel zu wählen, in dem dein Problem beschrieben wird; und nicht "HILFE!!!11eins"
  2. deinen Code in Code-Tags zu packen, damit man ihn auch lesen kann. Einfach das <>-Knöpfchen drücken.
  3. Aus gegebenem Anlass: Keine Doppelposts bitte.

Da du an dieser Stelle exakt eine Variable hast, die durch null-sein diesen Fehler erzeugen kann: inventory ist null. Du hast also ein Objekt, auf dem das gepostete Skript liegt, aber keine Inventory-Komponente. Wenn ich mir die Namen der Skripts so ansehe, glaube ich auch nicht, dass jedes GameObject mit einem PickableItem auch mit einer Inventory-Komponente versehen hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Sascha:

Wenn du effizient und schnell Hilfe möchtest, empfehle ich dir,

  1. einen vernünftigen Threadtitel zu wählen, in dem dein Problem beschrieben wird; und nicht "HILFE!!!11eins"
  2. deinen Code in Code-Tags zu packen, damit man ihn auch lesen kann. Einfach das <>-Knöpfchen drücken.
  3. Aus gegebenem Anlass: Keine Doppelposts bitte.

Da du an dieser Stelle exakt eine Variable hast, die durch null-sein diesen Fehler erzeugen kann: inventory ist null. Du hast also ein Objekt, auf dem das gepostete Skript liegt, aber keine Inventory-Komponente. Wenn ich mir die Namen der Skripts so ansehe, glaube ich auch nicht, dass jedes GameObject mit einem PickableItem auch mit einer Inventory-Komponente versehen hast.

wie mache ich das mit den <> dingern ??

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

welche IDE verwendet Du und kennst Du Dich damit aus? Wenn Du den debugger an den Unity Prozeß attachst dann siehst Du genau wo Deine NullReference Exception herkommt und Du musst nicht mehr raten.

Bei Deinem PickableItem wird auf den member inventory keine Null-Prüfung gemacht, was sehr schlecht ist, gewöhne Dir an, sicherer zu programmieren. Der member kann Null werden, wenn die Inventory-component des Players nicht gefunden wird, prüfe mal ob dieses Script auch Deinem Player zugewiesen ist.

Grüße

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 28.3.2017 um 22:44 schrieb unityfragen:

Guten Abend,

welche IDE verwendet Du und kennst Du Dich damit aus? Wenn Du den debugger an den Unity Prozeß attachst dann siehst Du genau wo Deine NullReference Exception herkommt und Du musst nicht mehr raten.

Bei Deinem PickableItem wird auf den member inventory keine Null-Prüfung gemacht, was sehr schlecht ist, gewöhne Dir an, sicherer zu programmieren. Der member kann Null werden, wenn die Inventory-component des Players nicht gefunden wird, prüfe mal ob dieses Script auch Deinem Player zugewiesen ist.

Grüße

Matthias

Vielen Dank ich habe leider keine Ahnung von IDE kannst du mir das vielleicht ein bissl näher erklären was du meinst über skype ? wenn ja gerne einfach anschreiben Selan14@web.de damit du mich findest  ^^. Ja die Scripts sind zugewiesen mittlerweile (ich habe nichts geändert ist es so in einer Scene geht es in der nächsten nicht dabei habe ich die scene 1 nur kopiert um das Spiel ende zu programieren um wenn der schlüssel im Inventar ist man das tor öffnen kann und erst dann durch das drücken einer Taste in das nächste lvl kommt  )  und jz da alles das selbe ist weiß ich nicht mehr wirklich was da abläuft und würde mich über einen Erklär freudigen der mir über Skype auf die finger schaut sehr freuen .

 

 

Grüße 

 

Sascha

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Archiviert

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

×
×
  • Neu erstellen...