Unity3D Shooter: использование тегов для переключения уровня после убийства всех врагов

Я новичок в Unity и пытался, после некоторых предложений, использовать теги, чтобы узнать количество врагов, которые у меня есть на каждом уровне, и перейти к следующей сцене сразу после устранения всех врагов. Это сценарий, который я использую для вражеских игровых объектов. Я также пометил каждый из них тегом «враг» в Инспекторе единства, но он по-прежнему не работает, когда я запускаю игру. После убийства всех врагов он не переходил на следующую сцену (Успех!). Есть идеи о том, что я делаю неправильно? Есть другие предложения? Большое спасибо за помощь.

Скрипт врагов

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

using UnityEngine.SceneManagement; 

public class BadguyScript : MonoBehaviour
{

  public GameObject[] enemies;

  public int maxHealth;
  public int curHealth;
  private Animator myAnimator;
  private bool isDead;
  [SerializeField]
  private float DespawnTime = 2.5f;
  [SerializeField]
  private string DeathAnimHash = "isDead"; 

  void Start()
  {
      myAnimator = GetComponent<Animator>();
      myAnimator.enabled =true;
      myAnimator.SetBool (DeathAnimHash ,isDead);


      maxHealth = 1;
      curHealth = maxHealth;



  }
  void Update()
  {
      if (curHealth < 1)
      {
          isDead = true;
          myAnimator.SetBool (DeathAnimHash ,isDead);
          Destroy(gameObject,DespawnTime);
      }
      enemies = GameObject.FindGameObjectsWithTag("enemy"); // Checks if enemies are available with tag "Enemy". 
      if (enemies.Length == 0)
      {
          SceneManager.LoadScene("SucessScene"); // Load the scene with name "SucessScene"
      }
  }
  void OnTriggerEnter2D(Collider2D col)
  {
      if (isDead)
         return;
      if (col.tag == "bullet")
      {
          curHealth -= 1;
          Destroy(col.gameObject);
      }
  }
 }

person tigrev    schedule 01.11.2019    source источник


Ответы (2)


Я бы создал для этого игровой объект-держатель скрипта и поместил в него скрипт GameManager. А внутри GameManager.cs, который должен быть одноэлементным классом, вы можете иметь такое свойство:

int _enemyNumber;

public int EnemyNumber{
    get{
        return _enemyNumber;
    }
    set{
        _enemyNumber = value;
    }
}

И когда вам нужно изменить эти значения, используйте некоторые функции, которые вы создадите внутри этого игрового контроллера, например:

public void DecreaseEnemyCount(){
    //do the logic here
}

public void SetEnemyCount(){
    //do the logic here
}

Также вы можете найти информацию о создании одноэлементного класса здесь

person barteezy    schedule 01.11.2019

Вы составляете список со всеми врагами, это хорошая практика, потому что вы улучшите производительность. Но вы проверяете, есть ли враги .Lenght == 0, чего никогда не произойдет, потому что перед тем, как вы добавляете gameObject в список enemies = GameObject.FindGameObjectsWithTag("enemy");

В методе start вы можете искать всех врагов и добавлять их в свой массив, а в update или onTriggerEnter вы удаляете их из своего массива и проверяете длину массива. Думаю, будет проще.

person Eduardo Teixeira de Souza    schedule 01.11.2019
comment
он может инициализировать список каждый раз, когда он входит в уровень, и удалять врагов из списка после их убийства, чтобы он мог проверить, если list.count == 0 и изменение уровня. он может поместить сценарий, чтобы удалить врага из списка врага, поэтому вам не нужно перебирать всех врагов, проверяя, живы ли они. - person Eduardo Teixeira de Souza; 03.02.2021