2016-04-29 8 views
0

Ich habe eine Klasse gemacht, einige Daten zu organisieren und eine Klasse aus mehreren dieser Klassen (Subclass?) Gemacht, so kann ich so etwas wie ...Wie referenziere ich eine Klasse, die aus Klassen aus einem Unity3D-Monobehaviour besteht?

classA.classB.value = 1; 

aber ich herausfinden kann nicht tun, wie um auf meine Klassen zu verweisen. Wenn jemand weiß, wie ich das machen soll, wäre das großartig!

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

class Gene { 
    public string name; 
    public float value; 
    public float complexity; 

    public Gene() { 
     name = ""; 
     value = 0; 
     complexity = 0; 
    } 

    public Gene(string Name, float Value, float Complexity) { 
     name = Name; 
     value = Value; 
     complexity = Complexity; 
    } 
} 

class Genome { 
    public Gene agility; 
    public Gene intelligence; 
    public Gene strength; 

    public Genome(){ 
     agility = new Gene(); 
     intelligence = new Gene(); 
     strength = new Gene(); 
    } 

    public Genome(Gene Agility, Gene Intelligence, Gene Strength) { 
     agility = Agility; 
     intelligence = Intelligence; 
     strength = Strength; 
    } 
    public IEnumerator GetEnumerator() { 
     return (IEnumerator)this; 
    } 
} 

public class Life : MonoBehaviour { 
    Genome genome;  //Warning Life.genome is never assigned to, and will always have its default value null 
    Quantity quantity; //Warning Life.quantity is never assigned to, and will always have its default value null 

    void OnEnable() { 
     genome = /*???*/; //How do I add the reference? 
     quantity = /*???*/; //How do I add the reference? 

     genome.agility.name = "Agility"; //On Runtime: NullReferenceException: Object reference not set to an instance of an object 
     genome.agility.complexity = 100; 

     genome.intelligence.name = "Intelligence"; 
     genome.intelligence.complexity = 1000; 

     genome.strength.name = "Strength"; 
     genome.strength.complexity = 100; 
    } 
} 

Antwort

2

Sie haben die new Schlüsselwort verwenden sowohl genome und quantity zu initialisieren. Sie verwenden das Schlüsselwort new für die Initialisierung, wenn die Klasse, die Sie initialisieren möchten, nicht von MonoBehaviour stammt. Ihre Klassen Genome und stammen nicht von MonoBehaviour, daher ist das neue Schlüsselwort der richtige Weg, um sie zu initialisieren.

Genome genome = null; 
Quantity quantity = null; 

void Start() 
{ 
    //initialize 
    genome = new Genome(new Gene("", 0, 0), new Gene("", 0, 0), new Gene("", 0, 0)); 
    quantity = new Quantity(); 

    //Now you can use both references 
    genome.agility.name = "Agility"; 
    genome.agility.complexity = 100; 

    genome.intelligence.name = "Intelligence"; 
    genome.intelligence.complexity = 1000; 

    genome.strength.name = "Strength"; 
    genome.strength.complexity = 100; 


} 

Nun, wenn Ihre Genome und Quantity Klassen ableiten beide aus MonoBehaviour. Sie sollten niemals das neue Schlüsselwort initialisieren.

Zum Beispiel:

class Gene :MonoBehaviour{ 

} 

Sie das neue Schlüsselwort nicht dafür verwenden, die Sie verwenden addComponent oder Instantiate Gameobject das Skript an. Und Sie sollten nie einen Konstruktor in der Klasse haben, wenn er von MonoBehaviour abgeleitet wird.

void Start() 
{ 
    genome = gameObject.AddComponent<Gene>(); 
} 
+0

Beachten Sie, dass 'Genome' und' Quantity' keine Nachkommen von 'AudioClip' sind. Betrachten Sie einige Überarbeitungen, um das OP nicht zu täuschen. – Serlite

+0

Making sie tatsächlich ein 'neues Genome()/Quantity()' und du bist gut zu gehen;) –

+0

@Serlite Das ist ein Tippfehler ich habe es kompilieren lassen, da ich sein Skript nicht auf meiner Seite habe. Ich habe vergessen, sie zurück zu seinem Genom und Quantität zu ändern – Programmer