从另一个函数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继承了两个脚本。此警告在每个条目之后显示。有人能帮我解决这个问题吗?谢谢!

从另一个函数count返回List是正确的,但是Unity3d的内容是空的

您不能自己实例化从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>(); 
}