这是我第一次做一个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");
发布于 2021-12-11 21:31:16
所以我解决了这个问题。问题是,条件是在分配变量之前。
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);
}
}
发布于 2021-12-11 15:44:20
我认为这是因为变量敌人是数组的类型,而不是列表。数组更难处理,而且大小是固定的。
相反,请考虑使用List
List<GameObject> enemy = new List<GameObject>();
这里有一些额外的资源来帮助您理解数组和列表之间的区别。
差异/何时使用每个
发布于 2021-12-11 16:51:51
最初,enemy
是null
。
因此,在第一个帧(第一次调用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();
}
}
https://stackoverflow.com/questions/70316460
复制相似问题