首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果敌人数量为零,则加载下一个级别

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

Stack Overflow用户
提问于 2021-12-11 15:28:58
回答 3查看 76关注 0票数 0

这是我第一次做一个2d游戏。如果带有“敌人”标签的物体数量为零,我将尝试加载一个场景。22行似乎不起作用。我没有任何错误。

代码语言:javascript
运行
复制
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);
    }
}
代码语言:javascript
运行
复制
enemy = GameObject.FindGameObjectsWithTag("Enemy");
EN

回答 3

Stack Overflow用户

发布于 2021-12-11 21:31:16

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

代码语言:javascript
运行
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-11 15:44:20

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

相反,请考虑使用List

代码语言:javascript
运行
复制
List<GameObject> enemy = new List<GameObject>();

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

差异/何时使用每个

票数 0
EN

Stack Overflow用户

发布于 2021-12-11 16:51:51

最初,enemynull

因此,在第一个帧(第一次调用Update() )中,它满足if条件,然后将一些东西分配给enemy

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

我的建议是重写Update(),如下所示:

代码语言:javascript
运行
复制
void Update() {
    enemy = GameObject.FindGameObjectsWithTag("Enemy"); // get "Enemies" first
    // then do something by using it
    if (enemy == null) {
        Debug.Log("null!");
        LoadNextLevel();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70316460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档