Поэтому я пытаюсь определить, нажимаю ли я на объект с тегом «solarsystem», и если да, то загружаю эту солнечную систему в другую сцену. раньше этот код работал отлично, но теперь он вылетает таким образом, что мне приходится завершить единство из диспетчера задач с помощью кнопки завершения задачи, чтобы даже закрыть его. он просто полностью перестает отвечать.

Вот код, в котором я считаю, что обнаружил ошибку после того, как возился со многими Debug.log, чтобы найти, где остановился код, и, следовательно, выяснить, где единство перестает отвечать:

    RaycastHit[] hit = Physics.RaycastAll(cursorPosition, Vector3.forward,15f);
        Debug.Log("test2");//this is printed to the console - code crashes below this line
        for(int i = 0; i < hit.Length; i++)
        {
            Debug.Log("hit"); // this is never printed to console - code crashes above this line
            if(currentScene == "Universe")
            {
                if(hit[i].collider.gameObject.tag == "SolarSystem")
                {
                    ChangeScene("SolarSystem");
                    SolarSystem clickedSolarSystem = hit[i].collider.gameObject.GetComponent<SystemObjectLink>().LinkedClass;
                    SolarSystem LoadedSolarSystem = SolarSystemCamera.GetComponent<SolarSystem>() as SolarSystem;
                    LoadedSolarSystem = clickedSolarSystem;
                    Debug.Log("generating system clicked on");
                    if (LoadedSolarSystem.preGenerated == false)
                    {
                        LoadedSolarSystem.Generate();
                    }
                    else
                    {
                        LoadedSolarSystem.Regenerate();
                    }
                    break;
                }
            }
            if(currentScene == "SolarSystem")
            {
                if (hit[i].collider != null)
                {
                    if (hit[i].collider.gameObject.tag == "Planet")
                    {
                        Target = hit[i].collider.gameObject;
                        break;
                    }
                    else if (hit[i].collider.gameObject.tag == "Moon")
                    {
                        Target = hit[i].collider.gameObject;
                        break;
                    }
                    Target = hit[i].collider.gameObject;
                }
            }
        }
1
Arcturus groviteer 20 Дек 2018 в 23:53

1 ответ

Лучший ответ

У меня был оператор for(;;) с жестко запрограммированным

    if(<state>){
        break:
    }

Оператор, чтобы разорвать бесконечный цикл. но когда я нажимаю на объект в игре. он проверяет код на наличие ошибок перед его запуском. когда он это делает, он попадает в бесконечный цикл, и поэтому, чтобы исправить это, я сделал это

    for(;errorIndex<99; errorIndex++){

    }

моя ошибка и что я узнал:

Никогда не используйте цикл while(true) или цикл for без возможности выхода из себя (for(;;))

Если движок / редактор единства когда-либо перестает отвечать, это потому, что он зациклен на бесконечном цикле - просмотрите свой код и убедитесь, что ни один из ваших циклов не может продолжаться вечно

0
Arcturus groviteer 21 Дек 2018 в 14:39