Unity3D C#无法从类创建对象

Unity3D C#无法从类创建对象,c#,class,unity3d,null,monodevelop,C#,Class,Unity3d,Null,Monodevelop,我有一个脚本,其中编写了两个类。我无法从类StatsTotal中的第二个类Stats创建对象。Stats[I]=newstats(I)这里我遇到了问题。从Stats()创建的对象为null,因此数组Stats的所有元素都为null。在unity中,我不能从自己的类创建对象?请帮忙,谢谢 StatsTotal脚本: public class StatsTotal : MonoBehaviour { // Use this for initialization Stats[] st

我有一个脚本,其中编写了两个类。我无法从类StatsTotal中的第二个类Stats创建对象。
Stats[I]=newstats(I)这里我遇到了问题。从Stats()创建的对象为null,因此数组Stats的所有元素都为null。在unity中,我不能从自己的类创建对象?请帮忙,谢谢

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

    }
}

不要在你的
Stats
类中继承
monobhavior
。使用

class Stats {
......
}
不是

如果继承自
monobhavior
,则不能再使用
new
关键字创建脚本实例,必须使用实例化函数

此外,您的保存和加载实现看起来一点也不好。由于有许多变量要保存,只需将它们转换为
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;
    }
}

不要从MonobehaviorReadTotal派生Stats类,它应该是静态的。没有必要创建实例来读取它,但是我担心如果我这样做的话,OP会开始使用
static
。谢谢,我会尝试一下。
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();