C# 关于在失败时重新启动级别的快速问题
我有个简短的问题要问你。我已经准备好了一切。我正在制作一个简单的启动游戏,你需要杀死所有的敌人(不是基于时间的)才能进入下一关。我有两个方法GoToNextLevel()和AllMonsterDied() 需要做一些事情,比如玩家有3次尝试(3次发射,只要他不想基于时间)。 然后每次发射都会检查是否有怪物离开。如果只显示1次尝试较少。3次后,重新启动场景 非常感谢,因为我对c#和unity都是新手,这对我来说意味着整个世界C# 关于在失败时重新启动级别的快速问题,c#,unity3d,C#,Unity3d,我有个简短的问题要问你。我已经准备好了一切。我正在制作一个简单的启动游戏,你需要杀死所有的敌人(不是基于时间的)才能进入下一关。我有两个方法GoToNextLevel()和AllMonsterDied() 需要做一些事情,比如玩家有3次尝试(3次发射,只要他不想基于时间)。 然后每次发射都会检查是否有怪物离开。如果只显示1次尝试较少。3次后,重新启动场景 非常感谢,因为我对c#和unity都是新手,这对我来说意味着整个世界 public class LevelController: MonoBe
public class LevelController: MonoBehaviour
{
[SerializeField] string _nextLevelName;
Monster[] _monsters;
void OnEnable()
{
_monsters = FindObjectsOfType<Monster>();
}
void Update()
{
int currentLevel = SceneManager.GetActiveScene().buildIndex;
if (currentLevel >= PlayerPrefs.GetInt("levelsUnlocked"))
{
PlayerPrefs.SetInt("levelsUnlocked", currentLevel + 1);
}
if (MonsterAreAllDead() )
{
GoToNextLevel();
}
Debug.Log("Level" + PlayerPrefs.GetInt("levelsUnlocked") + "UNLOCKED");
}
void GoToNextLevel()
{
Debug.Log("Go to next level" + _nextLevelName);
SceneManager.LoadScene(_nextLevelName);
}
bool MonsterAreAllDead()
{
foreach (var monster in _monsters)
{
if (monster.gameObject.activeSelf)
return false;
}
return true;
}
}
public类LevelController:monoBehavior
{
[SerializeField]字符串_nextLevelName;
怪物[]_怪物;
void OnEnable()
{
_怪物=FindObjectsOfType();
}
无效更新()
{
int currentLevel=SceneManager.GetActiveScene().buildIndex;
如果(currentLevel>=PlayerPrefs.GetInt(“levelsUnlocked”))
{
PlayerPrefs.SetInt(“levelsUnlocked”,当前级别+1);
}
if(MonsterAreAllDead())
{
GoToNextLevel();
}
Debug.Log(“Level”+PlayerPrefs.GetInt(“levelsUnlocked”)+“UNLOCKED”);
}
void GoToNextLevel()
{
Log(“转到下一级”+_nextLevelName);
SceneManager.LoadScene(_nextLevelName);
}
布尔怪兽死了
{
foreach(怪物中的变量怪物)
{
if(monster.gameObject.activeSelf)
返回false;
}
返回true;
}
}
Monster.cs中的行
private void OnCollisionEnter2D(Collision2D collision)
{
if (SouldDieFromCollision(collision))
{
tickSource.Play();
StartCoroutine(Die());
}
}
IEnumerator Die()
{
_hasDied =true;
GetComponent<SpriteRenderer>().sprite=_deadsprite;
_particleSystem.Play();
yield return new WaitForSeconds(1);
gameObject.SetActive(false);
}
专用void onCollisionInter2D(碰撞2D碰撞)
{
如果(从碰撞(碰撞)开始)
{
tickSource.Play();
启动例程(Die());
}
}
IEnumerator Die()
{
_hasDied=true;
GetComponent().sprite=\u deadsprite;
_particleSystem.Play();
返回新的WaitForSeconds(1);
gameObject.SetActive(false);
}
假设您希望在玩家点击键盘上的N
键时进行下一级发射尝试。当玩家击键时,检查是否所有怪物都已死亡。如果是,请调用
GoToNextLeve()
,否则从可用的尝试中减去1次尝试,然后重新启动当前场景
int attempts;
void OnEnable()
{
attempts = 3;
}
void Update()
{
if (Input.GetKeyUp(KeyCode.H)
{
TryGoToNextLevel();
}
}
void TryGoToNextLevel()
{
if (MonsterAreAllDead() )
{
GoToNextLevel();
}
else
{
attempts--;
}
if (attempts <= 0)
{
SceneManager.LoadScene(
SceneManager.GetActiveScene().name);
}
}
int尝试;
void OnEnable()
{
尝试次数=3次;
}
无效更新()
{
if(Input.GetKeyUp(KeyCode.H)
{
TryGoToNextLevel();
}
}
void TryGoToNextLevel()
{
if(MonsterAreAllDead())
{
GoToNextLevel();
}
其他的
{
企图--;
}
如果(尝试那么你到底尝试了什么,而什么又没有达到预期效果?在GoToNextLevel
中更改玩家设置难道还不够吗?此外,你应该考虑更多基于事件的内容,而不是在Update
中每帧对你的怪物进行民意调查…@derHugo非常感谢你的回答。我尝试了一些If类似(!allMonestersDied){restart level}的语句但我不确定如果我想创造3次机会或是抹杀,它是如何工作的,你当前的代码如何知道,当一次尝试完成时?@derHugo-Hmm,你可能想让我发布我的怪物脚本吗?我想添加变量并将其添加到代码中可能会检查3次怪物是否还活着(每次发射一个)如果不转到下一个场景如果是,则重新启动级别(场景),但不处于活动状态,则转到上一个场景,如-1again:您将如何准确地确定在哪一时刻恰好一次“启动”完成了吗?你不想一直做检查,只想在你说发射完成的那一刻。例如,因为没有任何东西在移动或类似的东西