Мне нужна помощь, я пытаюсь добавить число с плавающей запятой из скрипта в другой скрипт, но это не работает. Я новичок в 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 () {
}
}
Кстати: под сценариями вы подразумеваете классы, верно?





Глядя на ваш код, я думаю, что вы никогда не определяли экземпляр инвентаризации для своего сценария "ресурсов". Если вы используете 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?
У меня проблемы с написанием кода здесь, но в основном то, что я показал, я попытаюсь отредактировать на моем домашнем ПК дома.
Большое спасибо за вашу помощь, я очень ценю это!
Рад помочь, это то, для чего создано это сообщество :).
Ссылка на объект не установлена на экземпляр объекта Resources.Die (), это информирует вас о том, что вы пытаетесь получить доступ к переменной без значения. он сообщает вам, что он находится в строке 42, но я не знаю, что именно, я просто предполагаю, что Inventory inventory = GetComponent <Inventory> (); ничего не возвращает, а следующая строка выдает пустую ссылку, когда вы пытаетесь получить доступ к свойству переменной инвентаря. попробуйте проверить там, если инвентарь! = null