- Home /
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\nPress '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 :)
Answer by Zaeran · Dec 18, 2020 at 06:30 PM
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
Your answer
Follow this Question
Related Questions
Using similar to GameObject.FindObjectsWithTag but for tag.contains. 0 Answers
Need help with setting all items of a specific tag to "inactive" when i die. 0 Answers
Enable Disable Components attached to tagged Game Objects 1 Answer
Need help with setting all items of a specific tag to "inactive" when i die. 1 Answer
Can a tagged object exclude itself from FindGameObjectWithTag? 3 Answers