C# 关于在失败时重新启动级别的快速问题

C# 关于在失败时重新启动级别的快速问题,c#,unity3d,C#,Unity3d,我有个简短的问题要问你。我已经准备好了一切。我正在制作一个简单的启动游戏,你需要杀死所有的敌人(不是基于时间的)才能进入下一关。我有两个方法GoToNextLevel()和AllMonsterDied() 需要做一些事情,比如玩家有3次尝试(3次发射,只要他不想基于时间)。 然后每次发射都会检查是否有怪物离开。如果只显示1次尝试较少。3次后,重新启动场景 非常感谢,因为我对c#和unity都是新手,这对我来说意味着整个世界 public class LevelController: MonoBe

我有个简短的问题要问你。我已经准备好了一切。我正在制作一个简单的启动游戏,你需要杀死所有的敌人(不是基于时间的)才能进入下一关。我有两个方法GoToNextLevel()和AllMonsterDied()

需要做一些事情,比如玩家有3次尝试(3次发射,只要他不想基于时间)。 然后每次发射都会检查是否有怪物离开。如果只显示1次尝试较少。3次后,重新启动场景

非常感谢,因为我对c#和unity都是新手,这对我来说意味着整个世界

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:您将如何准确地确定在哪一时刻恰好一次“启动”完成了吗?你不想一直做检查,只想在你说发射完成的那一刻。例如,因为没有任何东西在移动或类似的东西