Unity3D Shooter: Использование тегов для переключения уровня после убийства всех врагов - PullRequest
0 голосов
/ 01 ноября 2019

Я новичок в 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);
      }
  }
 }

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

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

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

0 голосов
/ 01 ноября 2019

Я бы создал для этого игровой объект-держатель скрипта и поместил бы внутри него скрипт 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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...