如果敌人数量为零,则加载下一个级别
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 的 GameObject
s,问题不在于代码,而是没有带有“敌人”标签的游戏对象。【参考方案3】:
最初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();
【讨论】:
以上是关于如果敌人数量为零,则加载下一个级别的主要内容,如果未能解决你的问题,请参考以下文章
PhysicsBody 使用 SpriteKit 和 Swift 为零