Ich weiß nicht, der einfachste Weg zu erklären, warum Ihr Code nicht funktioniert, aber ich werde es versuchen.
Sie haben zwei Gameobjects:
Gameobject A mit doDamage
variabel.
GameObject B mit doDamage
Variable.
Wenn Gameobject A kollidiert mit Gameobject B:
A .Die OnCollisionEnter2D
Funktion Gameobject A genannt wird. if(other.gameObject.tag == "Target" && doDamage)
wird ausgeführt, weil doDamage
wahr ist.
B .Die doDamage
Variable aus Gameobject A wird dann auf false
eingestellt.
Die doDamage
-Variable von GameObject B wird nicht beeinflusst.
Dann
C .Die OnCollisionEnter2D
Funktion wird aufgerufen, auf Gameobject B. if(other.gameObject.tag == "Target" && doDamage)
wird ausgeführt, weil doDamage
wahr ist.
D .Der doDamage
Variable von Gameobject B wird dann auf false
eingestellt.
Ihr beider Schadenscode wird ausgeführt, weil doDamage
in jedem OnCollisionEnter2D
Aufruf immer wahr ist. Was Sie gerade tun, betrifft nur die doDamage
Variable in jedem einzelnen Skript.
Was Sie derzeit tun:
Einstellung doDamage
im local/dieses Skript false
während auch wenn local/diese Überprüfung doDamage
wird oder nicht.
Was brauchen Sie zu tun:
Set doDamage
im anderen Skript false
aber lesen Sie die local/diesedoDamage
zu überprüfen, ob es gesetzt ist oder nicht.
Dies ist, wie es aussehen soll:
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;
}
}
}
meinst du, dass die ganze Kollision nur einmal passieren sollte und beim zweiten Mal sollten sich diese Objekte wie ohne Collider verhalten oder du willst nur Schaden kontrollieren? –
Ich möchte die ganze Kollision nur einmal passieren. – Abdou023
Bereiten Sie verschiedene Ebenen für Ihr Spielobjekt vor. In den physikalischen Einstellungen deaktivieren Sie die Layer-Kollisionsmatrix für diese beiden Ebenen. Legen Sie für beide Objekte denselben Layer fest und ändern Sie den Layer für eines der Objekte nach der Kollision. Sie werden nicht mehr kollidieren. Sie können auch einen der Collider nach einer Kollision in einen Trigger umwandeln. –