簡體   English   中英

Unity3D C#不能從類創建obj

[英]Unity3D C# cant create obj from class

我有一個腳本,其中寫了兩個類。我在從StatsTotal類中的第二個類Stats創建對象時遇到問題。 stats[i] = new Stats(i); 這里我遇到了問題。從Stats()創建的對象為null,因此數組統計信息的所有元素都為null。 在團結中我不能從我自己的類創建對象? 請幫忙。謝謝。

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;

    }
}

只需不要在Stats類中inherit MonoBehaviour 采用

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM