Загрузите сцену, когда все враги умирают - PullRequest
0 голосов
/ 08 мая 2019

Я создаю игру лазерного защитника в единстве, и у меня есть проблема, когда я стреляю в первого врага, он ведет меня прямо к сцене NextLevelMenu, но я хочу, чтобы она загружалась, когда все враги убиты (на этом уровне у меня есть 5 врагов убить). Мне сказали, что я должен послать ссылку на случай его появления всем противникам, но я не совсем понял. Может кто-нибудь помочь, пожалуйста?

EnemySpawner Сценарий:

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

public class EnemySpawner : MonoBehaviour {

[SerializeField] GameObject EnemyPreFab;
[SerializeField] int MaxEnemies = 30;
[SerializeField] float EnemySpawnTime = 1.00001f;
[SerializeField] GameObject FirstWaypoint;
int CurrentNumOfEnemies = 0;
public LevelManager myLevelManager;
public int maximumnumberofhits = 0;
public static EnemySpawner Instance = null;
int timesEnemyHit;




IEnumerator SpawningEnemies()
{
    while(CurrentNumOfEnemies <= MaxEnemies)
    {
        GameObject Enemy = Instantiate(EnemyPreFab, this.transform.position, Quaternion.identity);
        CurrentNumOfEnemies++;
        yield return new WaitForSeconds(EnemySpawnTime);
    }
}

void Start()
{
    if (Instance == null)
        Instance = this;
    StartCoroutine(SpawningEnemies());
    timesEnemyHit = 0;
    if (this.gameObject.tag == "EnemyHit")
    {
        CurrentNumOfEnemies++;
    }


}

public void OnEnemyDeath()
{
    CurrentNumOfEnemies--;
    if (CurrentNumOfEnemies < 1)
    {
        // You killed everyone, change scene: 
        LaserLevelManager.LoadLevel("NextLevelMenu");
    }
 }


}

Сценарий EnemyShooting:

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

public class EnemyShooting : MonoBehaviour {


[SerializeField] float EnemyLaserSpeed = 10f;
[SerializeField] float EnemyLaserFireTime;
[SerializeField] GameObject LaserBulletEnemyPreFab;
[SerializeField] int MaxNumberOfHits = 1;

int CurrentNumberOfHits = 0;
Coroutine FireCoroutine;

void OnTriggerEnter2D(Collider2D collider)
{
    if(collider.gameObject.tag == "PlayerLaser")
    {
        if(CurrentNumberOfHits < MaxNumberOfHits)
        {
            CurrentNumberOfHits++;
            Destroy(collider.gameObject);
            Score.ScoreValue += 2;//The user will be rewarded 1 point
        }
    }
}


void DestroyEnemy()
{
    if(CurrentNumberOfHits >= MaxNumberOfHits)
    {
        Destroy(gameObject);
        EnemySpawner.Instance.OnEnemyDeath(); // Tell the EnemySpawner that someone died


    }
}

private void Fire()
{
    FireCoroutine = StartCoroutine(ShootContinuously());
}

void BecomeVisible()
{
    Fire();
}

IEnumerator ShootContinuously()
{
    while (true)
    {
        GameObject LaserBulletEnemy = Instantiate(LaserBulletEnemyPreFab, this.transform.position, Quaternion.identity) as GameObject;
        LaserBulletEnemy.GetComponent<Rigidbody2D>().velocity = new Vector2(0, EnemyLaserSpeed);
        EnemyLaserFireTime = Random.Range(0.5f, 0.9f);
        yield return new WaitForSeconds(EnemyLaserFireTime);
    }
}
// Use this for initialization
void Start () {

    BecomeVisible();
}

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

    DestroyEnemy();

    }
  }

1 Ответ

2 голосов
/ 08 мая 2019

Я бы добавил два поля в скрипт spawner.EnemiesToNextLevel и KilledEnemies.Затем в OnEnemyDeath () вашего создателя вы можете увеличивать KilledEnemies при каждом его вызове, а затем спрашивать, если KilledEnemies> = EnemiesToNextLevel, прежде чем менять сцену.

Конечно, есть много других способов сделать это.Но для меня это самое простое.

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