単一でグリッドシステムを作成する最も効率的な方法


7

私は、一体感を得るために小さなタワーの防衛ゲームを作成しています。

最初は、タッチ/マウスクリックをキャプチャし、座標を最も近い整数に丸めることで、グリッドシステムをエミュレートするつもりでした。これは非常に低コストで物を配置するのに適していますが、私は少しAIオタクなので、エージェントがパスファインディングのために検索を実行できるように、より具体的なグリッドを作成することにしました。

このため、ノードのグリッドが必要であり、それらのノードには少しの情報が添付されている必要があります。これを完全にコードで行う方がはるかに良いアイデアでしょうか?または、マップ上の大きなグリッドに実際の立方体を配置することで逃げることができますか?

これは、レイキャストできるので、確かに簡単です。しかし、これを試して、多くのキューブをレンダリングすると、ゲームの速度が大幅に低下します。

私の質問は、おそらく-このように設定されたキューブのロードをレンダリングするのに不必要にコストがかかるのでしょうか?または、立方体の形状の衝突ボリュームをロードするコストは、コードでこれをエミュレートするよりもわずかに高くなりますか?(もしあれば...)

また、副次的な質問として、たとえば200個のキューブをレンダリングしてスムーズにゲームをプレイできるようにする必要がありますか?いくつかのインスタンス化オプションがありませんか?私は物事が自動的にインスタンス化されると思いました。


1
副次的な質問に答える:Unityでの最初の経験では、ゲームに丸い立方体のインスタンスが1000以上あり、問題はありませんでした。
Ali1S232

回答:


6

私はあなたの質問を順不同で攻撃します。これは、あなたが問題を攻撃していると私が思う方法に問題があるためです。

この[キューブ]は、レイキャストできるので確かに簡単ですが、これを試して、多くのキューブがゲームの速度を大幅に低下させることを確認しました。

実行時にこれらのキューブを絶えず作成、変更、破棄しない限り、なぜこれが遅いのかはわかりませんが、それでも200のキューブは団結するための子どもの遊びです(10,000のアイテムが同時に相互作用していると言うと、 Unityに問題が発生する可能性があります。

それらの間でレイキャストするために、世界に物理的な「オブジェクト」を用意する必要はありません。あなたは単にあなたの世界にオブジェクトを持っている必要があります(空のゲームオブジェクト)

私の質問は、おそらく-このように設定されたキューブのロードをレンダリングするのに不必要にコストがかかるのでしょうか?または、立方体の形状の衝突ボリュームをロードするコストは、コードでこれをエミュレートするよりもわずかに高くなりますか?(もしあれば...)

Unityでは、200のキューブ(200のRigidBodiesでも)はそれほど多くありません。コードのエミュレーションに関する部分は、ノードが知る必要があるものに依存します。

また、副次的な質問として、たとえば200個のキューブをレンダリングしてスムーズにゲームをプレイできるようにする必要がありますか?いくつかのインスタンス化オプションがありませんか?私は物事が自動的にインスタンス化されると思いました。

Unityでのインスタンス化は、プレハブシステムに基づいています(基本的には、プレハブシステムを作成してからプレハブを作成し、それを再び使用して、ゲーム/シーンで再び使用します)。

最初は、タッチ/マウスクリックをキャプチャし、座標を最も近い整数に丸めることで、グリッドシステムをエミュレートするつもりでした。これは非常に低コストで物を配置するのに適していますが、私は少しAIオタクなので、エージェントがパスファインディングのために検索を実行できるように、より具体的なグリッドを作成することにしました。

固定グリッドでゲームレベル/シーン全体をマスクできる場合、理論的には標準グリッドトラバーサルを使用できるはずですが、すべての簿記は特に値中心である必要があり、最終的にはこれは行われません非常にクリーン/効率的です。

このため、ノードのグリッドが必要であり、それらのノードには少しの情報が添付されている必要があります。これを完全にコードで行う方がはるかに良いアイデアでしょうか?

はい、いいえ、多分それはあなたがノードに絶対に必要とする情報に依存します(タワーディフェンスゲームのために私が考えることができる最も単純なノードはポイントであり、boolは占有され、boolは到達可能です)

または、マップ上の大きなグリッドに実際の立方体を配置することで逃げることができますか?

なぜこれを行うのですか?エディターで物理的に見ることができるもの以外は価値がないと思います。ゲームを実行するときは、これらのキュードをキューブとして使用して何もしないので、どうしても最初にそれらを用意しておく必要があります。衝突を避けてレンダリングします。あなたが残したのは、空のgameObjectsを持つことであなたがすぐに持つことができる変換です。

Unityでノードを作成する最も簡単な方法は、空のgameObjects(主に位置用)を作成し、必要なすべての変数のスクリプトをそれらに与え、それらすべてのノードを独自のレイヤーに配置することです。

編集(コメントの詳細の要求に応じて):

立方体を作成してその衝突を取り除き、空のゲームオブジェクトを作成するのと同じようにレンダリングしていませんか?

はいといいえ。はい、物理学とレンダリングに関しては同じですが、エンジンの簿記に関しては違います。すべてのfixedUpdate(特に非リリースモードの場合)では、システムはオブジェクトが持つすべてのコンポーネントを、その子についても同じように使用して計算し、それらがアクティブでない場合はそれを破棄します。ですから、非アクティブなコンポーネントを使って何かをやろうとしても、それほど多くはありません。これを十分に掛けると、フレームごとに0.5秒余分になる可能性がありますが、それはおそらくそこまでです。

空のgameObjectsはデフォルトで立方体の形ですか?

いいえ。アプリケーションの観点からすると、空のgameObjectは、何かを変更する、または何も変更しない修飾子と考えてください。空のgameObjectを作成し、それをワールド/シーンの周りに移動してから、回転してスケーリングできますが、子がない場合は何も起こりませんが、変更は記録されます。次に、球体を作成し、それをその空のgameObjectの子にすると、その子はそれらの変更を取得し、親に関して保存された独自の値を持ちますが、物理ロジックの本質では、空のgameObjectは何もありません(サイズ、形状などはありません)が、変換があり、コンポーネントを受け取ることができます。

なぜなら、キューブのグリッドのメリットがなければ、navMeshの基礎になるからです。

ポイントへのあなたの権利。私がグリッドと言うとき、ほとんどの人はボックスを描画し、すべてのボックスを同じ寸法にすることを考えていますが、これらのボックスに物を入れる場合、私たちが本当に気にするのは空間内の点(通常は3Dの中心、しかし、左上の2Dスプライトの場合)、ボックスを取り除き、代わりにそれらのポイントを空間に保持するだけでグリッドがまだある場合、ボックスはありません。

グリッドで行ったポイント/ノードで、お気に入りのパスファインディングアルゴリズムをすべて使用できます。それらの間の距離を計算し、その距離に重みを適用します(dijoksra、およびA *)。エージェントが一度に複数のノードを考慮することを許可し(ファジーロジック)、設定されたグリッドパターンを通じてプレーヤーの動きを追跡し、重みを付けます。対応する一連のルールに対応させ、最も高い重みに基づいてエージェントに応答を選択させます(実行システム)。

グリッドは、プレーヤーが決して見ることができない視覚的な表現です(実際に2Dでこれらのボックスを画面に描画したい場合を除いて、3Dパースペクティブでは、特にカメラが回転できる場合)。

あなたが言ったときの意味を説明できますか?「しかし、すべての帳簿管理はおそらく特に価値中心である必要があり、結局、これは非常にクリーン/効率的ではありません。」

各エージェントがマウスクリックに対して行うのと同じ丸めを行う必要があることを意味します。これは非常に値中心であり、ハードコードされた値の多くの同じクリーンアップ作業を行わなければならず、同じ結果が得られます。実行時と同じようにチェックを実行しますif(X>300){//do something}。しかし、ここに最も近いノード(対角線が必要な場合はそれまで)を見つけ、値を丸める代わりにマウスクリックに同じロジックを使用して、最も近いノードを見つけるためにレイキャストすることができます。 。


この回答をありがとうございました!2つの質問-空のゲームオブジェクトのロードを作成することは、キューブのロードを作成し、それらの衝突とレンダリングプロパティを取り除くことと同じではありませんか?空のgameObjectsはデフォルトで立方体形ですか?なぜなら、キューブのグリッドのメリットがなければ、navMeshの基礎になるからです。また、あなたが言ったときの意味を説明してもらえますか?「しかし、すべての簿記は、特に値中心である必要があり、結局、これは非常にクリーンで効率的ではありません。」再度、感謝します!
サーヤカロット、2012年

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