昨夜私はC-Sharpプロジェクトで、GameObjectsが互いに衝突するようにコーディングしようとしていました。私は、異なる武器(クラブ、剣、斧など)によって分解される可能性のあるさまざまなゲートタイプ(たとえば、木、石、金属)が必要でした。Unity - enumプロパティを使用してオブジェクトが衝突するのを検出する
GateManagerの衝突を検出するために、私は各ゲートにタグを使用していました。したがって、たとえば:
void OnTriggerEnter(Collider collider) {
switch (gameObject.tag) {
case "WoodenGate":
...
case "StoneGate":
...
上記のコードは正確ではありませんが、アイデアを与える必要があります。各ゲートタイプを異なるタグとして設定するのは間違っていました(ゲートタイプごとに異なるタグがあり、すべてのマテリアルタイプに異なるタグがある場合は、何百ものタグが使用されます)。
私は別の方法を思いついた。私はGateTypeのenumを設定し、3つの値(WoodenGate、StoneGate、MetalGate)を作成しました。その後、公開GateTypeプロパティをGateManagerクラスにアタッチしました。これにより、「インスペクタ」ウインドウ内の各プレハブに関連する列挙型を選択することができました。とても素敵で、本当に嬉しかったです。
問題が発生しました。リストの途中に4番目の列挙型を追加しました(GlassGateなど)。列挙型は単純にint型の値なので、3番目のアイテムはMetalGateでなくStoneGateになりました。これは、メタルゲートのプレハブが突然Gategate of stonegateを持っていることを意味していました。それは私のゲームを壊した。
ご迷惑をおかけして申し訳ありませんが、私の質問では、さまざまな種類の商品をたくさんラベル付けして識別するにはどうすればよいですか?私はタグを使用したくないので(私はあまりにも多くを必要とするだろうから)、私は列挙体を使用したくない(単一性検査官と一緒に使用すると壊れやすい問題を形成するので)。
多くのゲームの共通の要件(例えば、ゲームではさまざまなゲームオブジェクトのたくさんのもので異なるリソースを集めるためにあなたのピッカックスを使用することができます)を使用してベストプラクティスを疑問に思っているのですか?
各ゲートタイプでどのようなやり取りをしていますか? GateManagerスクリプトにすべてのロジックを用意するのではなく、それぞれが反応を指示するMonoBehaviourクラスのセットを作成し、必要に応じて各ゲートにアタッチし、ゲートとの衝突時に盲目的に呼び出すことができますか? (同じクラスから継承して、同じインタフェースを実装して簡単に呼び出すことができます。) – Serlite
ロジックは、単にゲートと衝突する武器が十分高いレベルであれば、ゲートをアクティブにしないでくださいそれを破壊する)。だから剣は木製の門を破壊することができますが、金属の門は破壊することはできません。だから、非常にシンプルなロジックは、実際には複数のクラスを持つことはおそらく過剰ですか? –
その場合、各オブジェクト(またはそれが構成するマテリアル)に強さの値を割り当てるだけでなく、各武器に対応する強さを割り当てるのはなぜですか?次に、衝突時の2つの値を比較します。すべての種類のゲートについてenumを作成しなければならない場合、あらゆる種類のバリケード/家具アイテム/ブロック/ etc ...は、プロジェクトが成長するにつれてますます多くの列挙値になります。 – Serlite