2016-05-08 13 views
0

Ich habe 2 gleiche Klassen, eine für die Primärwaffe und die andere für die Sekundärwaffe. Hier sind meine Klassen:Kann Objekt C nicht erstellen

public class weapon : MonoBehaviour { 

public string Name { get; set; } 
public float Damages { get; set; } 
public float FireRate { get; set; } 
public float Range { get; set; } 
public float BulletSpeed { get; set; } 
public bool isOn { get; set; } 

public weapon(string name, float damages, float fireRate, float range, float bulletSpeed, bool ison) { 

    this.Name = name; 
    this.Damages = damages; 
    this.FireRate = fireRate; 
    this.Range = range; 
    this.BulletSpeed = bulletSpeed; 
    this.isOn = ison; 
    } 
} 

public class weapon1 : MonoBehaviour { 

public string Name { get; set; } 
public float Damages { get; set; } 
public float FireRate { get; set; } 
public float Range { get; set; } 
public float BulletSpeed { get; set; } 
public bool isOn { get; set; } 

public weapon1(string name, float damages, float fireRate, float range, float bulletSpeed, bool ison) { 

    this.Name = name; 
    this.Damages = damages; 
    this.FireRate = fireRate; 
    this.Range = range; 
    this.BulletSpeed = bulletSpeed; 
    this.isOn = ison; 
    } 
} 

ich in einem anderen Skript möchten, dass, wenn ich ‚F‘ drücken, werden die Waffen nehmen jeweils ihre Spezifikationen, aber es wird bei Angabe des Namens auf dem zweiten stecken, hier ist mein Skript geben sie ihre Daten:

void Update() { 

    if (Input.GetKeyDown (KeyCode.F)) { 

     GetComponent<weapon>().Name = "Rien"; 
     GetComponent<weapon>().Damages = 0; 
     GetComponent<weapon>().FireRate = 0; 
     GetComponent<weapon>().Range = 0; 
     GetComponent<weapon>().BulletSpeed = 0; 
     GetComponent<weapon>().isOn = true; 

     Debug.Log (GetComponent<weapon>().Name); 

     GetComponent<weapon1>().Name = "Rien1"; //stuck here... :'(
     GetComponent<weapon1>().Damages = 0; 
     GetComponent<weapon1>().FireRate = 0; 
     GetComponent<weapon1>().Range = 0; 
     GetComponent<weapon1>().BulletSpeed = 0; 
     GetComponent<weapon1>().isOn = false; 

     Debug.Log(GetComponent<weapon1>().Name); 
    } 

} 

ich erhalte ‚Objektverweis nicht auf eine Instanz eines Objekts festgelegt‘ und ich habe genau das gleiche für beide Waffen Vielen Dank im Voraus

+3

Sie sollten nicht mehrere Klassen erstellen, die genau so sind. Erstellen Sie eine Klasse und instanziieren Sie sie so oft wie nötig und ändern Sie ihre Member so, dass jede Instanz eindeutig ist. –

+1

Nun, 'GetComponent ()' gab 'null' zurück. Sind Sie sicher, dass sich sowohl ein "Waffe" - als auch ein "Waffe1" -Skript auf dem GLEICHEN Objekt befinden? Außerdem: Ich finde es schlecht, zwei Klassen mit genau demselben Code zu haben, aber nur einen anderen Namen. Es würde schmerzhaft sein, Änderungen an ihnen vorzunehmen und sie aufrechtzuerhalten. Machen Sie einfach ein "Waffen" -Skript und fügen Sie eine weitere Eigenschaft hinzu, um zwischen Primär- und Sekundärwaffe zu unterscheiden. –

+0

Hast du eine Idee, wie ich es machen soll? – Ay0m3

Antwort

1

Sie machen einige grundlegende Programmierfehler sowie einige grundlegende U spezifische Fehler. Wie in den Kommentaren erwähnt, sollten Sie nicht viele Klassen haben, die genau gleich sind. Denken Sie daran, not repeat your self.

Dann erben Sie von MonoBehaviour, aber definieren eine Konstruktormethode zum Festlegen Ihrer Felder. Mach das nicht in Einheit. Stellen Sie die Feilds im Inspector zur Verfügung, indem Sie sie publizieren oder das Attribut [SerializeField] privaten Membervariablen hinzufügen. Wenn Sie etwas haben, was Sie tun wollen, wenn das Objekt dann diese in der Start() Methode erstellt wird gesetzt:

public Weapon : MonoBehviour 
{ 
    public string name; //set these in the inspector for each weapon 
    public float damage; 
    //etc 

    // in Unity you use the Start method for mono behaviours. NOT the constructor method 
    void Start() 
    { 
     //Do things when the object is created 
    } 
} 
Jetzt

, es ist nicht klar, wie man Waffen auf den Player aus Ihrer Frage hinzufügen, aber was Sie sollte do fügt dem Spielerobjekt in der Hierarchie ein Spielobjekt als Kind hinzu. Tun Sie dies für jede Waffe und fügen Sie dann Ihrer Waffe jedes Waffenskript hinzu. Ändern Sie dann die Felder, die Sie sich im Inspektor zur Verfügung gestellt haben. Sie können dann über ein Skript auf dem Player einen Hinweis auf die Waffen erhalten, die der Spieler gerade besitzt, und nach dem Drücken einer Taste die gewünschten Werte eingeben.

+1

Ich habe mein Skript komplett umgeschrieben, so dass nur eine Klasse übrig bleibt und ich nehme zur Kenntnis, was du gesagt hast sehr viel: D – Ay0m3

+0

Sehr schön, froh zu hören. Wenn Sie gerade mit der Einheit beginnen, lesen Sie die [offiziellen Tutorials] (https://unity3d.com/learn/tutorials/topics/scripting). Sie sind sehr klar mit den Grundlagen! viel Glück. –

Verwandte Themen