Танки! Unity в настоящее время пытается добавить предмет для восстановления здоровья - PullRequest
0 голосов
/ 02 апреля 2020
void OnTriggerEnter(Collider other) 
{
    if (other.gameObject.CompareTag ("HealthPickUp"))
    {
        m_CurrentHealth += amount;
        other.gameObject.SetActive (false);
        SetHealthUI ();
    }
    if (m_CurrentHealth <= 0f && !m_Dead)
    {
        OnDeath ();
    }
}

пытается понять, что если танк попадет в поднятый предмет, он получит 20 очков, но на данный момент у меня нет ни малейшего понятия, что делать

1 Ответ

0 голосов
/ 12 апреля 2020

Чтобы коллизии работали в Unity, вам нужно сделать следующее:

  1. Присоединить компонент Collider к каждому объекту, который вы хотите стать частью коллизии. Это может быть BoxCollider, SphereCollider, et c. Какая бы форма ни имела смысл.
  2. Для триггерных коллизий (то есть нефизических коллизий) включите значение Is Trigger в инспекторе для каждого компонента коллайдера, созданного на шаге 1.
  3. Прикрепите компонент RigidBody к объекту, с которым вы хотите столкнуться, в другие вещи. RigidBody компоненты дороги, и вы не хотите, чтобы они были повсюду в сцене, поэтому я бы посоветовал вам поставить их на Tank. Возможно, вам также придется включить свойство Is Kinematic, в противном случае ваш Tank может вести себя некорректно (трудно сказать с таким небольшим количеством информации в вашей настройке).
  4. Прикрепите скрипт к вашему Tank, что реализовал метод OnTriggerEnter. Ниже приведен пример.
  5. (Необязательно, настоятельно рекомендуется). Я бы посоветовал вам создать еще один сценарий и прикрепить его к вашему датчику здоровья. Я продемонстрирую на примере ниже.
  6. (Необязательно) Вы можете использовать столкновения на уровне слоя , чтобы отфильтровать, какие виды столкновений вы обнаружите, чтобы сделать его более эффективным.
public class Tank : MonoBehaviour
{
    // Setup the initial health values in the editor.
    [SerializeField] private int _initialHealth = 100;
    [SerializeField] private int _maxHealth = 100;

    private int _health = -1;

    private void Awake()
    {
        _health = _initialHealth;
    }

    private void Update()
    {
        // You probably want to check this in Update, since you want the tank
        // to die as soon as it happens, not just when you pick up a piece of health.
        if (_health <= 0)
        {
            OnDeath();
        }
    }

    private void OnDeath()
    {
        // Your death logic.
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("HealthPickup"))
        {
            // Get the HealthPickup component and then add the amount to the tank's
            // health. This is more robust because you can now create HealthPickup
            // objects with a variable amount of health.
            HealthPickup healthPickup = other.gameObject.GetComponent<HealthPickup>();
            if (healthPickup != null)
            {
                _health = Mathf.Clamp(_health + healthPickup.amount, 0, _maxHealth);
                healthPickup.OnPickup();
            }
        }
    }
}

public class HealthPickup : MonoBehaviour
{
    [SerializeField] private int _amount = default;

    public int amount { get { return _amount; } }

    public void OnPickup()
    {
        Destroy(gameObject);
    }
}

Если вы выполните эти шаги, у вас должны работать коллизии и гибкая система выдачи вам Tank здоровья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...