2016-08-04 41 views
0

erstellen Ich habe ein Skript, wo zwei Klassen geschrieben werden. Ich habe ein Problem beim Erstellen von Objekt aus der zweiten Klasse Stats in der Klasse StatsTotal. stats[i] = new Stats(i); hier habe ich das Problem.Das von Stats() erstellte Objekt ist null und alle Elemente der Array-Statistik sind also null. In der Einheit kann ich keine Objekte aus meinen eigenen Klassen erstellen? Bitte helfen. Danke.Unity3D C# kann nicht Obj von Klasse

StatsTotal Skript:

public class StatsTotal : MonoBehaviour 
{ 

    // Use this for initialization 
    Stats[] stats; 
    static int carsCount; 
    int currentCar; 
    GameObject player; 
    void Start() 
    { 

     carsCount = PlayerPrefs.GetInt("CarsCount"); 
     stats = new Stats[carsCount]; 
     for (int i = 0; i < carsCount; i++) 
     { 

      stats[i] = new Stats(i); 
      if (stats[currentCar] != null) 
      { 
       Debug.Log(getStats().driftTimePresent + " " + getStats().driftTimeTotal); 
      } 
      stats[i].ReadTotal(); 
     } 
    } 

    void OnLevelWasLoaded() 
    { 
     if (Application.loadedLevelName != "MenuScene" && Application.loadedLevelName != "PrizeScene") 
     { 
      foreach (GameObject obj in GameObject.FindGameObjectsWithTag("PlayerSystem")) 
      { 
       if (obj.GetComponent<PlayerScript>().mainPlayer) 
       { 
        player = obj; 
        break; 
       } 
      } 
     } 
     currentCar = GetComponent<VariableHandler>().selectedCar; 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (Application.loadedLevelName != "MenuScene" && Application.loadedLevelName != "PrizeScene") 
     { 
      if (stats[currentCar] != null) 
      { 
       Debug.Log(getStats().driftTimePresent + " " + getStats().driftTimeTotal); 
       getStats().driftTimePresent = (int)player.GetComponent<PlayerScript>().driftTime; 
      } 
     } 

    } 

    public Stats getStats() 
    { 
     return stats[currentCar]; 
    } 
} 

Stats Skript:

public class Stats : MonoBehaviour 
{ 

    public int driftTimeTotal, driftTimePresent; 
    public int explodedTotal, explodedPresent; 
    public int flagsTotal, flagsPresent; 
    public int x2Total, x2Present; 
    public int shieldTotal, shieldPresent; 
    public int healthTotal, healthPresent; 
    public int scoreTotal, scorePresents; 
    public int finish1stTotal, finish1stPresent; 
    public int bonusesTotal, bonusesPresent; 
    public int hitsObjTotal, hitsObjPresent; 
    public int hitsCarTotal, hitsCarPresent; 
    public int jumpTotal, jumpPresent; 
    public int index; 

    public Stats(int index) 
    { 
     this.index = index; 
    } 
    // Use this for initialization 
    void Start() 
    { 

    } 

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

    } 

    public void ResetPresent() 
    { 
     driftTimePresent = 0; 
     explodedPresent = 0; 
     flagsPresent = 0; 
     x2Present = 0; 
     shieldPresent = 0; 
     healthPresent = 0; 
     scorePresents = 0; 
     finish1stPresent = 0; 
     bonusesPresent = 0; 
     hitsObjPresent = 0; 
     hitsCarPresent = 0; 
     jumpPresent = 0; 
    } 
    public void SaveTotal() 
    { 
     PlayerPrefs.SetInt("driftTimeTotal" + index, driftTimeTotal); 
     PlayerPrefs.SetInt("explodedTotal" + index, explodedTotal); 
     PlayerPrefs.SetInt("flagsTotal" + index, flagsTotal); 
     PlayerPrefs.SetInt("x2Total" + index, x2Total); 
     PlayerPrefs.SetInt("shieldTotal" + index, shieldTotal); 
     PlayerPrefs.SetInt("healthTotal" + index, healthTotal); 
     PlayerPrefs.SetInt("scoreTotal" + index, scoreTotal); 
     PlayerPrefs.SetInt("finish1stTotal" + index, finish1stTotal); 
     PlayerPrefs.SetInt("bonusesTotal" + index, bonusesTotal); 
     PlayerPrefs.SetInt("hitsObjTotal" + index, hitsObjTotal); 
     PlayerPrefs.SetInt("hitsCarTotal" + index, hitsCarTotal); 
     PlayerPrefs.SetInt("jumpTotal" + index, jumpTotal); 
    } 
    public void ReadTotal() 
    { 
     driftTimePresent = PlayerPrefs.GetInt("driftTimeTotal" + index); 
     explodedPresent = PlayerPrefs.GetInt("explodedPresent" + index); 
     flagsPresent = PlayerPrefs.GetInt("flagsPresent" + index); 
     x2Present = PlayerPrefs.GetInt("x2Present" + index); 
     shieldPresent = PlayerPrefs.GetInt("shieldPresent" + index); 
     healthPresent = PlayerPrefs.GetInt("healthPresent" + index); 
     scorePresents = PlayerPrefs.GetInt("scorePresents" + index); 
     finish1stPresent = PlayerPrefs.GetInt("finish1stPresent" + index); 
     bonusesPresent = PlayerPrefs.GetInt("bonusesPresent" + index); 
     hitsObjPresent = PlayerPrefs.GetInt("hitsObjPresent" + index); 
     hitsCarPresent = PlayerPrefs.GetInt("hitsCarPresent" + index); 
     jumpPresent = PlayerPrefs.GetInt("jumpPresent" + index); 
    } 
    public void SetTotal() 
    { 
     driftTimeTotal = PlayerPrefs.GetInt("driftTimeTotal" + index) + driftTimePresent; 
     explodedTotal = PlayerPrefs.GetInt("explodedTotal" + index) + explodedPresent; 
     flagsTotal = PlayerPrefs.GetInt("flagsTotal" + index) + flagsPresent; 
     x2Total = PlayerPrefs.GetInt("x2Total" + index) + x2Present; 
     shieldTotal = PlayerPrefs.GetInt("shieldTotal" + index) + shieldPresent; 
     healthTotal = PlayerPrefs.GetInt("healthTotal" + index) + healthPresent; 
     scoreTotal = PlayerPrefs.GetInt("scoreTotal" + index) + scorePresents; 
     finish1stTotal = PlayerPrefs.GetInt("finish1stTotal" + index) + finish1stPresent; 
     bonusesTotal = PlayerPrefs.GetInt("bonusesTotal" + index) + bonusesPresent; 
     hitsObjTotal = PlayerPrefs.GetInt("hitsObjTotal" + index) + hitsObjPresent; 
     hitsCarTotal = PlayerPrefs.GetInt("hitsCarTotal" + index) + hitsCarPresent; 
     jumpTotal = PlayerPrefs.GetInt("jumpTotal" + index) + jumpPresent; 

    } 
} 
+0

Sie sollten nicht Stats Klasse von Monobehavior –

Antwort

2

einfach nicht inherit von MonoBehaviour in Ihrer Stats Klasse. Verwenden Sie

class Stats { 
...... 
} 

nicht

public class Stats : MonoBehaviour 
{ 

} 

Wenn Sie von MonoBehaviour erben, können Sie nicht mehr verwenden die new Stichwort Instanz des Skripts zu erstellen, müssen Sie die Funktion Instantiate verwenden.

Darüber hinaus sieht Ihre Speichern und Laden Implementierung nicht gut aus. Da Sie viele Variablen speichern müssen, konvertieren Sie sie einfach in Json und speichern Sie dann mit PlayerPrefs. Um sie zu laden, verwenden Sie PlayerPrefs, um die JSON-Daten zu laden und dann in class zurück zu konvertieren.

Dies ist, wie es aussehen sollte:

using UnityEngine; 
using System.Collections; 
using System; 

[Serializable] 
public class Stats 
{ 

    public int driftTimeTotal, driftTimePresent; 
    public int explodedTotal, explodedPresent; 
    public int flagsTotal, flagsPresent; 
    public int x2Total, x2Present; 
    public int shieldTotal, shieldPresent; 
    public int healthTotal, healthPresent; 
    public int scoreTotal, scorePresents; 
    public int finish1stTotal, finish1stPresent; 
    public int bonusesTotal, bonusesPresent; 
    public int hitsObjTotal, hitsObjPresent; 
    public int hitsCarTotal, hitsCarPresent; 
    public int jumpTotal, jumpPresent; 
    public int index; 

    public void SaveTotal() 
    { 
     string playerJson = JsonUtility.ToJson(this); 
     PlayerPrefs.SetString("playerStats", playerJson); 
    } 

    public static Stats ReadTotal() 
    { 
     string playerJson = PlayerPrefs.GetString("playerStats"); 
     if (playerJson == null) 
     { 
      return null; 
     } 
     Stats stats = JsonUtility.FromJson<Stats>(playerJson); 
     return stats; 
    } 
} 

Nutzungs:

//Create new Stats and Save it 
Stats stats = new Stats(); 
stats.index = 90; 
stats.SaveTotal(); 

//Load new Stats 
Stats newStat = Stats.ReadTotal(); 
+1

ReadTotal ableiten wirklich statisch sein. –

+0

Es sollte sein. Es gibt keine Notwendigkeit, eine Instanz zu erstellen, um es zu lesen, aber ich hatte Angst, dass das OP anfangen würde, "statisch" für alles zu verwenden, wenn ich das tue. – Programmer

+0

Danke, ich werde es versuchen. –