Ошибка StackOverflow при попытке повторно проверить переменную - PullRequest
0 голосов
/ 01 сентября 2018

Привет, прежде чем я начну, я хочу сообщить всем, что я не только новичок в этом форуме, но и сам Unity и C #, поэтому я прошу прощения, если есть простое решение или другие глупые ошибки.

Хорошо, так что в основном я пытаюсь переключить гравитацию моего игрока, когда он попадает в космос, чтобы добиться этого, я проверяю игроков transform.position.y и проверяю, находится ли он на назначенной высоте, а если нет Я добавляю силу.

Площадь кода:

private void ChangeGravity()
    {
            if (rb.position.y >= 10f)
            {
                SAF = false;
                rb.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezePositionZ;  
            }
            else
            {
                rb.AddForce(0, VerticalForce * Time.deltaTime, 0);
                ChangeGravity();
            }
    }

Для пояснения SAF - это мера предосторожности, чтобы игрок не мог спамить кнопку пробела. Также VerticalForce = 2f, и в ходе моего тестирования я определил, что оператор if может быть истинным (этот тест был установлен для значения y равным 10)

Теперь вот ошибка:

StackOverflowException
UnityEngine.Rigidbody.AddForce (Vector3 force, ForceMode mode)
UnityEngine.Rigidbody.AddForce (Single x, Single y, Single z) (at C:/buildslave/unity/build/Runtime/Dynamics/ScriptBindings/Dynamics.bindings.cs:171)
PlayerMovement.ChangeGravity () (at Assets/Scripts/PlayerMovement.cs:21)
PlayerMovement.ChangeGravity () (at Assets/Scripts/PlayerMovement.cs:22)
(The final line repeats a bunch but I cut that out)

Весь сценарий: The Script


EDIT

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

1 Ответ

0 голосов
/ 01 сентября 2018

Ваш метод не возвращает, он вызывает себя, который, в свою очередь, вызывает себя снова.

Поскольку при вызове функции выделяется некоторая память в стеке потока, этот стек вскоре переполняется, так как имеет ограниченное пространство в несколько мегабайт.

Вызовите этот метод в цикле while, прервите цикл при выполнении условия. Таким образом, в каждой итерации цикла метод возвращается, и стек вызовов не будет расти.

   while (true)
   {
        if (rb.position.y >= 10f)
        {
            SAF = false;
            rb.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezePositionZ;  
            break; //break the loop since condition is met
        }
        else
        {
            rb.AddForce(0, VerticalForce * Time.deltaTime, 0);
            continue; //the condition is not met, so the loop goes on
        }
    }
...