【问题标题】: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");

【问题讨论】:

  • 不要把答案放在问题中。只需发布您自己的答案。

标签: c# unity3d


【解决方案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>();
    

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

    各自的区别/何时使用

    【讨论】:

    • 如果上述方法不起作用,请尝试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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多