2016-10-25 10 views
0

頭のスクラッチャーのほんの一部です: sqliteで新しいアプリケーションを構築し、すべてのデータベース関数を扱うシングルトンを設定します。情報が入力されると、データベースから追​​加されたリストが使用されるため、テキストフィールドのプレハブを画面に取り込むことができます。これを行うより良い方法がある場合は、私に知らせてください。別の関数からリストを返すのは正しいですが、内容はnullです。Unity3d

From the main script:

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

On the Manager Class:

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

これは、あなたが「新しい」キーワードを使用してMonoBehaviourを作成しようとしている問題

の源であってもよい奇妙なエラーを与えます。これは許可されていません。

私は両方のスクリプトを1つのオブジェクトから継承しています。 この警告は、各入力後に表示されます。誰でもこれを手助けすることができますか? ありがとう!

+1

エラーはどこから来ますか?あなたのコードに**新しい**は表示されません。 –

+0

あなたは 'newOilChange()'メソッドの内容を含めていません。そうしてください。 – Serlite

+0

そしてそのエラーの意味を教えてください。** new **キーワードを使って 'MonoBehaviour'から派生したクラスの新しいインスタンスを作成することはできません。参照を取得したり、新しいインスタンスを作成したり、それぞれのクラスが 'MonoBehaviour'から派生してはならない(例えば、クラスが基本関数を使用する必要がない場合や、シーン内のゲームオブジェクト上に直接存在していてもよい)。 –

答えて

0

MonoBehaviourから継承するクラスをインスタンス化することはできません。このルールは、Unity Game Engineによって適用されます。

この問題にはいくつかの解決策があります。

  • MonoBehaviourから継承しません。 MonoBehaviourの機能を使用しない場合は、その機能を継承しないことを検討してください。 または、もしあなたが相続財産を削除したとしたら、 はまだうまくいきました。
  • ビアエディタnewキーワードを使用している行をコメントアウトしてください。シーンに空のgameObjectを作成し、 MonoBehaviourスクリプトを添付します。すべての関数呼び出しを Start()メソッドに置きます。この方法では、再生モードに入った後で のコードがすべて正しく実行されます(空のgameObjectが でない場合)。コードの実行を完全に制御したい場合は、 の代わりにを使用して のMonoBehaviourスクリプトへの参照を得ることができます。
  • 経由スクリプト:newキーワードを使用している行をコメントアウトしてください。あなたはこのようにそれを行うことができシングルトン部分については

    var emptyGameObject = new GameObject("Empty Game Object"); 
    var script = emptyGameObject.AddComponent<YourClassName>() as YourClassName; 
    script.GetOilChangeInfo(); 
    script.GetOilChangeList(); 
    

更新

限り、すべてのあなたのチームの使用など、あなたが1のみ1インスタンスが安全である DatabaseManager.Instance
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; 
    } 
} 

。しかし、あなたのシングルトンの取り組みをすべて破壊する可能性のある回避策があり、それを防ぐ方法はありません。

// 1000 instances 
for (var i = 1; i <= 1000; i++) { 
    GameObject o = new GameObject("Another game object"); 
    o.AddComponent<DatabaseManager>(); 
} 
+0

一重嫌いが除去されたとき、私はこのエラーを受け取ります:Assets/Scripts/DatabaseManager.cs(109,37):エラーCS0309:タイプ 'DatabaseManager'はUnityEngine.GameObject.AddComponent () ' –

+0

これらの3つのソリューションは独立しています。それらのうちの1つだけを使用してください。すべてではない! –

+0

エディタ:シングルトンモデルを使用しようとしていました。プライベート静的DatabaseManager _instance; \t公開リスト OilChangeList =新しいリスト(); \t公共の静的インスタンスのDatabaseManager \t {\t \t(_INSTANCE == NULL) \t \t \t { \t \t \t \tゲームオブジェクトDBM =新しいゲームオブジェクト( "のDatabaseManager")場合 \t \t { \t \t \tを得ます。 \t \t \t \t DBM.AddComponent (); \t \t \t \t \t \t \t} \t \t \t戻り_INSTANCE。 \t \t} \t}どのようにアドバイスして設定する必要がありますか? –

関連する問題