I have a gameobject in my scene called ‘Storage’ which holds 5 scripts:
- Tile Storage
- Item Storage
- Agent Storage
- Attack Storage
- LayerMask Storage
Basically these scripts hold variables that i want to access by many different scripts but don’t want to manually input into all those different scripts.
For example, instead of manually assigning a LayerMask everytime, i have assigned a bunch of different layermasks to my storage script and retrieve them from there. Example:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LayerMaskStorage : MonoBehaviour
{
public static LayerMaskStorage instance;
public LayerMask agents;
public LayerMask groundPlayerAlly;
public LayerMask playerAllyMask;
public LayerMask enemyMask;
public LayerMask enemyBlockMask;
public LayerMask ground;
void Awake(){
instance = this;
}
}
LayerMaskStorage.instance.agents;
An example of my agent storage, which stores the different enemy prefabs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AgentStorage : MonoBehaviour
{
public static AgentStorage instance;
[HideInInspector]
public List <GameObject> enemies = new List <GameObject>();
[HideInInspector]
public List <GameObject> enemiesSurface = new List <GameObject>();
public List<GameObject> launchMenuEnemies = new List<GameObject>();
public List<GameObject> caveEnemies = new List<GameObject>();
public GameObject Bat;
public GameObject Bird;
public GameObject Ghost;
public GameObject Golem;
public GameObject Imp;
public GameObject Slime;
public GameObject Slime2;
public GameObject Slime3;
public GameObject Zombie;
public GameObject ZombieMiner;
public GameObject CircleEnemy;
public GameObject Spider;
public GameObject BoulderEnemy;
// Bosses
public GameObject WormBoss;
public GameObject SquidBoss;
public List <GameObject> bosses = new List <GameObject>();
void Awake(){
instance = this;
addEnemiesToList();
addEnemiesToListSurface();
addBossesToList();
addLaunchMenuEnemies();
addCaveEnemies();
}
void addCaveEnemies(){
caveEnemies.Add(Bat);
caveEnemies.Add(Spider);
}
void addLaunchMenuEnemies(){
launchMenuEnemies.Add(Zombie);
launchMenuEnemies.Add(Golem);
launchMenuEnemies.Add(Slime);
}
void addBossesToList(){
bosses.Add(WormBoss);
bosses.Add(SquidBoss);
}
void addEnemiesToList(){
enemies.Add(Bat);
enemies.Add(Bird);
enemies.Add(Ghost);
enemies.Add(Golem);
enemies.Add(Imp);
enemies.Add(Slime);
enemies.Add(Slime2);
enemies.Add(Slime3);
enemies.Add(Zombie);
enemies.Add(ZombieMiner);
enemies.Add(CircleEnemy);
}
void addEnemiesToListSurface(){
enemiesSurface.Add(Ghost);
enemiesSurface.Add(Golem);
enemiesSurface.Add(Imp);
enemiesSurface.Add(Slime);
enemiesSurface.Add(Slime2);
enemiesSurface.Add(Slime3);
enemiesSurface.Add(Zombie);
enemiesSurface.Add(ZombieMiner);
}
}
Scriptableobject storage:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemStorage : MonoBehaviour
{
public static ItemStorage instance;
// public List<Equipment> items;
public Weapon[] weapons;
public Equipment[] items;
public Ability[] abilities;
public GameObject[] weaponPrefabs;
public Attack[] attacks;
void Awake(){
instance = this;
items = (Equipment[]) Resources.FindObjectsOfTypeAll(typeof(Equipment));
weapons = (Weapon[]) Resources.FindObjectsOfTypeAll(typeof(Weapon));
abilities = (Ability[]) Resources.FindObjectsOfTypeAll(typeof(Ability));
attacks = (Attack[]) Resources.FindObjectsOfTypeAll(typeof(Attack));
weaponPrefabs = Resources.LoadAll<GameObject>("PickupItems/Weapons");
foreach (var ability in abilities)
{
ability.offCD = true;
}
}
public Equipment[] getItems(){
return items;
}
}
Every time my game runs all the storage items are added in. Is this bad practice? Should i be storing prefabs, scriptableobjects etc somehow else?