Saltar al contenido

Unity – ¿Cómo detener el modo de reproducción en caso de bucle infinito?

Solución:

Acabo de entrar en esta situación: bucle infinito accidental, atascado en modo de reproducción en una escena con trabajo no guardado, Unity no responde.

Pero tuve la suerte de tener abierto Monodevelop, a pesar de que estaba usando principalmente Sublime para scripts. Presioné el botón para comenzar a depurar cerca de la parte superior izquierda de la ventana Monodevelop, luego presioné el botón de pausa. La ejecución se detuvo en una línea en medio de mi bucle infinito. El administrador de tareas de Windows confirmó que Unity ya no estaba bloqueando la CPU.

En Monodevelop, pude encontrar un objeto obj que la siguiente línea intentaría llamar a un método y usaría la ventana “Inmediato” para ejecutar obj = null. Luego, haga una pausa. Unity ahora se desbloquea debido al error del puntero nulo, y podría sacarlo del modo de reproducción y guardar mi trabajo.

(Unity 2017.4.1f1 Personal, Windows 10 Home x64, Monodevelop 5.9.6)

Tenga en cuenta que tuve la idea de leer la respuesta de @ Kinxil, pero tuve que adoptar un enfoque ligeramente diferente porque no había un “valor de bloqueo”. Tuve un for (;;) bucle que había estado previamente dentro de una corrutina y lo cambié para que esté dentro de un FixedUpdate() sin quitar el lazo. : Entonces, causar una excepción fue la única opción que se me ocurrió.

Lo siguiente funcionó para mí (Props to @LinusR y por extensión @Kinxil) Esto es solo un rápido paso a paso.

Esto debería funcionar para usted si está utilizando Visual Studio con Unity Tools.

Encuentra el bucle:

  1. Abra Visual Studio (si aún no está abierto)
  2. Hacer clic Apegarse a la unidad (si no está ya adjunto)
  3. Hacer clic Romper todo (pausa II símbolo)
  4. Abre el Pila de llamadas, Hilos y Inmediato ventanas. (Todo dentro Depurar → Windows →)
  5. Mirando a la Pila de llamadas, haga clic en los hilos del Hilos ventana.
  6. Deténgase cuando encuentre el hilo en el que está el bucle. (Call Stack ayuda con esto)
  7. Debe estar en el hilo con el bucle para ejecutar los comandos necesarios en el Inmediato ventana.

¡Ahora sácame de aquí !:

[LinusR’s solution seemed to be the most bullet-proof and versatile.]

Romper el ciclo con un valor nulo y algunas otras opciones

  1. En el Inmediato ventana, establezca uno de los objetos / campos / propiedades que aceptan valores NULL utilizados en el bucle en nulo p. ej. para Thread.SpinWait.SpinUntil(() => someObject.NeverTrue());
    • someObject = null;
    • Unity responderá nuevamente en esta instancia (siempre que someObject permanezca nulo).
  2. Una alternativa para ALGUNOS bucles es simplemente romper y cambiar la instrucción o los valores y / o arrastrar la flecha de instrucción actual (flecha amarilla) fuera del ciclo, aunque esto puede no ser posible dependiendo del tipo de ciclo.
    • Piense en cómo funciona el bucle; ¿Con qué frecuencia se ejecuta? ¿Se llamará cada cuadro? etc.
  3. ¿Nada funciona? Lea las otras respuestas aquí, Sea creativo con el Ventana inmediata. También en el futuro sería prudente tener Pausa de error habilitado en todo momento en Unity.

Para mí, esto funcionó.

Cómo salir de un bucle infinito

  1. Abra Visual Studio.
  2. Haga clic en “Adjuntar a Unity” en la parte superior (si aún no lo hizo)
  3. Agregue un punto de interrupción al bucle infinito haciendo clic en el área a la izquierda del número de línea donde está el bucle.
  4. Verá una flecha amarilla donde está el punto de interrupción. Haga clic y arrastre esta flecha a un lugar fuera del bucle (preferiblemente después)
  5. Elimina tu punto de interrupción actual.
  6. Regrese a la unidad y lo más probable es que demore un segundo en descongelarse, pero después de que se descongele, debería poder hacer clic en el botón de reproducción para detener el modo de reproducción.
  7. ¡Auge! Ataque de pánico evitado.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *