Делал систему жизней по этому туториалу. В конце(время видео 28.15), когда переносил Main HUD в префаб и другие уровни, возникла ошибка. А именно, на первом уровне всё отлично,но когда переходишь на второй или далее, то выскакивает error и не отображаются жизни (другие жизни, которые сердечки сверху) и очки.
Вид c игры:
Вид c консоли:
Код скрипта LifeManager:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class LifeManager : MonoBehaviour {
public int startingLives;
private int lifeCounter;
private Text theText;
public GameObject gameOverScreen;
public PlayerController player;
public string mainMenu;
public float waitAfterGameOver;
// Use this for initialization
void Start () {
theText = GetComponent<Text> ();
lifeCounter = startingLives;
player = FindObjectOfType<PlayerController>();
}
// Update is called once per frame
void Update () {
if (lifeCounter < 0)
{
gameOverScreen.SetActive(true);
player.gameObject.SetActive(false);
}
theText.text = "x " + lifeCounter;
if (gameOverScreen.activeSelf)
{
waitAfterGameOver -= Time.deltaTime;
}
if (waitAfterGameOver < 0)
{
Application.LoadLevel(mainMenu);
}
}
public void GiveLife()
{
lifeCounter++;
}
public void TakeLife()
{
lifeCounter--;
}
}
Код скрипта HealthManager:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class HealthManager : MonoBehaviour {
public int maxPlayerHealth;
public static int playerCurHealth;
private LevelManeger levelManager;
private LifeManager lifeSystem;
// Use this for initialization
void Start () {
playerCurHealth = maxPlayerHealth;
levelManager = FindObjectOfType<LevelManeger>();
lifeSystem = FindObjectOfType<LifeManager>();
}
// Update is called once per frame
void Update () {
if (playerCurHealth <= 0)
{
playerCurHealth = 0;
levelManager.RespawnPlayer();
lifeSystem.TakeLife();
}
if (playerCurHealth > maxPlayerHealth)
{
playerCurHealth = maxPlayerHealth;
}
}
public static void HurtPlayer(int damageToGive)
{
playerCurHealth -= damageToGive;
}
public void FullHealth()
{
playerCurHealth = maxPlayerHealth;
}
}
Код скрипта HUD:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class HUD : MonoBehaviour {
public Sprite[] HertSprites;
public Image HeartUI;
//private HealthManager helthManager;
public PlayerController player;//был private
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>();
//helthManager = FindObjectOfType<HealthManager>();
}
void Update()
{
HeartUI.sprite = HertSprites[HealthManager.playerCurHealth];
}
Пару организационных моментов:
1.Не все части кода могут совпадать с туториалом ибо приходилось вносить изменения.
2.Мой проект. Чтобы воспроизвести ошибку требуется удалить со второго уровня Canvas и заменить на префаб Main HUD.
3.Если умирать с Гейм-Овером, то через улиток.


HeartUI.sprite = HertSprites[HealthManager.playerCurHealth];, исключение типа NRE. По коду так не вижу, откуда эти переменные все заполняются, так что советую почитать например http://ru.stackoverflow.com/questions/413041/Что-такое-nullreferenceexception-и-как-мне-исправить-код – Monk Feb 28 '16 at 16:30