2016-11-01 5 views
0
using System.Collections; 

public class TowerAttack : MonoBehaviour { 

public float timeBetweenAttacks = 0.5f; 
public int attackDamage = 10; 

GameObject player; 
PlayerHealth playerHealth; 
bool playerInRange; 
float timer; 

void Awake() 
{ 
    player = GameObject.FindGameObjectWithTag ("Player"); 
    playerHealth = player.GetComponent<PlayerHealth>(); 

} 

void OnTriggerEnter(Collider other) 
{ 
    print (other); 
    if (other.gameObject == player) 
     playerInRange = true; 
} 

void OnTriggerExit(Collider other) 
{ 
    if (other.gameObject == player) 
     playerInRange = false; 
} 

// Update is called once per frame 
void Update() { 

    timer += Time.deltaTime; 

    if (timer >= timeBetweenAttacks && playerInRange) 
     Attack(); 
    if (playerHealth.currentHealth <= 0) 
     print ("Player's dead"); 
} 

void Attack() 
{ 
    timer = 0f; 
    print (playerHealth); 
    if (playerHealth.currentHealth > 0) 
     playerHealth.TakeDamage (attackDamage); 
} 
} 

Я использую этот код для объекта, называемого башней, и имеет полевой коллайдер с активным istrigger. На поле появляются несколько объектов с прикрепленным скриптом «PlayerHealth» и помечены как «Player». Однако только первый «Игрок», который входит в коллайдер box, получает свое здоровье, а остальные объекты «Player» остаются здоровыми.Как удалить здоровье нескольких врагов?

ответ

0

Существует несколько объектов, которые появляются на поле с помощью «PlayerHealth» сценарий прилагается и помечен как «Player». Однако только первые «Игрок», которые входят в коллайдер box, получают свое здоровье, и остальная часть объектов «Player» остается здоровой.

Код playerHealth = player.GetComponent<PlayerHealth>(); только код PlayerHealth только с одного объекта.

Чтобы удалить здоровье из нескольких врагов, вы должны выполнить команду other.GetComponent<PlayerHealth>() каждый раз, когда вызывается OnTriggerEnter.

void OnTriggerEnter(Collider other) 
{ 
    print(other); 
    //Remove health only if the Object is tagged as Player 
    if (other.CompareTag("Player")) 
    { 
     other.GetComponent<PlayerHealth>().TakeDamage(attackDamage); 
     playerInRange = true; 
    } 
} 
0
player = GameObject.FindGameObjectWithTag ("Player"); 

Это для установки одного игрока. Если есть несколько игроков, один из игроков установлен в переменную. playerHealth = player.GetComponent<PlayerHealth>(); также является только игроком. Вы должны сделать, как показано ниже.

using System.Collections; 

public class TowerAttack : MonoBehaviour 
{ 
    public float timeBetweenAttacks = 0.5f; 
    public int attackDamage = 10; 

    GameObject[] players; 
    bool playerInRange; 
    float timer; 

    void Awake() 
    { 
     players = GameObject.FindGameObjectsWithTag ("Player"); 
     // FindGameObjectWithTag => FindGameObjectsWithTag 
    } 

    void OnTriggerEnter(Collider other) 
    { 
     print (other); 
     if (other.tag == "Player") 
      playerInRange = true; 
    } 

    void OnTriggerExit(Collider other) 
    { 
     if (other.tag == "Player") 
      playerInRange = false; 
    } 

    void Update() 
    { 
     timer += Time.deltaTime; 

     if (timer >= timeBetweenAttacks && playerInRange) 
      Attack(); 
     for (int i = 0; i < players.Length; i++) 
     { 
      if (players [i].GetComponent<PlayerHealth>().currentHealth <= 0) 
       print ("Player's dead") 
     } 
    } 

    void Attack() 
    { 
     timer = 0f; 
     print (playerHealth); 
     if (playerHealth.currentHealth > 0) 
      playerHealth.TakeDamage (attackDamage); 
    } 
} 

Если вы хотите, чтобы сделать TowerAttackAttack() всех игроков в диапазоне, в то же время, вы можете применить код, приведенный выше. Но, если вы хотите атаковать игроков один за другим, переместите функцию в Update() на OnTrigger* методов. Тогда вам может понадобиться этот метод OnTriggerStay.

Смежные вопросы