私はさまざまな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. Asp.NetベースのオープンソースのERPシステム
- 3. Javaベースのユーザーアカウント管理システム
- 4. チャットボットfor XMPPベースのUCシステム
- 5. ゲームNPCマルチアクションluaスクリプトデザイン
- 6. NPCアニメ次のプレイヤーユニティ2dトップダウン
- 7. 外部IDシステム
- 8. SISOシステムID
- 9. Redisベースの通知システムの問題
- 10. WebベースのPOSシステムの作成
- 11. オープンソースの.NETベースのユーザー管理システム?
- 12. Spritekit NPCクエストとスクリプト全般
- 13. postgresql社のIDベースのシーケンス
- 14. Unity 3D:C#NPC互いに衝突する
- 15. IDでシステムのオペレーティングシステムを確認
- 16. WindowsとsprintfのUnixベースのシステムでの丸めの違い
- 17. SMPベースのLinuxシステムで別のCPUの "current_task"ポインタにアクセス
- 18. TCP/IPベースのシステムのスケーリングと高可用性の確保
- 19. PHPどのように動的に出席ベースのシステム
- 20. エンタープライズ大規模なWebベースのシステムのPython/Django?
- 21. 組み込みARMベースのLinuxシステム用のクロスコンパイル
- 22. Linuxベースのシステム向けのOSI TP4実装
- 23. Webベースの給与計算システムの作成
- 24. バグトラッカーではない投票ベースの機能/製品要求システム
- 25. .netとvisual Studioで使用するWebベースのバージョン管理システム
- 26. Yoctoベースのシステムにhostコマンドをインストールする方法
- 27. MacシステムでWindowsベースのポップアップを操作する方法
- 28. NPCはプレイヤーの一定の距離で止まらない
- 29. IBM 4690オペレーティング・システムはLinuxカーネルをベースにしています
- 30. "組み込みLinuxベース"と呼ぶシステムはどれですか?
一般に、プロパティとビヘイビアの設定では、継承は適切なオプションではありません。その代わりに、集約をモデリングするより良い方法です。私はあなたに良い言及をしていないので、私はコメントを投稿しています。 "ゲーム開発の継承対集約"を探してみてください – renatopp