Home > Net >  The static instance of my GameAssets is not instantiating properly | Unity 3D
The static instance of my GameAssets is not instantiating properly | Unity 3D

Time:10-12

I'm trying to create a static GameAssets class where I can drag into it's references my Prefabs in order to manage every GameObject of my game.

The problem I have here is that when I start the game, the instance of my GameAssets is null (which I don't want) and it's instantiating a clone of GameAssets without the references linked to it.

Code of the GameAssets class

public class GameAssets : MonoBehaviour
{
    private static GameAssets _i;

    public static GameAssets i
    {
        get
        {   
            if (_i == null)
                _i =  Instantiate(Resources.Load<GameAssets>("GameAssets"));
            return _i;
        }
    }

    public GameObject ProjectileLaserBall;
}

Hierarchy & Inspector

We can see that I have an empty GameObject called GameAssets with prefabs linked to it's references already! How can I make Unity understand to use the existing GameAssets instead of creating a clone of it without it's references?

(As asked in my Script, a clone is created) Clone of class

CodePudding user response:

In this case as shown in your hierarchy image, you don’t need to create a new instance of your class. You already have an instance in your scene.

As such, when you start the game, you want the static reference to point to the already instantiated class that Unity already created after the scene was loaded.

The code would then look like:

public class GameAssets : MonoBehaviour
{
    private static GameAssets _i;

    public static GameAssets i
    {
        get
        {   
            if (_i == null)
                _i = this;
            return _i;
        }
    }

    public GameObject ProjectileLaserBall;
}

Your code does make use of the Resources folder. This make me think that you’ve also got a prefab if this GameAssets item in there as well. In this case, maybe your intention was to not define a GamesAssets object in your scene, but to load one in at runtime.

With prefabs, you can’t add references to scene objects (in the common sense), but you can add references to other prefabs. So, if you want to do it that way instead, make sure that your ProjectileLaserBall is also a prefab, instantiate the GameAssets object, add make sure you don’t already have a GameAssets object in the scene (as a new one is going to be created). The code for this class would still be the same as I’ve shown above, but you’d instantiate the asset from a different class altogether. If you’ve done everything correctly, you should have a single GameAssets item in the hierarchy that can be accessed by GameAssets.i

  • Related