Проблема, с которой вы столкнулись, может быть связана с тем, что методы `InteractInput()` и `DetectObject()` вызываются дважды в вашем условии `if`. Это значит, что, если их возвращаемые значения изменяются между вызовами, то условие может срабатывать некорректно.
На первом этапе, если `InteractInput()` будет возвращать `true` в первый вызов, а затем вернет `false` во второй (или наоборот), то окончательный результат `if` будет зависеть от порядка вызовов. Для исправления этого поведения следует сохранить результаты вызовов этих методов в переменные, чтобы вызывать каждый из них только один раз.
Вот как можно оптимизировать ваш код:
```csharp
void Update()
{
bool interactInput = InteractInput();
bool detectObject = DetectObject();
if (interactInput && detectObject)
{
Debug.Log("InteractInput: " + interactInput + ", DetectObject: " + detectObject);
EveryInteract(detectedObject);
detectedObject = null;
}
}
bool InteractInput()
{
return canBeInteraction && Input.GetKeyDown(KeyCode.Z);
}
bool DetectObject()
{
Collider2D obj = Physics2D.OverlapCircle(detectionPoint.position, detectionRadius, detectionLayer);
if (obj == null)
{
detectedObject = null;
return false;
}
else
{
detectedObject = obj.gameObject;
return true;
}
}
```
### Изменения в коде:
1. **Кэширование результатов**: Добавлены переменные `interactInput` и `detectObject`, чтобы сохранить результаты вызовов методов `InteractInput()` и `DetectObject()`. Это гарантирует, что каждый метод вызывается только один раз за итерацию `Update()`.
2. **Упрощение `InteractInput()`**: Код метода `InteractInput()` был упрощен. Теперь он возвращает результат проверки напрямую через логическое выражение.
Теперь ваши условия будут работать корректно, так как результаты уже сохранены в переменных и не будут переопределять друг друга при каждом вызове `if`.