コードが機能しない理由を説明する最も簡単な方法はわかりませんが、私は試してみます。
ゲームオブジェクトA変数doDamage
と:
次の2つのゲームオブジェクトを持っています。
ゲームオブジェクトBとdoDamage
が可変です。
ゲームオブジェクトBとゲームオブジェクトA衝突
:
を選択図OnCollisionEnter2D
機能をゲームオブジェクトAで呼び出されます。 doDamage
がtrueであるため、 if(other.gameObject.tag == "Target" && doDamage)
が実行されます。 ゲームオブジェクトAから
B選択図doDamage
変数は、次にfalse
に設定されています。
これは、doDamage
の変数GameObject Bには影響しません。
そして
C選択図OnCollisionEnter2D
機能ゲームオブジェクトBで呼び出されます。 doDamage
がtrueであるため、 if(other.gameObject.tag == "Target" && doDamage)
が実行されます。 ゲームオブジェクトBから
D選択図doDamage
変数は、次にfalse
に設定されています。
それぞれOnCollisionEnter2D
コールでdoDamage
が常にtrueであるため、被害コードが両方とも実行されます。あなたが現在行っていることは、それぞれ個の個の変数にのみ影響しています。スクリプト。あなたが現在をやっている
は:
も地元の場合はチェックしながらfalse
にローカル/このスクリプトでdoDamage
を設定
/このdoDamage
を設定したり、されていません。 false
に他スクリプトで
設定doDamage
それが設定されているかどうか確認するために/このdoDamage
地元を読む:
あなたがを行うために必要なもの
。一度コードのスニペットを実行したい場合は、あなたのコードをトリガーするコールバックイベントにコードを直接実行
public class DamageStatus : MonoBehaviour
{
bool detectedBefore = false;
void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Target"))
{
//Exit if we have already done some damage
if (detectedBefore)
{
return;
}
//Set the other detectedBefore variable to true
DamageStatus dmStat = other.gameObject.GetComponent<DamageStatus>();
if (dmStat)
{
dmStat.detectedBefore = true;
}
// Put damage/or code to run once below
}
}
void OnCollisionExit2D(Collision2D other)
{
if (other.gameObject.tag == "Target")
{
//Reset on exit?
detectedBefore = false;
}
}
}
あなたは全体の衝突が一度だけ起こるべきであることを意味します、そして、このオブジェクトは衝突者のように振る舞うべきですか? –
私は全体の衝突が一度だけ起こることを望みます。 – Abdou023
ゲームオブジェクトのさまざまなレイヤーを準備します。物理設定では、これらの2つのレイヤのレイヤコリジョンマトリックスのチェックを外します。衝突後に、両方のオブジェクトに同じレイヤーを設定し、いずれかのレイヤーを変更します。彼らはもはや衝突しません。また、衝突後に衝突者の1人をトリガに変えることもできます。 –