How to make multiple objects share same variable

I have multiple players that i want the enemies to attack. I tried using arrays and tags, but my case is different. My script depends on another scripts that makes the player take damage and the enemy treats that script as the player. Here is the script for the enemy that assigns the player to the enemy, this is the one in want to have multiple players in the SC_DamageReciever variable. I think arrays would work, but because of the references to the other script, tags could work.

using UnityEngine;
using UnityEngine.SceneManagement;

public class SC_EnemySpawner : MonoBehaviour
{
    public GameObject enemyPrefab;

    public SC_DamageReceiver Player;
 
    public Texture crosshairTexture;
    public float spawnInterval = 2; //Spawn new enemy each n seconds
    public int enemiesPerWave = 5; //How many enemies per wave
    public Transform[] spawnPoints;

    float nextSpawnTime = 0;
    int waveNumber = 1;
    bool waitingForWave = true;
    float newWaveTimer = 0;
    int enemiesToEliminate;
    //How many enemies we already eliminated in the current wave
    int enemiesEliminated = 0;
    int totalEnemiesSpawned = 0;



    // Start is called before the first frame update
    void Start()
    {
       

        //Wait 10 seconds for new wave to start
        newWaveTimer = 2;
        waitingForWave = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (waitingForWave)
        {
            if (newWaveTimer >= 0)
            {
                newWaveTimer -= Time.deltaTime;
            }
            else
            {
                //Initialize new wave
                enemiesToEliminate = waveNumber * enemiesPerWave;
                enemiesEliminated = 0;
                totalEnemiesSpawned = 0;
                waitingForWave = false;
            }
        }
        else
        {
            if (Time.time > nextSpawnTime)
            {
                nextSpawnTime = Time.time + spawnInterval;

                //Spawn enemy 
                if (totalEnemiesSpawned < enemiesToEliminate)
                {
                    Transform randomPoint = spawnPoints[Random.Range(0, spawnPoints.Length - 1)];

                    GameObject enemy = Instantiate(enemyPrefab, randomPoint.position, Quaternion.identity);
                    SC_NPCEnemy npc = enemy.GetComponent<SC_NPCEnemy>();
                    npc.playerTransform = Player.transform;
                    npc.es = this;
                    totalEnemiesSpawned++;
                }
            }
        }

        if (Player.playerHP <= 0)
        {
            if (Input.GetKeyDown(KeyCode.U))
            {
                Scene scene = SceneManager.GetActiveScene();
                SceneManager.LoadScene(scene.name);
            }
        }
    }

    void OnGUI()
    {
        GUI.Box(new Rect(10, Screen.height - 35, 100, 25), ((int)Player.playerHP).ToString() + " HP");


        if (Player.playerHP <= 0)
        {
            GUI.Box(new Rect(Screen.width / 2 - 75, Screen.height / 2 - 20, 150, 40), "Game Over

Press ‘U’ to Restart");
}
else
{
GUI.DrawTexture(new Rect(Screen.width / 2 - 3, Screen.height / 2 - 3, 6, 6), crosshairTexture);
}

        GUI.Box(new Rect(Screen.width / 2 - 50, 10, 100, 25), (enemiesToEliminate - enemiesEliminated).ToString());

        if (waitingForWave)
        {
            GUI.Box(new Rect(Screen.width / 2 - 125, Screen.height / 4 - 12, 250, 25), "Waiting for Wave " + waveNumber.ToString() + ". " + ((int)newWaveTimer).ToString() + " seconds left...");
        }
    }

    private void NewMethod()
    {
        GUI.Box(new Rect(Screen.width / 2 - 35, Screen.height - 35, 70, 25), Player.weaponManager.selectedWeapon.bulletsPerMagazine.ToString());
    }

    public void EnemyEliminated(SC_NPCEnemy enemy)
    {
        enemiesEliminated++;

        if (enemiesToEliminate - enemiesEliminated <= 0)
        {
            //Start next wave
            newWaveTimer = 2;
            waitingForWave = true;
            waveNumber++;
        }
    }
}

this is the damage reciever

using UnityEngine;

public class SC_DamageReceiver : MonoBehaviour, IEntity
{
    //This script will keep track of player HP
    public float playerHP = 100;
    public SC_CharacterController playerController;
    public SC_WeaponManager weaponManager;

    public void ApplyDamage(float points)
    {
        playerHP -= points;

        if (playerHP <= 0)
        {
            //Player is dead
            playerController.canMove = false;
            playerHP = 0;
        }
    }
}

this is IEntity

//Entity interafce
interface IEntity
{
    void ApplyDamage(float points);
}

thanks in advance :slight_smile:

1 Answer

1

Static variables are shared over every instance of the script.

If you make a static array of list of the SC_DamageReceiver class, you will be able to have all instances of that class add themselves to the list when they’re created