Ошибка NullReferenceException

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Ошибка NullReferenceException

Сообщение ToxWill 22 авг 2018, 17:37

Есть два скрипта HUD и HealthAndDamage. HUD лежит на канвасе второй на игровом объекте игрока.
При запуске выдает это - NullReferenceException: Object reference not set to an instance of an object
HealthAndDamage.OnHealthChanged (Int32 newHealth) (at Assets/Scripts/Networking/HealthAndDamage.cs:80)

вот та самая строчка на которую он ругает - HealthAndDamage
Синтаксис:
Используется csharp
 
void OnHealthChanged(int newHealth)
    {
        health = newHealth;
        if (health < 100)
        {
            StartCoroutine(ShowHitEffect());
        }
        if (isLocalPlayer)
        {
            HUD.instance.DisplayHealth(health);
        }
    }
 


А это уже HUD -
Синтаксис:
Используется csharp
{
    public static HUD instance;
    Text healthText;
    Text scoreText;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            healthText = transform.Find("HealthText").GetComponent<Text>();
            scoreText = transform.Find("ScoreText").GetComponent<Text>();
            GetComponentInChildren<Camera>().gameObject.SetActive(false);
        }
        else
        {
            DestroyImmediate(gameObject);
            return;
        }
    }

    public void DisplayHealth(int health)
    {
        healthText.text = string.Format("Health: {0}", health);
    }

    public void DisplayScore(int score)
    {
        scoreText.text = string.Format("Score: {0}", score);
    }
}
 
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: Ошибка NullReferenceException

Сообщение 1max1 22 авг 2018, 17:50

вот та самая строчка на которую он ругает - HealthAndDamage

Это не строчка, а целый блок кода, и черт знает, что он там ругает, выложи сюда полный стек трейс ошибок.

п.с. тут либо healthText == null либо сам instance == null
Последний раз редактировалось 1max1 22 авг 2018, 17:51, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Ошибка NullReferenceException

Сообщение ToxWill 22 авг 2018, 17:51

NullReferenceException: Object reference not set to an instance of an object
HealthAndDamage.OnHealthChanged (Int32 newHealth) (at Assets/Scripts/Networking/HealthAndDamage.cs:80)
HealthAndDamage.set_Networkhealth (Int32 value)
HealthAndDamage.CmdSetHealth (Int32 newHealth) (at Assets/Scripts/Networking/HealthAndDamage.cs:22)
HealthAndDamage.CallCmdSetHealth (Int32 newHealth)
HealthAndDamage.OnStartLocalPlayer () (at Assets/Scripts/Networking/HealthAndDamage.cs:15)
UnityEngine.Networking.NetworkIdentity.SetLocalPlayer (Int16 localPlayerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:777)
UnityEngine.Networking.NetworkServer.SetupLocalPlayerForConnection (UnityEngine.Networking.NetworkConnection conn, UnityEngine.Networking.NetworkIdentity uv, UnityEngine.Networking.PlayerController newPlayerController) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1004)
UnityEngine.Networking.NetworkServer.InternalAddPlayerForConnection (UnityEngine.Networking.NetworkConnection conn, UnityEngine.GameObject playerGameObject, Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:943)
UnityEngine.Networking.NetworkServer.AddPlayerForConnection (UnityEngine.Networking.NetworkConnection conn, UnityEngine.GameObject player, Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:906)
UnityEngine.Networking.NetworkManager.OnServerAddPlayerInternal (UnityEngine.Networking.NetworkConnection conn, Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:1062)
UnityEngine.Networking.NetworkManager.OnServerAddPlayer (UnityEngine.Networking.NetworkConnection conn, Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:1028)
UnityEngine.Networking.NetworkManager.OnServerAddPlayerMessageInternal (UnityEngine.Networking.NetworkMessage netMsg) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:878)
UnityEngine.Networking.NetworkConnection.InvokeHandler (Int16 msgType, UnityEngine.Networking.NetworkReader reader, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:219)
UnityEngine.Networking.NetworkServer.InvokeHandlerOnServer (UnityEngine.Networking.ULocalConnectionToServer conn, Int16 msgType, UnityEngine.Networking.MessageBase msg, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1651)
UnityEngine.Networking.ULocalConnectionToServer.Send (Int16 msgType, UnityEngine.Networking.MessageBase msg) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/LocalConnections.cs:83)
UnityEngine.Networking.ClientScene.AddPlayer (UnityEngine.Networking.NetworkConnection readyConn, Int16 playerControllerId, UnityEngine.Networking.MessageBase extraMessage) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:207)
UnityEngine.Networking.ClientScene.AddPlayer (UnityEngine.Networking.NetworkConnection readyConn, Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:140)
UnityEngine.Networking.ClientScene.AddPlayer (Int16 playerControllerId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:134)
UnityEngine.Networking.NetworkManager.OnClientSceneChanged (UnityEngine.Networking.NetworkConnection conn) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:1172)
UnityEngine.Networking.NetworkManager.FinishLoadScene () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:725)
UnityEngine.Networking.NetworkManager.UpdateScene () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkManager.cs:765)
UnityEngine.Networking.NetworkIdentity.UNetStaticUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:1089)
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: Ошибка NullReferenceException

Сообщение ToxWill 22 авг 2018, 17:52

Синтаксис:
Используется csharp
{
    [SyncVar(hook = "OnHealthChanged")]
    public int health;
    [SyncVar] Vector3 respawnPos;
    public GameObject playerCam;

    public override void OnStartLocalPlayer()
    {
        CmdSetHealth(100);
        playerCam = GameObject.Find("Follow Cam");
    }

    [Command]
    void CmdSetHealth(int newHealth)
    {
        health = newHealth;
    }

    [Server]
    public void TakeDamage(GameObject fromPlayer)
    {
        health = Mathf.Max(health - 10, 0);
        if (health <= 0)
        {
            DoDeath();
            fromPlayer.GetComponent<PlayerShoot>().AddScore();
        }
    }

    [Server]
    void DoDeath()
    {
        respawnPos = GetRandomSpawnPoint();
        RpcHandlePlayerDeath();
    }

    [Server]
    Vector3 GetRandomSpawnPoint()
    {
        var spawnPoints = NetworkManager.singleton.startPositions;
        return spawnPoints[Random.Range(0, spawnPoints.Count)].position;
    }

    [ClientRpc]
    void RpcHandlePlayerDeath()
    {
        if (isLocalPlayer)
        {
            transform.position = respawnPos;
            CmdSetHealth(100);
        }
    }

    [Client]
    void Respawn()
    {
        if (isLocalPlayer)
        {
            playerCam.transform.SetParent(transform);
            playerCam.transform.localPosition = new Vector3(0, 10, 0);
            CmdSetHealth(100);
        }
    }

    void OnHealthChanged(int newHealth)
    {
        health = newHealth;
        if (health < 100)
        {
            StartCoroutine(ShowHitEffect());
        }
        if (isLocalPlayer)
        {
            HUD.instance.DisplayHealth(health);
        }
    }

    IEnumerator ShowHitEffect()
    {
        var material = GetComponent<Renderer>().material;
        Color savedColor = material.color;
        material.color = Color.yellow;
        yield return new WaitForSeconds(0.4f);
        material.color = savedColor;
    }
}
 
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: Ошибка NullReferenceException

Сообщение 1max1 22 авг 2018, 18:02

посмотри дебагом не равняется ли нулю твой инстанс
Синтаксис:
Используется csharp
void OnHealthChanged(int newHealth)
    {
        health = newHealth;
        if (health < 100)
        {
            StartCoroutine(ShowHitEffect());
        }
        if (isLocalPlayer)
        {
            Debug.Log(HUD.instance == null);
            HUD.instance.DisplayHealth(health);
        }
    }
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Ошибка NullReferenceException

Сообщение ToxWill 22 авг 2018, 18:10

True
UnityEngine.Debug:Log(Object)
HealthAndDamage:OnHealthChanged(Int32) (at Assets/Scripts/Networking/HealthAndDamage.cs:80)
HealthAndDamage:set_Networkhealth(Int32)
HealthAndDamage:CmdSetHealth(Int32) (at Assets/Scripts/Networking/HealthAndDamage.cs:22)
HealthAndDamage:CallCmdSetHealth(Int32)
HealthAndDamage:OnStartLocalPlayer() (at Assets/Scripts/Networking/HealthAndDamage.cs:15)
UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: Ошибка NullReferenceException

Сообщение 1max1 22 авг 2018, 18:29

True

Ну вот и ответ на твой вопрос, меняй порядок вызова скриптов, еще можешь попробовать запихнуть строку instance = this; в конструктор класса.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Ошибка NullReferenceException

Сообщение Anonymyx 22 авг 2018, 20:14

запихнуть строку instance = this; в конструктор класса.

Использовать конструкторы MonoBeh'а крайне не рекомендуется. В Unity3D у MonoBeh'а он вызывается по нескольку раз, даже в редакторе, не в рантайме.

...

В Awake() запихиваешь все что НЕ связано с другими объектами, т.е. инициализация переменных данного класса без обращения к другим объектам.
В Start() запихиваешь все что связывается, обращается к другими классам, GetComponent'ы, и прочее.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Ошибка NullReferenceException

Сообщение seaman 23 авг 2018, 00:40

HUD-а нет на сцене...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 25


cron