2016-08-04 3 views
0

У меня есть скрипт, где написаны два класса. У меня проблема с созданием объекта из второго класса Stats в классе StatsTotal. stats[i] = new Stats(i); здесь у меня проблема. Объект, созданный из Stats(), равен null, и поэтому все элементы статистики массива имеют значение NULL. В единстве я не могу создавать объекты из своих классов? Пожалуйста, помогите. Спасибо.Unity3D C# can not create obj from class

StatsTotal сценарий:

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 сценарий:

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

Не выведем Статистика класс от Monobehavior –

ответ

2

Просто не inherit от MonoBehaviour в вашем Stats классе. Используйте

class Stats { 
...... 
} 

не

public class Stats : MonoBehaviour 
{ 

} 

Если вы унаследовали от MonoBehaviour, вы больше не можете использовать new ключевое слово для создания экземпляра сценария, Вы должны использовать функцию Instantiate.

Кроме того, реализация сохранения и загрузки не очень хороша. Поскольку у вас есть много переменных для сохранения, просто преобразуйте их в Json, затем сохраните с помощью PlayerPrefs. Чтобы загрузить их, используйте PlayerPrefs для загрузки данных json, а затем преобразуйте их обратно в class.

Это то, что он должен выглядеть следующим образом:

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; 
    } 
} 

Использование:

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

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

ReadTotal действительно должен быть статическим. –

+0

Должно быть. Нет необходимости создавать экземпляр для его чтения, но я боялся, что OP начнет использовать 'static' для всего, если я это сделаю. – Programmer

+0

Спасибо, я попробую. –

 Смежные вопросы

  • Нет связанных вопросов^_^