私はさまざまなnpcsを持っています。それらはすべて異なるプロパティと異なるAIを持っているので、私は各タイプごとに別のクラスを作り、それを基本クラスのEntityから派生させました。私はEntityの各タイプにIDを割り当てることができるようにしたいので、CreateNewEntity(int id、Vector2 position)を呼び出すことができます。どうすればいい?私はまた、これをひどく設計していると感じています。それは本当ですかIDベースのNPCシステム
答えて
あなたがこれを行うことができますいくつかの方法があります。 タイプIDに などのメタデータを与える属性を作成できます。
public class RenderableEntity{
}
[EntityTypeAttribute(Name = "Wizard"]
public class Wizard : RenderableEntity{
}
擬似次のようにあなたがして名前空間または論理コンテナでそれらすべてをバンドルし、タイプを作成することができます。
//Create Entity
//Type Name
string entityName = "Wizard";
//Get the Type
from the namespace where the type has the custom attribute applied to it. Get the type
//Activator.Create(typeof(TheWizardType))
を他のはあなただけの名前が一致するタイプを得ることができるということですあなたがcreateメソッドに渡した文字列
この場合、属性の追加値はいくらですか?属性は、リフレクションを使用して型のメタデータを照会する場合にのみ考慮されます。これは高価な操作と見なされますが、なぜこの場合には必要ですか? –
属性の使用は、単に問題に対する実行可能な解決策を示すことに過ぎず、この問題に対する多くの解決策があります。 この属性には、実行時に作成できるエンティティのタイプとして識別される他のプロパティが含まれている場合があります。 –
基本エンティティから継承するのは良いアプローチのように聞こえます。すべてのオブジェクト間で共有されているものはベースエンティティに存在し、NPCの各タイプに固有のものはすべて自分のクラスに属している必要があります。同じ目的を持ちますが、AIやCreateNewEntityなどの実装が異なるものは、仮想とマークする必要があります。そのため、メソッドは基本エンティティのリストから呼び出すことができますが、正しい実装が実行されます。 CreateNewEntityはおそらくコンストラクタであるべきです。
例:
public class Entity
{
public int Id { get; protected set; }
public Vector2 Position { get; protected set; }
public int Strength { get; protected set; }
public Entity(int id, Vector2 position)
{
Id = id;
Position = position;
Strength = 1;
}
public virtual RunAI()
{
Position.X = Position.X + 1;
}
}
public class SuperHero
{
public SuperHero(int id, Vector2 position) : base (id, position)
{
Strength = 20;
}
public override void RunAI()
{
Position.X = Position.X + 500;
}
}
ここで何をしているのですか?私はIDがオブジェクトのタイプを参照するようにします。 IDが1のエンティティを作成するたびに、スーパーヒーローが作成され、2スパイダーになります。 – Raj
ここは有益であろうFlyweightパターンのように聞こえる:http://www.primos.com.au/primos/Default.aspx?PageContentID=27&tabid=65
はおそらく、各エンティティが違うのコア状態を区別して、共有インスタンスで可能な限り載せていきたいと思います。
- 1. NPC in Array path
- 2. ゲームNPCマルチアクションluaスクリプトデザイン
- 3. Asp.NetベースのオープンソースのERPシステム
- 4. Javaベースのユーザーアカウント管理システム
- 5. postgresql社のIDベースのシーケンス
- 6. WebベースのPOSシステムの作成
- 7. オープンソースの.NETベースのユーザー管理システム?
- 8. Redisベースの通知システムの問題
- 9. IDでシステムのオペレーティングシステムを確認
- 10. WindowsとsprintfのUnixベースのシステムでの丸めの違い
- 11. TCP/IPベースのシステムのスケーリングと高可用性の確保
- 12. エンタープライズ大規模なWebベースのシステムのPython/Django?
- 13. 組み込みARMベースのLinuxシステム用のクロスコンパイル
- 14. Linuxベースのシステム向けのOSI TP4実装
- 15. PHPどのように動的に出席ベースのシステム
- 16. Webベースの給与計算システムの作成
- 17. .netとvisual Studioで使用するWebベースのバージョン管理システム
- 18. バグトラッカーではない投票ベースの機能/製品要求システム
- 19. "組み込みLinuxベース"と呼ぶシステムはどれですか?
- 20. Hashtbl.hashへの物理的なIDベースの代替
- 21. サービスベースのシステムでのセッション(トラッキング)IDの設計パターン?
- 22. Javaテキストベースのゲームのシリアル番号ベースの保存システムを作成するには?
- 23. SQLベースのインベントリ/サンプル管理システムを作成するためのリソース
- 24. Flexで一意のシステムIDを取得する
- 25. ASP.NET MVC5のApplicationUserクラスをさらに拡張するIDシステム
- 26. Linuxでシステム全体の固有IDを生成する方法
- 27. branch.ioを使用する紹介システムのデバイスID
- 28. Linuxシステム上のLinuxシステム
- 29. PHPベースのWebアプリケーションからkiosk id readerデータにアクセスするには
- 30. WindowsとUnixベースのシステムでコンパイルするためのコードベースを準備する方法
一般に、プロパティとビヘイビアの設定では、継承は適切なオプションではありません。その代わりに、集約をモデリングするより良い方法です。私はあなたに良い言及をしていないので、私はコメントを投稿しています。 "ゲーム開発の継承対集約"を探してみてください – renatopp