2017-02-12 1 views
0

Ich baue ein Multiplayer-Spiel mit Einheit. Der Hauptspieler ist ein Prefab, der mit Hilfe des Netzwerkmanagers erstellt wurde und enthält Player Tags und die. Unten ist das feindliche Angriffsskript, das Spieler Tag sucht, aber im Multispieler erhalten nur einen Spieler im Gegenzug. Wie kann ich es ändern, damit der Gameobject Spieler ein Array ist und playerHealth getComponent PlayerHealth bekommen kann.Wie bekomme ich die Komponente mit FindGameObjecstWithTag>

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); 
     } 
    } 
} 
+0

Versuchen Sie, mehrere Player-Objekte und mehrere Player-Health-Referenzen zu speichern? Haben Sie versucht, 'FindGameObjectsWithTag()' zu verwenden und ... durch das Ergebnis zu iterieren? – Serlite

+0

Ich habe es versucht, war aber nicht hilfreich gab einen Fehler ** 'System.Array' enthält keine Definition für 'GetComponent' ** –

+0

Wie planen Sie mehrere Spieler/Gesundheit mit Ihrem aktuellen Skript verwenden? Vorausgesetzt, Sie speichern alle in einer Sammlung, wie werden Sie feststellen, welche von "Attack()" betroffen ist? Kann der Gegner alle Spieler in Reichweite gleichzeitig angreifen? Oder muss es einen wählen? Ich fühle in seinem gegenwärtigen Zustand, dass der Umfang dieser Frage mehr ist, als nur eine Sammlung von Spielern richtig abzurufen und zu speichern - Sie werden danach auch eine Überarbeitung Ihrer Spiellogik brauchen. – Serlite

Antwort

0

Sie sollten FindGameObjectsWithTag mit invoke repeating verwenden müssen. Ein nicht getestetes Code-Snippet ist unten angegeben:

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 

} 
Verwandte Themen