Войти
UnityФорумПрограммирование

как найти ошибку, почему не отнимается Health у Player при соприкосновении.

#0
14:06, 23 июня 2022

Доброго! Подскажите, пожалуйста почему не отнимается 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);  // обнуляем значение дирекшн, чтобы собака не кусала постоянно
    }
}

#1
15:05, 23 июня 2022

Почему OnCollisionStay2D, а не OnCollisionEnter? SetDamage мне не понятно, где вызывается, и непонятно, почему здоровье не снимается сразу в методе с коллизией? Ну и во всех этих случаях просто в каждом методе пишешь Log.Debug("OnCollisionStay2D") и т.п. и смотришь, вызывается ли метод вообще

#2
15:46, 23 июня 2022
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 пусть даже в виде кинематика

#3
16:10, 23 июня 2022

MANAB
set damage вызывается а окне аниматора на предпоследнем кадре через add event https://disk.yandex.ru/i/GP3Hx9O7rrZp6A. Enter или Stay2D - я пробовал по разному, картины не меняет.

#4
(Правка: 20:09) 19:51, 23 июня 2022

А скрипт содержащий процедуру/функцию на которую указывает событие аниматора висит на том же объекте, где висит сам аниматор?

set damage вызывается а окне аниматора на предпоследнем кадре через add event

(Если он будет на ином объекте, то работать не будет)

#5
11:22, 24 июня 2022

AlexStraga
> health = col.gameObject.GetComponent<Health>();
Спасибо друг, ваш совет помог, вы лучший )

UnityФорумПрограммирование