- Home /
Reloading a Scene throws NullReferenceException on GO with nested Prefabs
I'm doing a simple AR app in which the user has a menu with lamps. By swiping he/she switches lamps game objects (from prefabs) that are all nested on an empty game object. I have a Swipe Detector game object with an event listener which, with an Index, tracks the current active lamp and shows/hides the other as the user swipes (by setting the scale to 0). Then user presses a button that launches an AR Scene to place the lamp on the world. The AR scene has a "Back" button that reloads the menu to start over (by SceneManager.LoadScene("SceneName")
method).
However, when I relaunch the menu scene, the swiping does not work anymore, and I get a NullReferenceException on a method I use to get the currently active Game Object. It's driving me nuts... The empty game object with the nested lamps still has n children so I assume the prefab game objects are still there... I'm lost!!! Many thanks to anybody who can help, here's the code (script attached to empty parent GameObject):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemSwitcher : MonoBehaviour
{
public GameObject itemHolder;
public float rotationSpeed = 10f;
int m_Index;
int m_Length;
// Start is called before the first frame update
void Start()
{
itemHolder = GameObject.Find("Item Holder");
m_Index = 0;
m_Length = itemHolder.transform.childCount;
Debug.Log("Start(): Current Index " + m_Index.ToString());
Debug.Log("Start(): Current Length " + m_Length.ToString());
ResetAllChildren();
if (!ApplicationModel.configured)
{
SwipeDetector.OnSwipe += SwipeDetector_OnSwipe;
ApplicationModel.configured = true;
Debug.Log("Start(): Configured!");
}
}
// Update is called once per frame
void Update()
{
// rotate holder (and children)
itemHolder.transform.Rotate(0, rotationSpeed * Time.deltaTime, 0, Space.Self);
}
private void SwipeDetector_OnSwipe(SwipeData data)
{
Debug.Log("OnSwipe(): Changing Lamp");
if (data.Direction == SwipeDirection.Right)
{
UpdateChildrenDisplay(true);
}
else if (data.Direction == SwipeDirection.Left)
{
UpdateChildrenDisplay(false);
}
}
GameObject GetActiveObject()
{
Debug.Log("Getting Child " + m_Index.ToString());
return itemHolder.transform.GetChild(m_Index).gameObject;
}
void ResetAllChildren()
{
// Leave the first visible
//itemHolder.transform.GetChild(0).gameObject.GetComponentInChildren<MeshRenderer>().enabled = true;
itemHolder.transform.GetChild(0).gameObject.transform.localScale = new Vector3(1, 1, 1);
// Hide all others
for (int i = 1; i < m_Length; i++)
{
//itemHolder.transform.GetChild(i).gameObject.GetComponentInChildren<MeshRenderer>().enabled = false;
itemHolder.transform.GetChild(i).gameObject.transform.localScale = new Vector3(0, 0, 0);
}
}
void UpdateChildrenDisplay(bool right)
{
//GetActiveObject().GetComponentInChildren<MeshRenderer>().enabled = false;
GetActiveObject().transform.localScale = new Vector3(0, 0, 0);
if (right)
{
m_Index++;
m_Index = m_Index % m_Length;
}
else
{
m_Index--;
m_Index = m_Index == -1 ? m_Length - 1 : m_Index;
}
GameObject go = GetActiveObject();
//go.GetComponentInChildren<MeshRenderer>().enabled = true;
go.transform.localScale = new Vector3(1, 1, 1);
// This is not very good but...
// Index should match prefab name - 1 (so Lamp1 has index 0)
ApplicationModel.currentObject = (m_Index + 1).ToString();
Debug.Log("OnSwipe(): Current Lamp is Lamp" + (m_Index + 1).ToString());
}
}
Your answer
Follow this Question
Related Questions
hide and show node for turret places 1 Answer
Any other method to hide and show gameobjects? 1 Answer
Can I hide/show objects by layer or tags? 3 Answers
How do i make a texbox show and hide 1 Answer
Reinitialize prefab 0 Answers