- Home /
reloading game from main menu problem
hi so i have my main menu and i click the play game then i can play game then i die and i have a start game event that allows me to go and play again fine. but when i use the pause function and go back to the main menu i click play game but i get this error
MissingReferenceException: The object of type 'SkylineFarAway' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.Component.get_transform () SkylineFarAway.GameStart () (at Assets/Skyline/SkylineFarAway.cs:71) GameEventManager.TriggerGameStart () (at Assets/Managers/GameEventManager.cs:12) GUIManager.Update () (at Assets/Managers/GUIManager.cs:18)
so i think i have to DontDestroyOnLoad but im not sure what, when and how as i have never used this before. or something to do with static variables.
the error seems to point to my TriggerGameStart being the problem but i dont get why.
here is a link to the game in a development build for you to see whats happening and when
https://dl.dropboxusercontent.com/u/190836296/Test%203/Test%203.html
here is the code i am using in refrence to what the error is saying,
SKYLINE FAR AWAY
using UnityEngine;
using System.Collections.Generic;
public class SkylineFarAway : MonoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 minSize, maxSize, minGap, maxGap;
public float minY, maxY;
public Material[] materials;
public PhysicMaterial[] physicMaterials;
public Booster booster;
private Vector3 nextPosition;
private Queue<Transform> objectQueue;
void Awake() {
DontDestroyOnLoad(this);
}
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++){
objectQueue.Enqueue((Transform)Instantiate(prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
}
enabled = false;
}
void Update () {
if(objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled){
Recycle();
}
}
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
objectQueue.Enqueue(o);
nextPosition += new Vector3(
Random.Range(minGap.x, maxGap.x) + scale.x,
Random.Range(minGap.y, maxGap.y),
Random.Range(minGap.z, maxGap.z));
if(nextPosition.y < minY){
nextPosition.y = minY + maxGap.y;
}
else if(nextPosition.y > maxY){
nextPosition.y = maxY - maxGap.y;
}
}
private void GameStart () {
nextPosition = transform.localPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
enabled = true;
}
private void GameOver () {
enabled = false;
}
}
GAME EVENT MANAGER
using UnityEngine;
using System.Collections;
public static class GameEventManager {
public delegate void GameEvent();
public static event GameEvent GameStart, GameOver;
public static void TriggerGameStart(){
if(GameStart != null){
GameStart();
}
}
public static void TriggerGameOver(){
if(GameOver != null){
GameOver();
}
}
}
GUIMANAGER
using UnityEngine;
public class GUIManager : MonoBehaviour {
public GUIText gameOverText, instructionsText, boostsText, distanceText;
private static GUIManager instance;
void Start () {
instance = this;
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
gameOverText.enabled = false;
}
void Update () {
if(Input.GetButtonDown("Jump")){
GameEventManager.TriggerGameStart();
}
}
private void GameStart () {
gameOverText.enabled = false;
instructionsText.enabled = false;
enabled = false;
}
private void GameOver () {
gameOverText.enabled = true;
instructionsText.enabled = true;
enabled = true;
}
public static void SetBoosts(int boosts){
instance.boostsText.text = boosts.ToString ();
}
public static void SetDistance(float distance){
instance.distanceText.text = distance.ToString("f0");
}
}
Did you try moving DontDestroyOnLoad() to the Start subroutine, which ensures that the action is always executed when the object is created? Awake is only called when the object is seen by a camera, while Start is called when the object which the script is attached to is created, and is always called once.
Also, DontDestroyOnLoad() should look like this:
DontDestroyOnLoad(gameObject);
Unity references the object which the script is attached to using "gameObject" and not "this" as non-Unity program$$anonymous$$g does.
thanks helping but i tried putting it in the start function with the changes but im still getting this:-
$$anonymous$$issingReferenceException: The object of type 'SkylineFarAway' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.Component.get_transform () SkylineFarAway.GameStart () (at Assets/Skyline/SkylineFarAway.cs:70) GameEvent$$anonymous$$anager.TriggerGameStart () (at Assets/$$anonymous$$anagers/GameEvent$$anonymous$$anager.cs:12) GUI$$anonymous$$anager.Update () (at Assets/$$anonymous$$anagers/GUI$$anonymous$$anager.cs:18)
tried taking my Skyline Far Away start function off and it happened with the next prefab Skyline Close, so it will happen with all my prefabs. so i think its something to do with my Trigger Game Start maybe?
Answer by Adelphia · Jul 22, 2013 at 05:21 PM
fixed it, you have to deregister it from GameEventManager so it won't be called again:
this needs to go in all scripts.
void OnDestroy() {
GameEventManager.GameStart -= GameStart;
GameEventManager.GameOver -= GameOver;
}
Thank you very much, I've no idea I had to unregister the Events, I've wasted lot of time finding out what was the problem and I found out there was between LoadScene and GameEvent$$anonymous$$anager.
Thank to you this is solved. As soon I have enough reputation I vote this answer as right.
Your answer
Follow this Question
Related Questions
after going to main menu my game wont play? 2 Answers
reload level whilst saving certain objects, without dontdestroy() 2 Answers
When I reload my scene, why does nothing work? dontDestroyOnLoad 1 Answer
Why is the level not properly working when I load it? 0 Answers
Trouble with DontDestroyOnLoad 2 Answers