Как индивидуально найти состояние компонента экземпляра объекта в списке - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть список движущихся врагов, и, хотя я смог заставить их удерживать отдельные HP-очки, которые правильно реагируют на урон от пуль, я хотел, чтобы объект-объект прекратил свое движение при достижении 0 HP - но мне удалось только остановите все перечисленные объекты.

HP хранится в простом классе EnemyHP, который содержит только целое число publi c.

Вот часть класса EnemyController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnemyController : MonoBehaviour
{
    private Transform enemyHolder;
    public float speed;
    public GameObject shot;
    public GameObject enemy;
    public GameObject enemy2;
    public Text winText;
    int secCount;
    float timer = 0;
    public float fireRate = 0.997f;
    public int enemyCount;

    void Start()
    {
        enemyCount = 0;
        secCount = 0;
        enemyHolder = GetComponent<Transform>();
        winText.enabled = false;
        InvokeRepeating("MoveEnemy", 0f, 0.016f);
    }
    private List<GameObject> allSpawns = new List<GameObject>();

    void MoveEnemy()
    {
        float xPosition = Random.Range(-11f, 11f);
        int enemyType = Random.Range(0, 8);
        secCount = Random.Range(2, 4);
        timer += Time.deltaTime;
        if (timer >= secCount && enemyCount < 25)
        {
            if (enemyType > 0)
            {
                GameObject spawned = Instantiate(enemy, new Vector3(xPosition, 6, 0), Quaternion.identity);
                allSpawns.Add(spawned);
            }
            else
            {
                GameObject spawned = Instantiate(enemy2, new Vector3(xPosition, 6, 0), Quaternion.identity);
                allSpawns.Add(spawned);
            }
            enemyCount++;
            timer = timer - secCount;
        }
        foreach (GameObject thisEnemy in allSpawns)
        {
          //I expected this part to work
            EnemyHP hpComponent = thisEnemy.GetComponent<EnemyHP>();
            if (hpComponent.health > 0)
            {
                if (thisEnemy != null)
                {
                    thisEnemy.transform.position += new Vector3(0, -1 * speed * Time.deltaTime, 0);
                }
            }
        } ...

Вот контроллер пули, который корректно воздействует на отдельные HP:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletController : MonoBehaviour
{
    private Transform bullet;
    public int power;
    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        bullet = GetComponent<Transform>();
    }
    void FixedUpdate()
    {
        bullet.position += transform.up * speed;
        if (bullet.position.y >= 10)
            Destroy(gameObject);
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag ("Enemy") || other.CompareTag("Enemy2"))
        {
            EnemyHP hpComponent = other.gameObject.GetComponent<EnemyHP>();
            hpComponent.health = hpComponent.health - power;
            Destroy(gameObject);
            if (hpComponent.health < 1)
            {
                hpComponent.health = 0;

                Destroy(other.gameObject, 1);
                PlayerScore.playerScore++;
            }
        }
    }
}

А это класс EnemyHP:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyHP : MonoBehaviour
{
    public int health;
}

Как это исправить? Заранее спасибо.

...