2016-06-28 5 views
1

Ich habe eine einfache Frage und seltsam von der Übergabe von Wert an Datentyp Klassenvariable.Einheit mit C# -Skript: Klassendatentyp Wert von Klasse mit Daten zweimal übergeben Eigenartig

der Code wie folgt:

void AddItem(int ID) { 
    for (int i = 0; i < database.items.Count; i++) { 
     if(database.items[i].itemID == ID) { 
      itemxs = new item (database.items [i].itemName, 
           database.items [i].itemID, 
           database.items [i].itemDesc, 
           database.items [i].harvest, 
           database.items [i].itemTime, 
           database.items [i].stdprice, 
           database.items [i].hightprice, 
           database.items [i].itemStock, 
           database.items [i].Lvlunlock, 
           database.items [i].rawTree, 
           database.items [i].itemType, 
           database.items [i].itemProd, 
           database.items [i].itemIcon); 

      Debug.Log ("Item Icon 1 : " + database.items[i].itemIcon); // This appear "Corps/Lemon" 
      Debug.Log ("Item Icon 2 : " + itemxs.itemIcon); // This appear "Corps/Lemon/Lemon" **even though I just passing value from code itemxs = new item (database.items [i].itemName,...etc)** it is wierd 

      CheckInventoryExist(itemxs); 
      break; 
     } 
    } 
} 

ItemIcon ist Quelle von Basisname: Basisnamen + itemName; database.items [i] .itemicon enthalten "Corps/Lemon" Das Problem ist, wo ich debug.log database.items [i] .itemicon es immer noch die gleiche Zeichenfolge, die "Corps/Lemon" ist, Aber wenn ich setzte "itemxs = new item (database.items [i] .itemName, .... etc" und dann debug.log i itemxs.itemicon es enthalten "Corps/Zitrone/Lemon"

Was ist hier los?

Dank

Dennis

Unten ist die Klasse:

item.cs

using UnityEngine; 
using System.Collections; 

// Make Class Item 
public class item { 
    public string itemName; 
    public int itemID; 
    public string itemDesc; 
    public string itemIcon; 
    public GameObject itemModel; 
    public int itemTime; 
    public int hightprice; 
    public int stdprice; 
    public int itemStock; 
    public int harvest; 
    public RawTree rawTree; 
    public ItemType itemType; 
    public ItemProd itemProd; 
    public int Lvlunlock; 
    private string baseName; 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void Awake() { 

    } 

    public enum ItemType { 
     Raw, 
     Admirable, 
     Valuable 
    } 

    public enum RawTree { 
     BigTree, 
     SmallTree, 
     Field, 
     None 
    } 

    public enum ItemProd { 
     AnimalBarm, 
     Mining, 
     Corps, 
     Dairy, 
     JuiceJamMaker, 
     Merchant, 
     Kitchen, 
     Bakery, 
     CraftHouse 
    } 

    public item (string name, int ID, string desc, int harvestx, int time, int stdpricex, int hightpricex, int stock, int Lvlunlockx, RawTree RawTree, ItemType type, ItemProd prod, string folder) { 
     itemName = name; 
     itemID = ID; 
     itemDesc = desc; 
     harvest = harvestx; 
     itemTime = time; 
     stdprice = stdpricex; 
     hightprice = hightpricex; 
     itemStock = stock; 
     Lvlunlock = Lvlunlockx; 
     rawTree = RawTree; 
     itemType = type; 
     itemProd = prod; 
     this.baseName = folder + "/"; 
     itemIcon = this.baseName + itemName; 
    } 

    public item() { 

    } 
} 

dann itemDatabase.cs

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

public class itemDatabase : MonoBehaviour { 
    public List<item> items = new List<item>(); 

    // Use this for initialization 
    void Start() { 
     // Add Data To Item List With Class Item 

     // ------------------------------- Item Corps (Raw - Big Tree) ------------------------------- // 
     items.Add (new item ("Lemon", 1, "Honey Lemon", 9, 1020, 75, 158, 0, 1, item.RawTree.BigTree, item.ItemType.Raw, item.ItemProd.Corps, "Corps")); 

    } 

    // Update is called once per frame 
    void Update() { 

    } 
} 

Wenn ich diesen Code zu setzen:

itemxs = new item (database.items [i].itemName, // This contain "Lemon" 
             database.items [i].itemID, 
             database.items [i].itemDesc, 
             database.items [i].harvest, 
             database.items [i].itemTime, 
             database.items [i].stdprice, 
             database.items [i].hightprice, 
             database.items [i].itemStock, 
             database.items [i].Lvlunlock, 
             database.items [i].rawTree, 
             database.items [i].itemType, 
             database.items [i].itemProd, 
             database.items [i].itemIcon); 

itemName enthalten: "Zitrone";

ItemICon enthalten: "Corps /" + itemName; Sie können es in der Datei itemDatabase.cs überprüfen, und der Konstruktor befindet sich unter item.cs.

so das Ergebnis ItemIcon muss sein: "Corps/Lemon" Aber

Warum itemxs.itemIcon Doppel itemName bekam? zum Beispiel: "Korps/Zitrone/Zitrone".

+1

Können Sie sagen, was in diesem magischen Konstruktorcode passiert? –

+0

Ich habe den Code mit Klasse aktualisiert. Können Sie es bitte überprüfen? –

+0

Als Nebenbemerkung: Entfernen Sie 'Start',' Awake' und 'Update' aus Ihrer' item' Klasse. Es erbt nicht von 'MonoBehaviour' und kann sie deshalb nicht haben (oder zumindest machen sie das nicht). Klassennamen sollten immer mit einem Großbuchstaben beginnen. –

Antwort

1

In item Konstruktor Sie es tun:

this.baseName = folder + "/"; 
itemIcon = this.baseName + itemName; 

wo folder == Corps und this.baseName == "Corps/Lemon/" und itemName == "Lemon" so haben Sie genau das, was Sie bekommen sollte.

+0

In itemDatabase: items.Add (neues Element ("Lemon", 1, "Honey Lemon", 9, 1020, 75, 158, 0, 1, item.RawTree.BigTree, item.ItemType.Raw, item.ItemProd. Korps, "Korps")); ....... und am Ende des Parameters habe ich nur "Corps" eingegeben. Also this.baseName = folder = "Corps /" ohne Zitrone. Ich habe versucht, itemName zu löschen; aber itemIcon enthält nur "Corps /". Was ist das Problem ? –

-2

In Ihrem Konstruktor:

this.baseName = folder + "/"; // if folder = "Corps/Lemon" from database.items[i].itemIcon 
itemIcon = this.baseName + itemName; // it will update itemIcon to "Corps/Lemon" + "/" + "Lemon" 

Haben Sie es jetzt ??

Sie können den Wert itemIcon direkt zuweisen, anstatt dies alles zu tun.

Tun Sie dies in Ihrem Konstruktor:

itemIcon = folder; 

Prost

+0

In itemDatabase: items.Add (neues Element ("Lemon", 1, "Honey Lemon", 9, 1020, 75, 158, 0, 1, item.RawTree.BigTree, item.ItemType.Raw, item.ItemProd. Korps, "Korps")); ....... und am Ende des Parameters habe ich nur "Corps" eingegeben. Also this.baseName = folder = "Corps /" ohne Zitrone. Ich habe versucht, itemName zu löschen; aber itemIcon enthält nur "Corps /". Was ist das Problem ? –

+0

von Ihrem ursprünglichen Code: 'database.items [i] .itemIcon // This Enthalten" Corps/Lemon ");' übergeben Sie 'itemIcon' NICHT die Zeichenfolge" Corps " –

+0

Könnten Sie sich diese Zeile oben: Debug .Log (database.items [i] .itemIcon); // Während des Debuggens enthält diese noch "Corps/Lemon" Debug.Log (itemxs.itemIcon); // Beim Debuggen wird dieser "Corps/Lemon/Lemon" enthalten. –