Доброго! Подскажите, пожалуйста почему не отнимается Health у Player при соприкосновении.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollisionDamage : MonoBehaviour
{ public int damage = 10; //переменная повреждений
public string collisionTag; //тэг игровых объектов для взаимодействия с другими объектами
[SerializeField] private Animator animator;
private Health health;
private float direction;
private void OnCollisionStay2D(Collision2D col)// метод урона
{
Health health = col.gameObject.GetComponent<Health>();// в health попадает количество жизней объекта с которым соприкоснулись
if (health != null)
{
direction = (col.transform.position - transform.position).x;// разница между позицией герой и позицией противника - если оно отрицательное, то герой слева, если положительно, то справа
animator.SetFloat("Direction",Mathf.Abs(direction));//активируем анимацию перехода по переменной дирекшн и в дирекшн помещаем значение, полученное из предыдущей строчки
}
}
public void SetDamage()
{
if (health != null)// Если есть здоровье
health.TakeHit(damage);// отнимаем урон
health = null;// обнуляем, чтобы заново не нанести ущерба
animator.SetFloat("Direction", 0f); // обнуляем значение дирекшн, чтобы собака не кусала постоянно
}
}
Почему OnCollisionStay2D, а не OnCollisionEnter? SetDamage мне не понятно, где вызывается, и непонятно, почему здоровье не снимается сразу в методе с коллизией? Ну и во всех этих случаях просто в каждом методе пишешь Log.Debug("OnCollisionStay2D") и т.п. и смотришь, вызывается ли метод вообще
private Health health; ... private void OnCollisionStay2D(Collision2D col)// метод урона { Health health = col.gameObject.GetComponent<Health>();
Если в OnCollisionStay2D ты хочешь чужой Health запихнуть в private Health health, то надо писать
private Health health; ... private void OnCollisionStay2D(Collision2D col)// метод урона { health = col.gameObject.GetComponent<Health>();
Также вроде на одном из объекте (или там где висит скрипт CollisionDamage или то у кого есть Health) должен висеть RigidBody2D пусть даже в виде кинематика
MANAB
set damage вызывается а окне аниматора на предпоследнем кадре через add event https://disk.yandex.ru/i/GP3Hx9O7rrZp6A. Enter или Stay2D - я пробовал по разному, картины не меняет.
А скрипт содержащий процедуру/функцию на которую указывает событие аниматора висит на том же объекте, где висит сам аниматор?
set damage вызывается а окне аниматора на предпоследнем кадре через add event
(Если он будет на ином объекте, то работать не будет)
AlexStraga
> health = col.gameObject.GetComponent<Health>();
Спасибо друг, ваш совет помог, вы лучший )