如果敌人数量为零,则加载下一个级别

Posted

技术标签:

【中文标题】如果敌人数量为零,则加载下一个级别【英文标题】:Load next level if amount of enemies is zero 【发布时间】:2022-01-15 20:25:54 【问题描述】:

这是我第一次制作 2d 游戏。如果带有“敌人”标签的对象数量为零,我正在尝试加载场景。 第 22 行 似乎不起作用。我没有收到任何错误。

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

public class LevelLoader : MonoBehaviour


    public Animator transition;

    public float transitionTime;

    public GameObject enemyPrefab;
    public GameObject[] enemy;


    // Update is called once per frame
    void Update()
    
        if (enemy == null)
        
            enemy = GameObject.FindGameObjectsWithTag("Enemy");
            Debug.Log("null!");
            LoadNextLevel();
        
    

    public void LoadNextLevel()
    
        StartCoroutine(LoadLevel(SceneManager.GetActiveScene().buildIndex + 1));
    

    IEnumerator LoadLevel(int levelIndex)
    
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(transitionTime);

        SceneManager.LoadScene(levelIndex);
    

enemy = GameObject.FindGameObjectsWithTag("Enemy");

【问题讨论】:

不要把答案放在问题中。只需发布您自己的答案。 【参考方案1】:

所以,我解决了这个问题。问题是条件是在分配变量之前。

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

public class LevelLoader : MonoBehaviour


    public Animator transition;

    public float transitionTime;

    // Update is called once per frame
    void Update()
    
        GameObject[] enemy = GameObject.FindGameObjectsWithTag("Enemy");
        if (enemy == null || enemy.Length == 0)
        
            LoadNextLevel();
        


        //Debug.Log(GameObject.FindGameObjectsWithTag("Enemy"));
    


    public void LoadNextLevel()
    

        StartCoroutine(LoadLevel(SceneManager.GetActiveScene().buildIndex + 1));
    

    IEnumerator LoadLevel(int levelIndex)
    
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(transitionTime);

        SceneManager.LoadScene(levelIndex);
    

【讨论】:

【参考方案2】:

我相信这是因为变量敌人是数组类型而不是列表。数组更难处理,而且大小固定。

相反,请考虑使用List

List<GameObject> enemy = new List<GameObject>();

这里有一些额外的资源可以帮助您理解数组和列表之间的区别。

https://www.w3schools.com/cs/cs_arrays.php https://www.c-sharpcorner.com/article/c-sharp-list/

各自的区别/何时使用

Array versus List<T>: When to use which? https://csharp-station.com/c-arrays-vs-lists/ https://www.educba.com/c-sharp-array-vs-list/

【讨论】:

如果上述方法不起作用,请尝试Debug.Log(GameObject.FindGameObjectsWithTag("Enemy"); 并查看打印的内容。如果打印了一个空数组,这意味着没有找到带有标签 eney 的 GameObjects,问题不在于代码,而是没有带有“敌人”标签的游戏​​对象。【参考方案3】:

最初enemynull

所以,在第一帧(第一次调用Update())它满足if 条件,然后给enemy 赋值。

那么,在第二帧及以后的帧中,enemy 不再是null,因此它不满足if (enemy == null) 条件并且if 语句中的行不会被执行。这意味着,enemy = GameObject.FindGameObjectsWithTag("Enemy")LoadNextLevel(); 行将永远不会在第一帧之后执行。

我的建议是像这样重写Update()

void Update() 
    enemy = GameObject.FindGameObjectsWithTag("Enemy"); // get "Enemies" first
    // then do something by using it
    if (enemy == null) 
        Debug.Log("null!");
        LoadNextLevel();
    

【讨论】:

以上是关于如果敌人数量为零,则加载下一个级别的主要内容,如果未能解决你的问题,请参考以下文章

如果数字为零,如何进入下一个场景

PhysicsBody 使用 SpriteKit 和 Swift 为零

如果 Woocommerce 产品价格为零,则显示联系按钮,否则显示添加到购物车按钮

设计模式之职责链模式应用例题

设计模式之职责链模式应用例题

条纹支付 - 如何暂停订阅(不取消)