Чтобы коллизии работали в Unity, вам нужно сделать следующее:
- Присоединить компонент
Collider
к каждому объекту, который вы хотите стать частью коллизии. Это может быть BoxCollider
, SphereCollider
, et c. Какая бы форма ни имела смысл. - Для триггерных коллизий (то есть нефизических коллизий) включите значение
Is Trigger
в инспекторе для каждого компонента коллайдера, созданного на шаге 1. - Прикрепите компонент
RigidBody
к объекту, с которым вы хотите столкнуться, в другие вещи. RigidBody
компоненты дороги, и вы не хотите, чтобы они были повсюду в сцене, поэтому я бы посоветовал вам поставить их на Tank
. Возможно, вам также придется включить свойство Is Kinematic
, в противном случае ваш Tank
может вести себя некорректно (трудно сказать с таким небольшим количеством информации в вашей настройке). - Прикрепите скрипт к вашему
Tank
, что реализовал метод OnTriggerEnter
. Ниже приведен пример. - (Необязательно, настоятельно рекомендуется). Я бы посоветовал вам создать еще один сценарий и прикрепить его к вашему датчику здоровья. Я продемонстрирую на примере ниже.
- (Необязательно) Вы можете использовать столкновения на уровне слоя , чтобы отфильтровать, какие виды столкновений вы обнаружите, чтобы сделать его более эффективным.
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
здоровья.