Запрет на подбор здоровья Unity3D
Подскажите пожалуйста, как сделать запрет на подбор хилок когда у игрока максимальное количество хп. Новичок в Unity, поэтому строго не судите) Код ниже:
PlayerHealth.cs
public void HealPlayer(int healAmount)
{
currentHealth += healAmount;
if (currentHealth > maxHealth)
{
currentHealth = maxHealth;
}
}
HealthPickup.cs
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
PlayerHealth.instance.HealPlayer(healAmount);
Destroy(gameObject);
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
Вопрос по сути с какой стороны проверять, правильный ответ ни с какой. То что хилка подбирает сама себя это странно. Проверкой по тегу вообще не пользуются поскольку это строковый летирал, теоретический агент ошибки которую потом трудно искать.
Вряд ли персонаж в игре подбирает одни только хилки, скорее всего еще есть манетки, предметы и т.д. Нужен какой нибудь суперкласс PickableObject от которого наследуются все подбираемые объекты.
public class PickableObject: MonoBehaviour
{
[SerializeField] private GameObject _pickEffect;
public void Pick ()
{
if (_pickEffect != null)
Instantinate(_pickEffect);
Destroy(gameOvject);
}
}
public class PickableHealth : PickableObject
{
[SerializeField] private int _amount;
public int Amount => _amount;
}
На игроке специальный класс подбиратель:
public class ObjectPicker : MonoBehaviour
{
private Health _health;
private void OnTriggerEnter (Collider other)
{
// проверяем по типу или интерфейсу
if (TryGetComponent(out PickableObject target))
PickObject(target); // перегрузка методов
}
public void Initialize (Health health) {
{
_health = health;
}
// если подобранный объект является хилкой сработает этот метод
private void PickObject (PickableHealth target)
{
if (_health.Current < _health.Max)
{
_health.Restore(target.Amount);
target.Pick();
}
}
// если подобранный объект является валютой сработает этот метод
private void PickObject (PickableValuta target) { }
// в любом другом случае сработает метод с базовым типом
private void PickObject (PickableObject target) { }
}
public class Health
{
public event Action<int> Changed;
public int Current { get; private set; }
public int Max { get; private set; }
public void SetMax (int amount)
{
Max = amount;
Current = Max;
}
public void Restore (int amount)
{
SetCurrent(Current+amount);
}
public void Lose (int amount)
{
SetCurrent(Current-amount);
}
privat void SetCurrent (int amount)
{
Current = Mathf.Clamp(amount, 0, Max);
Changed?.Invoke(Current);
}
}