Добавить число с плавающей запятой в другой скрипт, C# unity

Мне нужна помощь, я пытаюсь добавить число с плавающей запятой из скрипта в другой скрипт, но это не работает. Я новичок в C# и кодировании в целом, если кто-нибудь исправит код скрипта и объяснит, что с этим не так, я был бы очень благодарен. Это ошибка, которую я получаю. "NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта Resources.Die () (в Assets / Resources.cs: 42) Resources.Update () (в Assets / Resources.cs: 22) " Вот мои сценарии: 1-й

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Resources : MonoBehaviour {

    public float maxHealth = 5;
    public float currentHealth;
    public float ResourceCounter;

    public Texture stoneIcon;
    public Texture woodIcon;

    void Start ()
    {
        currentHealth = maxHealth;
        ResourceCounter = 0;
    }

    void Update ()
    {
        Die();

    }

    public void OnMouseOver()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Debug.Log("Loosing one health");
            currentHealth = currentHealth - 1f;
        }

    }

    public void Die()
    {
        if (currentHealth <= 0)
        {
            Destroy(gameObject);

            Inventory inventory = GetComponent<Inventory>();
            inventory.ResourceStone = inventory.ResourceStone + 1;

        }
    }
}

2-й

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour {

    public float ResourceStone;

    // Use this for initialization
    void Start ()
    {
        ResourceStone = 0;
}

    // Update is called once per frame
    void Update () {

    }
}

Ссылка на объект не установлена ​​на экземпляр объекта Resources.Die (), это информирует вас о том, что вы пытаетесь получить доступ к переменной без значения. он сообщает вам, что он находится в строке 42, но я не знаю, что именно, я просто предполагаю, что Inventory inventory = GetComponent <Inventory> (); ничего не возвращает, а следующая строка выдает пустую ссылку, когда вы пытаетесь получить доступ к свойству переменной инвентаря. попробуйте проверить там, если инвентарь! = null

Jarek Kożdoń 22.04.2018 01:16

Кстати: под сценариями вы подразумеваете классы, верно?

Jarek Kożdoń 22.04.2018 01:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
998
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на ваш код, я думаю, что вы никогда не определяли экземпляр инвентаризации для своего сценария "ресурсов". Если вы используете getcomponent, и ресурсы, и скрипт инвентаря должны находиться на одном игровом объекте, чтобы их можно было найти. Если вы хотите, чтобы оба сценария были на других игровых объектах, вам понадобится ссылка на инвентарь в вашем сценарии ресурсов. Вы можете сделать это несколькими способами (например, создать статическую ссылку и ссылаться на нее или определить инвентарь как общедоступную переменную, а затем добавить ссылку на инвентарь в редакторе единства)

Вот как будет выглядеть первый случай:

Первый сценарий -

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{
    public static Inventory instance;

    private void Awake()
    {
        instance = this;
    }

    public float ResourceStone;

// Use this for initialization
    void Start()
    {
        ResourceStone = 0;
    }
}

Второй сценарий -

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Resources : MonoBehaviour
{

    public float maxHealth = 5;
    public float currentHealth;
    public float ResourceCounter;

    public Texture stoneIcon;
    public Texture woodIcon;

    void Start()
    {
        currentHealth = maxHealth;
        ResourceCounter = 0;
    }

    void Update()
    {
        Die();
    }

    public void OnMouseOver()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Debug.Log("Loosing one health");
            currentHealth = currentHealth - 1f;
        }

    }

    public void Die()
    {
        if (currentHealth <= 0)
        {
            Destroy(gameObject);
            Inventory.instance.ResourceStone++;
        }
    }
}

Вот как выглядел бы код, если бы вы сделали второй:

первый сценарий:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{

public float ResourceStone;

// Use this for initialization
void Start()
{
    ResourceStone = 0;
}

// Update is called once per frame
    void Update()
    {

    }
}

второй сценарий-

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Resources : MonoBehaviour
{

    public float maxHealth = 5;
    public float currentHealth;
    public float ResourceCounter;
    public Inventory inventory;

    public Texture stoneIcon;
    public Texture woodIcon;

    void Start()
    {
        currentHealth = maxHealth;
        ResourceCounter = 0;
    }

    void Update()
    {
        Die();

    }

    public void OnMouseOver()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Debug.Log("Loosing one health");
            currentHealth = currentHealth - 1f;
        }

    }

    public void Die()
    {
        if (currentHealth <= 0)
        {
            Destroy(gameObject);
            inventory.ResourceStone++;
        }
    }
}

Просто примите во внимание две вещи, чтобы решить, будете ли вы использовать первую или вторую. Первый - это статическая ссылка, это означает, что вы не можете сделать больше одного инвентаря. Во втором вам нужно вручную перетащить ссылку в редакторе. На всякий случай, если вы не знаете, написание ++ после целого числа делает то же самое, что и integer = integer + 1;

Обновлено: Вот так выглядит лучше: D

Будет ли работать использование [RequireComponent (typeof (Inventory))] или общедоступного класса Resources: Inventory?

user9608906 22.04.2018 01:58

У меня проблемы с написанием кода здесь, но в основном то, что я показал, я попытаюсь отредактировать на моем домашнем ПК дома.

user9596240 22.04.2018 02:02

Большое спасибо за вашу помощь, я очень ценю это!

user9608906 22.04.2018 02:04

Рад помочь, это то, для чего создано это сообщество :).

user9596240 22.04.2018 04:31

Другие вопросы по теме