2016-10-02 2 views
0

Проект работает отлично, пока не будет достигнута определенная точка, а затем внезапно начнет бросать NRE. Вот некоторые исходный код:Strange NullReferenceException в Unity Script (C#)

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; 
} 

Там, кажется, не является причиной для сценария, чтобы бросать ЯРД, но он все еще делает.

+0

Является ли весь код в кулачном блоке по тому же сценарию? – Theraot

+0

да это. второй блок - другой скрипт – Toreole

+0

Где вы объявляете переменную _myhealth_? Используете ли вы тот же экземпляр первого класса, когда получаете NRE? Ваш код выше пропускает какой-то контекст. В частности, код, который вызывает Start, ApplyDamage и AddHealth – Steve

ответ

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>(); Это само по себе прекрасно.

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