Вопрос:

OnMouseDown () пустая ссылка исключение

c# unity3d onmousedown

503 просмотра

1 ответ

18 Репутация автора

public class TowerNode : MonoBehaviour {

public bool IsShopOpen=false;

//Z position
public Vector3 positionOffSet;

//colors
public Color hoverColor;
private Color startColor;

//GameObjects
public GameObject turret;

//shop
public Shop shop;

//Build Manager
BuildManager buildManager;

void Start()
{
    rend=GetComponent<Renderer>();
    startColor = rend.material.color;
    buildManager = BuildManager.instance;
    shop = GetComponent<Shop>();
}


//When mouse is on the turret node
public void OnMouseDown()
{    
    Debug.Log("Mouse is Down");
    bool IsShopOpen  = true;
    if (IsShopOpen == true)
    {
        Debug.Log("shop is open");
        shop.onEnable();
    }

    if (EventSystem.current.IsPointerOverGameObject())
    {          
        return;
    }
    if (!buildManager.CanBuild)
    {
        return;
    }
    if (turret != null)
    {
        Debug.Log("Cant Build Here!!!");
        return;
    }       

    buildManager.BuildTurretOn(this);

}

другой скрипт магазина таков:

public class Shop : MonoBehaviour
{
public TurretBlueprint Archery;
public TurretBlueprint Treb;
public TurretBlueprint Workamp;
public TurretBlueprint Barracks;

public Button Archeryy;
public Button Trebb;
public Button WorkCampp;
public Button Barrackss;

BuildManager buildManager;


void Start()
{
    buildManager = BuildManager.instance;
    disableAllButtons();
    //OnEnable();
}

public void SelectArchery()
{
    buildManager.SelectTurretToBuild(Archery);
    Debug.Log("archery!!!!");

}
public void SelectTreb()
{
    buildManager.SelectTurretToBuild(Treb);
    Debug.Log("Treb!!!!");
}
public void SelectWorkamp()
{
    buildManager.SelectTurretToBuild(Workamp);
    Debug.Log("Work Camp!!!!");
}
public void SelectBarracks()
{
    buildManager.SelectTurretToBuild(Barracks);
    Debug.Log("Barracks!!!!");
}


public void onEnable()
{
    Archeryy.gameObject.SetActive(true);
    Trebb.gameObject.SetActive(true);
    WorkCampp.gameObject.SetActive(true);
    Barrackss.gameObject.SetActive(true);

}

public void disableAllButtons()
{
    Archeryy.gameObject.SetActive(false);
    Trebb.gameObject.SetActive(false);
    WorkCampp.gameObject.SetActive(false);
    Barrackss.gameObject.SetActive(false);
}

}

Мне нужно, когда я нажимаю на игровой объект, чтобы магазин открылся, у него есть несколько кнопок под ним, но это дает мне:

«NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта TowerNode.OnMouseDown () (в Assets / Scripts / TowerNode.cs: 51) UnityEngine.SendMouseEvents: DoSendMouseEvents (Int32)»

и я не понимаю почему.

Автор: Lian Levi Источник Размещён: 03.01.2018 04:07

Ответы (1)


2 плюса

110 Репутация автора

Решение

Ошибка, которую вы получаете, подразумевает, что объект в OnMouseDownфункции является нулевым при выполнении:

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта TowerNode.OnMouseDown () (в Assets / Scripts / TowerNode.cs: 51)

Вы должны взглянуть на пункт 51 TowerNode.csи выяснить, что может быть нулевым в этой строке. Может shopили buildManagerбыть нулевым? Возможно, это событие срабатывает до того, как вы инициализируете свой TowerNodeобъект.

Кажется, вы пытаетесь получить доступ к компоненту ( Shop) из совершенно не связанного GameObject. Если вы хотите, чтобы все ваши TowerNodeобъекты ссылались на них, Shopвы можете использовать GameObject.Find . Это не очень рекомендуется, хотя; кажется, есть лучший способ связать эти два объекта, но я не уверен в вашем случае использования.

Автор: JimmyDeemo Размещён: 03.01.2018 04:17
32x32