[英]Unity3D C# cant create obj from class
I have a script where are written two classes.I have problem in creating object from the second class Stats in the class StatsTotal. 我有一个脚本,其中写了两个类。我在从StatsTotal类中的第二个类Stats创建对象时遇到问题。 stats[i] = new Stats(i);
here i am having the problem.The object created from Stats() is null and so all elements of the array stats are null. 这里我遇到了问题。从Stats()创建的对象为null,因此数组统计信息的所有元素都为null。 In unity I can't create objects from my own classes ? 在团结中我不能从我自己的类创建对象? Please help.Thanks. 请帮忙。谢谢。
StatsTotal
script: 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
script: 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;
}
}
Simply don't inherit
from MonoBehaviour
in your Stats
class. 只需不要在Stats
类中inherit
MonoBehaviour
。 Use 采用
class Stats {
......
}
not 不
public class Stats : MonoBehaviour
{
}
If you inherit from MonoBehaviour
, you can no longer use the new
keyword to create instance of the script, You must use the Instantiate function. 如果从MonoBehaviour
,则无法再使用new
关键字创建脚本实例,必须使用Instantiate函数。
In addition, your save and load implementation does not look good at-all. 此外,您的保存和加载实现看起来并不好。 Since you have many variables to save, simply convert them into Json
then save with PlayerPrefs
. 由于您要保存许多变量,只需将它们转换为Json
然后使用PlayerPrefs
保存。 To load them, use PlayerPrefs
to load the json data then convert it back into class
. 要加载它们,请使用PlayerPrefs
加载json数据,然后将其转换回class
。
This is what it should look like: 它应该是这样的:
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;
}
}
Usage : 用法 :
//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.