タグ付けされた質問 「c#」

C#は、Microsoftが.NETプラットフォームと組み合わせて作成した、マルチパラダイムで管理され、強く型付けされ、ガベージコレクションされたプログラミング言語です。

3
コンポーネントベースのエンティティシステムでメッセージ処理を適切に実装する方法は?
エンティティシステムのバリアントを実装しています。 Entityクラス IDより少しであることが結合コンポーネント一緒に 「コンポーネントロジック」がなく、データのみを持つコンポーネントクラスの束 多数のシステムクラス(別名「サブシステム」、「マネージャー」)。これらはすべてのエンティティロジック処理を行います。ほとんどの基本的な場合、システムは、関心のあるエンティティのリストを反復処理し、各エンティティに対してアクションを実行するだけです。 MessageChannelクラスオブジェクトのすべてのゲームシステムで共有されています。各システムは、特定のタイプのメッセージをサブスクライブしてリッスンし、チャネルを使用して他のシステムにメッセージをブロードキャストすることもできます システムメッセージ処理の最初のバリアントは、次のようなものでした。 各ゲームシステムで順次更新を実行する システムがコンポーネントに対して何かを実行し、そのアクションが他のシステムにとって重要である場合、システムは適切なメッセージを送信します(たとえば、システム呼び出し messageChannel.Broadcast(new EntityMovedMessage(entity, oldPosition, newPosition)) エンティティが移動されるたびに) 特定のメッセージをサブスクライブした各システムは、そのメッセージ処理メソッドを取得します システムがイベントを処理しており、イベント処理ロジックで別のメッセージをブロードキャストする必要がある場合、メッセージはすぐにブロードキャストされ、メッセージ処理メソッドの別のチェーンが呼び出されます このバリアントは、衝突検出システムの最適化を開始するまでは問題ありませんでした(エンティティの数が増えると、本当に遅くなりました)。最初は、単純なブルートフォースアルゴリズムを使用して各エンティティペアを繰り返します。次に、特定のセルの領域内にあるエンティティを格納するセルのグリッドを持つ「空間インデックス」を追加しました。これにより、隣接セルのエンティティのみをチェックできます。 エンティティが移動するたびに、衝突システムはエンティティが新しい位置にあるものと衝突しているかどうかを確認します。そうである場合、衝突が検出されます。衝突するエンティティが両方とも「物理オブジェクト」である場合(両方にRigidBodyコンポーネントがあり、同じスペースを占有しないように互いを押しのけようとしている場合)、専用の剛体分離システムがエンティティを移動するように移動システムに要求しますそれらを分離する特定の位置。これにより、移動システムは変更されたエンティティの位置を通知するメッセージを送信します。衝突検出システムは、空間インデックスを更新する必要があるため、反応するように設計されています。 場合によっては、セルの内容(C#のEntityオブジェクトの汎用リスト)が繰り返し処理されている間に変更され、イテレーターによって例外がスローされるため、問題が発生します。 だから... 衝突をチェックしている間に衝突システムが中断されるのを防ぐにはどうすればよいですか? もちろん、セルの内容が正しく繰り返されることを保証する「巧妙な」/「トリッキーな」ロジックを追加することもできますが、問題は衝突システム自体にあるのではないと思います(他のシステムにも同様の問題がありました)メッセージはシステムからシステムへ移動するときに処理されます。私が必要とするのは、特定のイベント処理メソッドが中断することなく仕事を確実に行うための何らかの方法です。 私が試したもの: 着信メッセージキュー。あるシステムがメッセージをブロードキャストするたびに、そのメッセージは関心のあるシステムのメッセージキューに追加されます。これらのメッセージは、システム更新が各フレームで呼び出されると処理されます。問題:システムAがシステムBのキューにメッセージを追加する場合、システムBがシステムAよりも後(同じゲームフレーム内)に更新される場合、それはうまく機能します。それ以外の場合、メッセージが次のゲームフレームを処理します(一部のシステムでは望ましくありません) 発信メッセージキュー。システムがイベントを処理している間、システムがブロードキャストするメッセージは送信メッセージキューに追加されます。メッセージは、システムの更新が処理されるのを待つ必要はありません。最初のメッセージハンドラが処理を完了した後、「すぐに」処理されます。メッセージの処理によって他のメッセージがブロードキャストされる場合、それらも発信キューに追加されるため、すべてのメッセージが同じフレームで処理されます。問題:エンティティライフタイムシステム(システムでエンティティライフタイム管理を実装)がエンティティを作成した場合、いくつかのシステムAとBに通知します。システムAがメッセージを処理している間、メッセージチェーンが発生し、最終的に作成されたエンティティが破棄されます(たとえば、弾丸エンティティが障害物と衝突する場所で作成され、弾丸が自己破壊します)。メッセージチェーンが解決されている間、システムBはエンティティ作成メッセージを取得しません。したがって、システムBがエンティティ破壊メッセージにも関心がある場合、システムBはそれを取得し、「チェーン」の解決が完了した後にのみ、最初のエンティティ作成メッセージを取得します。これにより、破棄メッセージは無視され、作成メッセージは「受け入れられます」、 編集-質問への回答、コメント: 衝突システムがセルの内容を繰り返し処理している間、誰がセルの内容を変更しますか? 衝突システムが一部のエンティティとその近隣で衝突チェックを行っている間、衝突が検出される可能性があり、エンティティシステムは他のシステムがすぐに反応するメッセージを送信します。メッセージに対する反応により、他のメッセージが作成され、すぐに処理される場合があります。そのため、他のシステムは、以前の衝突チェックがまだ終了していない場合でも、衝突システムがすぐに処理する必要があるメッセージを作成する場合があります(たとえば、衝突システムが空間インデックスを更新する必要があるため、エンティティを移動します)。 グローバルな送信メッセージキューを使用できませんか? 最近、単一のグローバルキューを試しました。新しい問題を引き起こします。問題:タンクエンティティを壁エンティティに移動します(タンクはキーボードで制御されます)。それからタンクの方向を変えることにしました。タンクと壁を各フレームに分離するために、CollidingRigidBodySeparationSystemはタンクを壁から可能な限り最小の距離だけ移動します。分離方向は、戦車の移動方向の反対方向でなければなりません(ゲームの描画が開始されると、戦車は壁に移動したことがないように見えるはずです)。しかし、方向はNEW方向とは逆になり、タンクを壁の最初とは異なる側に移動します。問題が発生する理由:これがメッセージの処理方法です(簡略化されたコード): public void Update(int deltaTime) { m_messageQueue.Enqueue(new TimePassedMessage(deltaTime)); while (m_messageQueue.Count > 0) { Message message = m_messageQueue.Dequeue(); this.Broadcast(message); } } private …

6
潜在的に無限の2Dマップデータを保存する方法は?
現在、100 x 100タイルのチャンクを処理できる2Dプラットフォーマーがあり、チャンク座標はlongとして格納されているため、これがマップの唯一の制限です(maxlong * maxlong)。エンティティの位置などはすべてチャンク関連であるため、制限はありません。 私が抱えている問題は、何千ものファイルを持たずにこれらのチャンクを保存してアクセスする方法です。すぐにすべてを開く必要のない、できればすばやく低コストのアーカイブ形式のアイデアはありますか?
29 xna  2d  c#  maps  platformer 

1
モデルをターゲットに向ける
2つのオブジェクト(ターゲットとプレーヤー)があり、両方に位置(Vector3)と回転(四元数)があります。ターゲットを回転させて、プレイヤーの真正面に向けたいです。ターゲットは、何かを撃ったとき、プレイヤーを正しく撃ちます。 私はプレイヤーに強打の多くの例を見てきましたが、増分回転は望ましくありません、私は強打を100%にすることができ、実際に機能する限り、それは大丈夫だと思います。 参考までに、位置と回転を使用して他の多くのことを行うことはできません。この最後の作品を除いて、すべてうまくいきません。 コードサンプルは、Targetのクラスで実行されます。Position=ターゲットの位置、Avatar =プレーヤー。 編集 私は今、彼が提供したMaikのc#コードを使用しており、うまく機能しています!
28 xna  c#  3d  models  quaternion 

10
Pongでは、パドルから跳ね返ったボールの方向をどのように計算しますか?
ゲーム開発におけるこの非常にHello World-yの問題を回避しようとしています。XNAでTicTacToeゲームを作成したので、次のステップはBreakoutクローンになると思います。 ゲームプログラミングについての知識も、どこにどの数学を適用すべきかも知らないことを覚えておいてください。それが私がこの質問をしている理由です。 質問:画面の下部にあるパドルに当たったときにボールが跳ね返る場所を判断するにはどうすればよいですか? 私はそれが次のようなものになると想像します: 入ってくるボールから速度と角度をキャプチャします。 バーに触れた場所(左端、右端、中央)を検出し、それに従って外側の領域に触れた場合により高速になります。 これは私が立ち往生しているところです。へへ。 洞察はありますか?これは単純な回答タイプの質問ではありませんが、ある時点で誰もが直面するものであると確信しています。 このウェブサイトで推奨されている「線形代数」という本を読んでいますが、ここで適用すべきかどうかはまだわかりません。
28 xna  c#  2d  mathematics  physics 

2
Unityで正しく線を引く方法
私は、より正式に言われている単一のポイントから数本の線を引く必要があるゲームに取り組んでいます 座標がx、yの点Aが与えられた場合、i行目にxi、yiという名前の座標があるn本の線を描画します。Unity3D内のLineRenderer機能を考えると、ポリラインのみをレンダリングするため、特定のポイントから複数のラインを描画できませんでした。 現在、行を正常にレンダリングするDebug.DrawLine()メソッドを使用しています。Unityの例に示されているGL.Begin()を使用してみましたが、線が描画されているのが見えません。 私の質問は、これを行う他の方法はありますか?そうでない場合、再生モード内でDebug.DrawLine()で描画されている線を表示する方法を教えてください。私はGizmos.DrawLine()を使用できることを見てきましたが、その使用法をよく理解していませんでした。
27 c#  unity 

3
チームはソースファイルの上書きをどのように防止しますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Game Development Stack Exchangeで話題になるようにします。 4年前に閉鎖されました。 たとえば、ゲームエンジンなどが複数の人によって同時に処理されているときに、上書きをどのように防ぐことができるのか、ということが起こりました。 開発者1が作業してAudio.cppおり、開発者2も作業をしているとしましょう。Audio.cppこれは、一般的に大規模なチームで上書きに対処するためにどのように管理されていますか?(つまり、開発者2がファイルを開くのを停止して、開発者1が終了するまで)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

1
新しいオブジェクトを即座にインスタンス化するのではなく、オブジェクトプールの作成と使用を常に検討する必要があるのはなぜですか?
このパターンについて何度か読みました(ベストプラクティスの観点から)。 メモリ割り当て:新しいオブジェクトを即座にインスタンス化する代わりに、オブジェクトプールの作成と使用を常に検討してください。メモリの断片化を減らし、ガベージコレクタの動作を減らすのに役立ちます。 ただし、実際に何を意味するのかわかりません。どうすれば実装できますか? たとえば、Unity GameObjectのInstantiateメソッドを使用してをインスタンス化できますか? Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity); この使用は推奨されませんか?他に何を意味できますか?

3
より高速な正弦関数はありますか?
ジェネレーション3d perlinノイズに取り組んでいます。C#Mathライブラリは、ほとんどの関数が二重の精度を使用しているため、私が必要とするものに対してはやり過ぎのようです。いくつかの場所でMath.Sin()を使用してノイズを生成します。誰もがより高速な正弦関数を知っていますか?
25 xna  c#  mathematics 

4
Visual Editorを最小限/使用せずにUnityでゲームをビルドするにはどうすればよいですか?
完全にC#でゲームを作成したいと思います。エンジンを検索したところ、Unity3Dが見つかりましたが、チュートリアルとドキュメントはすべて、ビジュアルエディターと、クリックしてポイントしてシーンやスクリプトを作成するUnity IDEについて説明しています。 私はそれをしたくありません。デザイナーが私から離れて物事を抽象化するよりも、完全なコードカバレッジを好む。純粋なC#コードをゼロから作成するか、必要に応じてUnityスクリプトを追加としてのみ作成したいと思います。そうすることについての説明や文書が見つかりませんでした。Unityを使用してビジュアルエディターを最小限(またはまったく)使用せずにゲームを構築するにはどうすればよいですか?
24 c#  unity 

7
Unityでタイトなスクリプトカップリングを回避するにはどうすればよいですか?
しばらく前に、Unityの使用を開始しましたが、依然として密結合スクリプトの問題に苦労しています。この問題を回避するためにコードをどのように構成できますか? 例えば: 健康と死のシステムを別々のスクリプトに入れたいです。また、プレイヤーキャラクターの移動方法を変更できるさまざまな交換可能なウォーキングスクリプトが必要です(マリオのような物理ベースの慣性コントロールと、スーパーミートボーイのようなタイトでぴくぴくしたコントロール)。ヘルススクリプトは、プレイヤーのヘルスが0に達したときにDie()メソッドをトリガーできるように、デススクリプトへの参照を保持する必要があります。デススクリプトは、使用中のウォーキングスクリプトへの参照を保持して、ゾンビにうんざりしている)。 私は考え、通常のように、インターフェースを作成しIWalking、IHealthそしてIDeath私は自分のコードの残りの部分を壊すことなく、気まぐれで、これらの要素を変更することができるように、。たとえば、プレーヤーオブジェクトの個別のスクリプトでセットアップしますPlayerScriptDependancyInjector。おそらく、そのスクリプトにはpublic IWalking、IHealthおよびIDeath属性があり、適切なスクリプトをドラッグアンドドロップすることで、レベルデザイナがインスペクタから依存関係を設定できます。 これにより、ゲームオブジェクトにビヘイビアを簡単に追加でき、ハードコードされた依存関係を心配する必要がなくなります。 Unityの問題 問題はユニティで、私はインスペクタでインタフェースを公開することができないということである、と私は私自身の検査官を書いた場合、参照が連載を取得文句を言わない、そしてそれは、不必要な多くの作業です。だからこそ、密結合されたコードを書くしかありません。私のDeathスクリプトは、スクリプトへの参照を公開していInertiveWalkingます。しかし、プレイヤーキャラクターにきめ細かく制御させたい場合、TightWalkingスクリプトをドラッグアンドドロップすることはできませんDeath。スクリプトを変更する必要があります。ひどい。対処できますが、このようなことをするたびに魂が泣きます。 Unityのインターフェイスの代替として望ましいものは何ですか?この問題を修正するにはどうすればよいですか?私はこれを見つけましたが、すでに知っていることを教えてくれ、Unityでそれを行う方法を教えてくれません!これも、どのように行うべきかを説明するものであり、方法ではなく、スクリプト間の密結合の問題に対処するものではありません。 全体として、ゲームデザインのバックグラウンドを持ってUnityに来た人のために書かれたものだと感じています。Unityには通常の開発者向けのリソースはほとんどありません。Unityでコードを構造化する標準的な方法はありますか、それとも独自の方法を見つけ出す必要がありますか?
24 c#  unity  scripting 

7
マルチスレッド2D重力計算
私は宇宙探査ゲームを構築しており、現在重力に取り組んでいます(XNAを使用したC#で)。 重力はまだ調整が必要ですが、それを行う前に、物理計算でパフォーマンスの問題に対処する必要があります。 これは100個のオブジェクトを使用しており、通常、物理計算なしで1000個のオブジェクトをレンダリングすると300 FPS(私のFPSキャップ)をはるかに超えますが、10個以上のオブジェクトがゲーム(および実行される単一スレッド)を物理計算を行う際のひざ。 スレッドの使用状況を確認したところ、最初のスレッドはすべての作業から自分自身を殺していたため、別のスレッドで物理計算を行う必要があると考えました。ただし、別のスレッドでGravity.csクラスのUpdateメソッドを実行しようとすると、GravityのUpdateメソッドに何も含まれていなくても、ゲームはまだ2 FPSになります。 Gravity.cs public void Update() { foreach (KeyValuePair<string, Entity> e in entityEngine.Entities) { Vector2 Force = new Vector2(); foreach (KeyValuePair<string, Entity> e2 in entityEngine.Entities) { if (e2.Key != e.Key) { float distance = Vector2.Distance(entityEngine.Entities[e.Key].Position, entityEngine.Entities[e2.Key].Position); if (distance > (entityEngine.Entities[e.Key].Texture.Width / 2 + entityEngine.Entities[e2.Key].Texture.Width / 2)) …

3
UnityEngine.RandomとSystem.Randomの違いは何ですか?
これの違いは何ですか int randomNumber = UnityEngine.Random.Range(0, 10); この // on top of the class private System.Random _rnd = new System.Random(); // inside a methode of the same class int randomNumber = _rnd.Next(0, 10); 私System.Randomは常にあなたのクラスのトップで初期化されなければならないことを知ってUnityEngine.Randomいます。またSystem.Random、インターン「クロック」で動作し、「ランダム」な数値がそれに基づいていることも知っています。 私の質問は、Unityプロジェクトに使用するのがより良いと魔女のコードの間に他の違いがUnityEngine.RandomありSystem.Randomますか?
24 unity  c#  random 

3
ゲーム全体の変数を保存する最良の方法
難易度、解像度、フルスクリーンなどのオプション画面がありますが、実行時にこれらの変数を保存/取得する「最良の」方法を見つけるのに苦労しています。 現在、私Constantsはすべてを含むクラスを実装しましたGameOption列挙型が、これらのオプションすべてのデフォルトを選択するにはどうすればよいですか?また、現在選択されている列挙型を取得するにはどうすればよいですか? 解像度に関しては、具体的には、値を保存することにしましたが、デフォルト値または現在保存されている値を取得する方法がわかりません。どの方向も素晴らしいでしょう。ありがとう!:) namespace V1.test.RPG { public class GameOptions { public enum Difficulty { EASY, MEDIUM, HARD } public enum Sound { ON, QUIET, OFF } public enum Music { ON, QUIET, OFF } public enum ResolutionWidth { SMALL = 1280, MEDIUM = 1366, LARGE = 1920, WIDESCREEN = 2560 …
23 c#  2d 

6
ユーザーフレンドリーでありながら柔軟なコンポーネントベースのエンティティシステムにはどのような設計がありますか?
私はしばらくの間、コンポーネントベースのエンティティシステムに興味があり、その上で数え切れないほどの記事を読んでいます(Insomiacゲーム、かなり標準的なEvolve Your Hierarchy、T-Machine、Chronoclast ...など)。 それらはすべて、次のようなものの外側に構造を持っているようです。 Entity e = Entity.Create(); e.AddComponent(RenderComponent, ...); //do lots of stuff e.GetComponent<PositionComponent>(...).SetPos(4, 5, 6); そして、共有データのアイデアを取り入れると(これは、どこでもデータを複製しないという点で、これまで見た中で最高の設計です) e.GetProperty<string>("Name").Value = "blah"; はい、これは非常に効率的です。ただし、読み取りまたは書き込みが最も簡単なわけではありません。それはとても不格好で、あなたに対して働いているように感じます。 私は個人的に次のようなことをしたいと思います: e.SetPosition(4, 5, 6); e.Name = "Blah"; もちろん、この種の設計に到達する唯一の方法は、Entity-> NPC-> Enemy-> FlyingEnemy-> FlyingEnemyWithAHatOnのような階層に戻ることですが、この設計は回避しようとします。 この種のコンポーネントシステムの設計を見たことがありますが、これはまだ柔軟性がありますが、ユーザーフレンドリーなレベルを維持していますか?それに、データストレージ(おそらく最も難しい問題)を良い方法で回避できますか? ユーザーフレンドリーでありながら柔軟なコンポーネントベースのエンティティシステムにはどのような設計がありますか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.