Я не знаю, как проще всего объяснить, почему ваш код не работает, но я попробую.
У вас есть два GameObjects:
GameObject A с doDamage
переменной.
GameObject B с doDamage
переменная.
Когда GameObject A сталкивается с GameObject B:
OnCollisionEnter2D
функция .The вызывается GameObject A. if(other.gameObject.tag == "Target" && doDamage)
выполняет, потому что doDamage
- это правда.
В .The doDamage
переменной от GameObject A затем устанавливается на false
.
Это не влияет на переменную doDamage
от GameObject B.
Затем
С .The OnCollisionEnter2D
функция вызывается GameObject B. if(other.gameObject.tag == "Target" && doDamage)
выполняет, потому что doDamage
- это правда.
D .The doDamage
переменной от GameObject B затем устанавливается на false
.
Оба кода повреждения будут работать, потому что doDamage
всегда верно в каждом вызове OnCollisionEnter2D
. То, что вы сейчас делаете, влияет только на переменную doDamage
в каждом отдельное скрипт.
Что вы сейчас делаете:
Установка doDamage
в локальной/этого сценария к false
, а также проверки, если локальный/этотdoDamage
установлен или нет.
Что вам нужно сделать:
Набор doDamage
в сценарии другой к false
но читать местный/это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
Подготовьте различные уровни для игрового объекта. В физических настройках снимите отметку с матрицы столкновений слоев для этих двух слоев. Установите одинаковый слой для обоих объектов и измените слой для одного из них после столкновения. Они больше не будут сталкиваться. Также вы можете просто сменить один из коллайдеров на триггер после столкновения. –