private void Hunger(float delta) { if (_hungerState != HungerState.Eating) { _currentHungerValue -= delta * _hungerDeleptionRate; _currentHungerValue = Mathf.Max(0, _currentHungerValue); } switch (_hungerState) { case HungerState.Sated: _targetFood = null; if (_currentHungerValue <= 0) { _hungerState = HungerState.SearchingForFood; } break; case HungerState.SearchingForFood: _targetFood = null; float closestDist = Mathf.Infinity; foreach (Food food in FindObjectsOfType <Food>()) { if (food.RemainingFood() >= 1 && food.BeingEatenBy().Count == 0) { float dist = Vector3.Distance(transform.position, food.transform.position); if (dist < closestDist) { _targetFood = food; closestDist = dist; } } } if (_targetFood != null) { _targetFood.AddEater(this); _hungerState = HungerState.MovingToFood; _navigator.SetCurrentNavPosition(transform.position); _navigator.SetTarget(_targetFood); } break; case HungerState.MovingToFood: if (_targetFood.BeingEatenBy().Count >= 2) { _targetFood = null; _hungerState = HungerState.SearchingForFood; } else if (_navigator.HasReachedTarget()) { _hungerState = HungerState.Eating; } break; case HungerState.Eating: if ((_eatTimer -= delta) <= 0) { _eatTimer = _eatTime; _targetFood.EatFromFood(); _currentHungerValue += 0.1f; if (_currentHungerValue >= 1) { _targetFood.RemoveFoodEater(this); _targetFood = null; _navigator.SetTarget(null); _hungerState = HungerState.Sated; } else if (_targetFood.RemainingFood() <= 0) { _targetFood.RemoveFoodEater(this); _targetFood = null; _navigator.SetTarget(null); _hungerState = HungerState.SearchingForFood; } } break; } }