- Home /
Referencing a list full of instances of a class in a different script
Hi, I'm currently making a dungeon crawler that contains a list full of instances of an enemy class. I have one script that sets up the class "LivingCreature" and also a sub class of this called "Enemy". Every time an enemy is spawned in script1 (placeCube), it adds an instance of the enemy class to an array called enemyArray. This is the important code of script 1:
public class placeCube : MonoBehaviour
{
public GameObject HankWithClub;
public List<Enemy> enemyList = new List<Enemy>();
public class LivingCreature
{
public string Name { get; set; }
public int ID { get; set; }
public int MaximumHealth { get; set; }
public int CurrentHealth { get; set; }
public LivingCreature(string name, int iD, int maximumHealth, int currentHealth)
{
Name = name;
ID = iD;
MaximumHealth = maximumHealth;
CurrentHealth = currentHealth;
}
}
public class Enemy : LivingCreature
{
public int EnemyBaseDamage { get; set; }
public float Speed { get; set; }
public int Direction { get; set; }
public GameObject object { get; set; }
public Enemy(int enemyBaseDamage, float speed, int direction, string name, int iD, int maximumHealth, int currentHealth, GameObject object) : base(name, iD, maximumHealth, currentHealth)
{
EnemyBaseDamage = enemyBaseDamage;
Speed = speed;
Direction = direction;
Object = object;
}
}
void DrawRoom(ref int[,] grid, ref string[,] spawnGrid, List<Enemy> enemyList)
{
GameObject enemy = Instantiate(HankWithClub, new Vector3(10 * a, -1f, 10 * b), rotation);
enemy.name = "HankWithClub" + hankCount.ToString();
enemyList.Add(new Enemy(20, 5, direction,"Hank", hankCount, 100, 100, enemy));
}
}
In a script that is attached to every enemy that is spawned (called Enemy Initialisation), I would like it to search from the list to find the instance of the enemy class that has the same object as itself, and then take all the variables from that instance and make them local for that object. eg. code would look something like this:
foreach <enemy in enemyList>
{
if(enemyList(i).object == this)
{
int health = enemyList(i).currentHealth;
int maxHealth = enemyList(i).maximumHealth;
//etc
}
}
The above code is just a plan and might not work exactly, however before I can test it I need to reference both the class enemy and the list for this new script. I can use GetComponent<> to reference an array from a different script however I can't seem to make it work for a list, or for referencing a class. Can I reference the list straight away, or do I need to reference the class on its own first? If so how would I approach that, is GetComponent the way forward?
Thanks for the help.
Answer by AbubakrKhan · Feb 11, 2019 at 10:13 PM
Use singleton pattern to reference all the instances in other script its easy.
public class placeCube : MonoBehaviour
{
private static placeCube instance=null;
private placeCube(){
}
public static placeCube Instance{
get
{
if (instance==null)
{
instance = new placeCube();
}
return instance;
}
public class LivingCreature{
void methodInLivingCreature(){
}
}
public class Enemy:LivingCreature{
methodInEnemy(){
}
}
void methodInPlaceCube(){
}
}
public class newClass : MonoBehaviour{
void start() {
placeCube.Instance.methodInPlacecCube();
placeCube.Enemy enemyInstance = new placeCube.Enemy();
enemyInstance.methodInLivingCreature();
enemyInstance.methodInEnemy();
}
}
Do it this way. If that helps and answer your question mark it answered.