1

C# でさまざまな型のオブジェクトのリストを実装する方法はありますか? いえ

GenericCollection genCol = new GenericCollection();
Class1 c1 = new Class1();
Class1 c2 = new Class2();

genCol.Add(c1);
genCol.Add(c2);

これを Unity3D 3 (Unity3D 4 ではない) で使用しています。コレクションをserializableにする必要があります。 Unity のシリアライズ可能オブジェクトについて説明します。

4

1 に答える 1

1

いいえ、Unity はポリモーフィック シリアライゼーションを直接サポートしていません。

この機能を必要としない代替設計を見つける必要があります。タイプごとに個別のリストを保持することは、1 つのオプションです。

class MyStuff
{
   public List<Class1> Class1List;
   public List<Class2> Class2List;
}

タイプのリストをより簡単に選択するためのラッパー メソッドを作成できます。

List<Type> GetList<Type>()
{
   var type = typeof(Type);
   if (type == typeof(Class1))
     return Class1List;
   else if (type == typeof(Class2))
     return Class2List;
   else
     return null;
}

各アイテムを順番に反復する iterate を書くことができます。これらのプラットフォームでゲームを作成した経験から、GCes (Unity、HTML5 など) を使用したゲームで回避するよう努めるべきであるガベージがイテレータの構築によって作成されるため、これは悪い考えです。

Unity のバージョンの Mono にジェネレーターがあるかどうかは覚えていませんが、ある場合は次のことができます。

IEnumerable<Object> All()
{
   foreach (var i : Class1List)
     yield return i;
   foreach (var i : Class2List)
     yield return i;
}

ジェネレーターがないと、コードは少し見にくくなります (独自の状態を維持する必要があります) が、実行可能です。そのコードは自分で思いつくことができるはずです。ゲームのようなソフト リアルタイム アプリでは、ガベージ コレクターのスパイクが非常に現実的な問題を引き起こす可能性があるため、これがプレイ中に行われることを意図している場合は、ゲームでそのようなアプローチをしないことをお勧めします。

于 2013-07-15T04:36:17.273 に答える