Reputation: 261
I am building a multiplayer game using unity. The main player is a prefab spawned using network manager and contains Player tag and the. Down below is the enemy attack script that searches of Player tag but in multiplayer get only one Player in return.How can i alter it so that the Gameobject player is an array and playerHealth can getcomponent PlayerHealth.
public class EnemyAttack : MonoBehaviour
{
public float timeBetweenAttacks = 0.5f; // The time in seconds between each attack.
public int attackDamage = 10; // The amount of health taken away per attack.
Animator anim; // Reference to the animator component.
GameObject player; // Reference to the player GameObject.
PlayerHealth playerHealth; // Reference to the player's health.
EnemyHealth enemyHealth; // Reference to this enemy's health.
bool playerInRange; // Whether player is within the trigger collider and can be attacked.
float timer; // Timer for counting up to the next attack.
void Awake ()
{
// Setting up the references.
player = GameObject.FindGameObjectWithTag ("Player");
playerHealth = player.GetComponent <PlayerHealth> ();
enemyHealth = GetComponent<EnemyHealth>();
anim = GetComponent <Animator> ();
}
void OnTriggerEnter (Collider other)
{
// If the entering collider is the player...
if(other.gameObject == player)
{
// ... the player is in range.
playerInRange = true;
}
}
void OnTriggerExit (Collider other)
{
// If the exiting collider is the player...
if(other.gameObject == player)
{
// ... the player is no longer in range.
playerInRange = false;
}
}
void Update ()
{
// Add the time since Update was last called to the timer.
timer += Time.deltaTime;
// If the timer exceeds the time between attacks, the player is in range and this enemy is alive...
if(timer >= timeBetweenAttacks && playerInRange && enemyHealth.currentHealth > 0)
{
// ... attack.
Attack ();
}
// If the player has zero or less health...
if(playerHealth.currentHealth <= 0)
{
// ... tell the animator the player is dead.
anim.SetTrigger ("PlayerDead");
}
}
void Attack ()
{
// Reset the timer.
timer = 0f;
// If the player has health to lose...
if(playerHealth.currentHealth > 0)
{
// ... damage the player.
playerHealth.TakeDamage (attackDamage);
}
}
}
Upvotes: 0
Views: 1775
Reputation: 10561
You should need to use FindGameObjectsWithTag with invoke repeating. A untested code snippet given below:
public GameObject[] playersList;
void Start() {
//Invokes the method methodName in time seconds,
//then repeatedly every repeatRate seconds.
InvokeRepeating("CheckPlayers", 2.0f, 0.3f);
}
public void CheckPlayers(){
//assign player in the player list
playersList= GameObject.FindGameObjectsWithTag ("Player");
//now playersList contains all player, do what you want with it
}
Upvotes: 1