从另一个函数count返回List是正确的,但是Unity3d的内容是空的
本文关键字:但是 Unity3d 函数 另一个 count 返回 List | 更新日期: 2023-09-27 18:14:49
这有点让人挠头:用sqlite构建一个新应用,设置一个单例来处理所有数据库功能。输入信息后,它使用从数据库中添加的List,以便在屏幕上填充文本字段的预制件。如果有更好的方法,请告诉我。
从主脚本:
public void GetOilChangeInfo()
{
DatabaseManager.Instance.SQLiteInit();
OilChangeList.Clear(); Clear the list
OilChangeList = DatabaseManager.Instance.GetOilChangeList(); Make the list from the database
Debug.Log("How many?" + OilChangeList.Count); //This is correct, I have four entries
for(int i=0; i<OilChangeList.Count; i++)
{
Debug.Log(OilChangeList[i]); //Shows up as 4 nulls
}
}
关于Manager类:
public List<OilChange> GetOilChangeList()
{
Debug.Log("Function Calls!");
mConnection.Open();
mSQLString = "SELECT * FROM " + SQL_TABLE_OIL_CHANGES;
mCommand.CommandText = mSQLString;
mCommand.ExecuteNonQuery();
mReader = mCommand.ExecuteReader();
while (mReader.Read())
{
OilChangeList.Add(newOilChange(mReader.GetString(0),
mReader.GetString(1),
mReader.GetString(2),
mReader.GetString(3),
mReader.GetString(4),
mReader.GetString(5),
mReader.GetString(6),
mReader.GetString(7),
mReader.GetString(8)));
//Debug.Log(mReader.GetString(0) + mReader.GetString(1) + mReader.GetString(2) + mReader.GetString(3) + mReader.GetString(4) + mReader.GetString(5) + mReader.GetString(6) + mReader.GetString(7) + mReader.GetString(8));
}
mReader.Close();
mConnection.Close();
return OilChangeList;
}
这给出了一个奇怪的错误,这可能是问题的根源
您正在尝试使用'new'关键字创建MonoBehaviour。这是不允许的。
我从monobehavior继承了两个脚本。此警告在每个条目之后显示。有人能帮我解决这个问题吗?谢谢!
您不能自己实例化从MonoBehaviour
继承的类。此规则由Unity Game Engine执行。
这个问题有几个解决方案:
-
不继承
MonoBehaviour
。如果您不使用MonoBehaviour
的任何功能,请考虑不要继承它。或者简而言之,如果您删除了继承和代码 -
Via Editor:注释掉您使用
new
关键字的行。在您的场景中创建一个空的gameObject
,并附加您的MonoBehaviour
脚本到它。把所有的函数调用放在一边Start()
方法。这样,所有的代码都能正确执行在您进入播放模式后(如果您的空gameObject
不是)禁用)。如果您希望完全控制代码何时执行你可以用GetComponent<YourClassName>();
来代替MonoBehaviour
脚本的引用。 -
Via Script:注释掉你使用
new
关键字的行var emptyGameObject = new GameObject("Empty Game Object"); var script = emptyGameObject.AddComponent<YourClassName>() as YourClassName; script.GetOilChangeInfo(); script.GetOilChangeList();
对于Singleton部分,您可以这样做。
public List<OilChange> OilChangeList = new List<OilChange>();
private static DatabaseManager _instance;
public static DatabaseManager Instance
{
get
{
if(_instance == null)
{
GameObject DBM = new GameObject("DatabaseManager");
_instance = DBM.AddComponent<DatabaseManager>();
}
return _instance;
}
}
只要你的团队都使用DatabaseManager.Instance
,你只有一个实例是安全的。但是有一种变通方法会毁掉你所有的Singleton努力,而且没有办法阻止它。
// 1000 instances
for (var i = 1; i <= 1000; i++) {
GameObject o = new GameObject("Another game object");
o.AddComponent<DatabaseManager>();
}