Странное исключение NullReferenceException в скрипте Unity (C#)

Проект работает нормально, пока не будет достигнута определенная точка, а затем вдруг он начнет выбрасывать NRE. Вот некоторый исходный код:

void Start(){
myhealth = GetComponentInChildren<HealthBar>();
    if(myhealth == null)
    {
        Debug.Log("myhealth is null !!"); //It never outputs something here
    }
}

//And Here it works :
public void ApplyDamage(float amount)
{
    myhealth.DamageEnemy(amount);
    if (GetHealth() <= 0)
    { 
       [...]
    }
}

//Then suddenly it throws NRE's here when accesing it from another Script :
 public void AddHealth(float a)
{
    myhealth.HealEnemy(a); //Here
}

public float GetHealth()
{
     return myhealth.GetHealth(); //And here
}

В скрипте HealthBar есть эти переменные и эти функции:

public float maxHealth;
public float currentHealth;
private float originalScale;

public void DamageEnemy(float giveDamage)
{
    currentHealth -= giveDamage;
}

public void HealEnemy(float heal)
{
    currentHealth += heal;
}

public float GetHealth()
{
    return currentHealth;
}

Кажется, нет причин для того, чтобы сценарий выдавал NRE, но он все же это делает.


person Toreole    schedule 02.10.2016    source источник
comment
Весь ли код в первом блоке относится к одному и тому же сценарию?   -  person Theraot    schedule 02.10.2016
comment
Да, это. 2-й блок - это еще один скрипт   -  person Toreole    schedule 02.10.2016
comment
Где вы объявляете переменную myhealth? Используете ли вы тот же экземпляр первого класса при получении NRE? В приведенном выше коде отсутствует некоторый контекст. В частности, код, вызывающий Start, ApplyDamage и AddHealth.   -  person Steve    schedule 02.10.2016
comment
Сценарий Unity (MonoDevelop) Вызывает функцию Start() сразу после того, как объект начинает находиться в игре -> переменная myhealth всегда одна и та же, начиная с Start(), и никогда не изменяется   -  person Toreole    schedule 02.10.2016
comment
Опубликуйте свой HealthBar скрипт   -  person Programmer    schedule 02.10.2016
comment
сценарий HealthBar находится в нижнем поле?   -  person Toreole    schedule 02.10.2016
comment
Кто вызывает AddHealth/GetHealth и ApplyDamage? У вас есть коллекция топовых скриптов, которые просто прогоняют и вызывают все элементы? Вы можете убивать врага, но коллекция сохраняет ссылку и запускает AddHealth для мертвого объекта.   -  person Everts    schedule 02.10.2016


Ответы (1)


Точно так же, как вы делали это в своей функции Start(), попробуйте добавить

if(myhealth == null)
{
    Debug.Log("myhealth is null !!");
}

в твой

public void AddHealth(float a)
{
    myhealth.HealEnemy(a);
}

ведущий к

public void AddHealth(float a)
{
    if(myhealth == null)
    {
        Debug.Log("myhealth is null !!");
    }
    else
        myhealth.HealEnemy(a);
}

myhealth получается в Start() с помощью myhealth = GetComponentInChildren<HealthBar>(); Что само по себе прекрасно.

Но что происходит, когда дочерний объект, из которого вы получили этот компонент, уничтожается, удаляется или деактивируется? Как вы уже догадались, компонента больше не существует.

person MX D    schedule 04.10.2016