2012-05-27 22 views
24

En este momento, lo que estoy haciendo es abrir Unity, hacer doble clic en uno de esos guiones que he escrito, luego MonoDevelop se abre, ahora tengo que cerrar la unidad y en MonoDevelop Hago Run >> Run with >> Unity Debugger.Depuración con unidad

Después de que se abre la Unidad y cuando presiono el botón play en la unidad, se inicia la sesión de depuración. Pero solo una vez. Si detengo esta sesión en Unity o MonoDevelop, tengo que repetir todo este procedimiento una vez más, lo cual es muy tedioso. Tengo que abrir Unity, cerrar Unity, (Tengo que cerrarlo porque el siguiente paso, que es Run >> Run with >> Unity Debugger, abrirá la unidad y si la unidad ya está abierta me aparece un error al decir que solo una instancia de unidad puede abrir un proyecto en una hora).

Lo que estoy pidiendo es:
¿Hay alguna mejor flujo de trabajo que me libere de esta tediosa encendido y apagado de la unidad, y cada vez que detener la depuración sesión me acaba de comenzar normalmente sin hacer estas repeticiones tediosas?
Gracias.

Respuesta

25

Use 'Adjuntar' en el menú de depuración de MonoDevelop; deberías poder adjuntar al proceso de Unity en ejecución de esa manera. (Es posible que deba asegurarse de que la opción apropiada esté activada en las preferencias de Unity).

+0

Sí, si adjunta el depurador MonoDevelop al editor de la Unidad ya se está ejecutando, entonces no hay necesidad de cerrar y volver a abrir la unidad. – yoyo

+1

La vinculación al proceso de unidad actualmente en ejecución es sin duda la mejor manera, que lo que OP está haciendo. Lo he descubierto al intentar depurar varias veces, usando el mismo procedimiento que OP, y de repente vi que hay otra opción también. Lo intenté y funcionó. – noob

+0

Estoy sorprendido de que esta no sea la opción predeterminada para smallB. –

3

¿Conoces la ventana "Consola" de Unity? Debería poder abrirlo desde Menú/Windows/Consola. Actuará como un depurador que le dará errores y advertencias tanto durante la precompilación como durante el tiempo de ejecución. Si malinterpreté la pregunta, házmelo saber.

1

La mejor manera de utilizar el Debug.Log() para la depuración en Unity si su problema es adecuado para aplicar esto.

4

Otra forma de depurar es mediante el uso de la:

Debug.LogError("foo"); 

o

Debug.LogWarning("foo"); 

Otra nota es que en realidad se puede unir objetos al registro. Esto hará que el editor resalte que el objeto es una pregunta en caso de que esté iterando sobre una lista de GameObjects. es decir .:

Debug.LogWarning("this object broke", gameObject); 

Si activa "Pausa de error" en la ventana de la consola, el juego se detendrá automáticamente cuando se alcance el LogError. Pero ten cuidado, se detendrá cada vez que se produzca un error.

1

Estoy usando los complementos UnityVS, que pueden depurar proyectos de Unity con Visual Studio. Muy conveniente.

tener una cuenta Google con UnityVS

2

Recientemente, Microsoft adquirió SyntaxTree, el creador de UnityVS plug-in para Visual Studio, por lo que va a ser liberado de forma gratuita muy pronto. UnityVS es un complemento imprescindible para cada desarrollador de Unity3D, debido a su productividad y la capacidad o depuración de los juegos de Unity3D en Visual Studio.

http://unityvs.com/

0

Hay dos maneras de eliminar el código en la unidad: una vez que Log está básicamente dentro de Unity y la otra es Debugger, que es compatible con VS y Mono. Sí, tiene un proceso muy horrible para comprobar por punto de depuración que cuál es el valor de ayb, etc. así que aquí está mi opinión de que use solo lo que es mejor para usted, es decir, no necesita punto de depuración solo por saber el valor de a y b solo registrarlo. y cuando hay necesidad de un punto de depuración ya conoce el método.

0

Puede consultar usando MS Visual Studio Community y obtener la integración de Unity que también proporcionan en su sitio web. Hace poco probé y es genial, obtienes una funcionalidad de depuración bastante completa con uno de los mejores IDE disponibles. Junto con Unity puedes obtener incrementos de productividad agradables, no solo en términos de capacidades de depuración, sino también en términos de conjunto de características.

En caso de que quiera comprobar que funciona, aquí hay un enlace a la versión comunitaria del IDE: https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx

Aquí es también un enlace a la Unidad integraiton he mencionado: https://www.visualstudio.com/features/unitytools-vs

creo que sirve , un compañero desarrollador me convirtió de Mono y sinceramente, no podría estar más feliz con esa configuración (a menos que algún IDE integre el botón "haz que funcione" de una vez por todas;)).

0

Puede usar el botón Ejecutar (parece un botón de reproducción en la esquina superior izquierda) para conectarse al Editor de Unity para la depuración, pero si no se está conectando a Unity con éxito, puede verificar que el complemento apropiado está habilitado en las preferencias de su Administrador de complementos.

de Windows: Herramientas> Administrador de complementos> Unidad> Mono suave depurador de Apoyo a la Unidad

OSX: Unidad> en Administrador> Unidad> Mono suave depurador de Apoyo a la Unidad

(SELECT y haga clic en habilitar.)

0

use debug.log ("Mensaje"); para la depuración

0

Algo que me gusta hacer también es hacer accesos directos para registrar datos útiles dentro del Editor de Unity. Por ejemplo, registrar el estado actual de todos mis logros activos.

[MenuItem("My Game/Runtime debug/Achievement states")] 
public static void LogAchievementStates() 
{ 
    foreach (AchievementState achievementState in Data.achievementStates) 
    { 
     Debug.Log ("Achievement " + achievementState.name + " is at " + achievementState.completion + "%"); 
    } 
} 

Haciendo esto dentro de una secuencia de comandos del editor se mostrará un botón de menú para ejecutar ciertas acciones.

2

En MonoDevelop, hay un botón cerca de la parte superior de la ventana que dice "adjuntar a la unidad". Si haces esto antes de reproducir tu escena, cualquier punto de interrupción establecido en MonoDevelop detendrá el hilo principal allí.

Si solo está intentando inspeccionar valores, Debug.log (mensaje) imprime datos directamente en la consola de unity.

Ambos se pueden utilizar en el modo de reproducción normal.

1

Siempre he cambiado el editor de scripts predeterminado (preferencias de unidad -> herramientas externas -> editor de scripts externo) a visual studio. Esto le permite utilizar puntos de corte y macros de preprocesador para facilitar la depuración.Cuando desee iniciar la depuración, presione f5 en visual studio para conectarlo a la unidad, luego toque como siempre y si se llega a un punto de interrupción, el visual studio toma el control.

Usted no tiene que cambiar nada más y no tendrá que seguir de apertura y cierre cosas como estás ahora.

0

Con Unity 5.5 herramientas de Visual Studio son incorporados, se puede conectar la unidad y puede iniciar la depuración con un solo clic

es decir después de Edit > Preferences > External tools > External script editor > Visual studio

0

La manera más fácil de depurar está utilizando debug.log (""); pero esto le cuesta su rendimiento, entonces, ¿cómo puede depurar más fácilmente?

bien aquí es la respuesta:

iniciar la depuración, pulse el puntero del ratón hasta el borde extremo izquierdo del editor (junto al número de línea) y aparecerá un punto rojo, que le acaba de crear un punto de interrupción ! enter image description here

Esto no va a hacer nada por ahora, sin embargo, si ahora va a la unidad y pulse el juego en su editor de ventanas que va a pasar algo grande ...

enter image description here

En la parte inferior de la ventana , si tiene la ventana de locales abierta (si no, vaya a Ver> Depurar Windows> Locales), verá todas las variables que existen actualmente en la instancia local y sus valores en el momento del punto de interrupción.

para continuar la ejecución de aplicaciones, sólo tiene que pulsar el botón “Play” en MonoDevelop.

Su script continuará su ejecución (y editor de la Unidad ya no será congelado). Por supuesto, en este caso, la secuencia de comandos llegará al punto de interrupción de nuevo en el siguiente fotograma. Simplemente haga clic con el botón izquierdo en el punto de interrupción en MonoDevelop y presione de nuevo el botón Reproducir para que no vuelva a ejecutar el punto de interrupción.

se puede hacer más cosas con él, por ejemplo:

con puntos de interrupción, puede hacer que se detengan la aplicación en ejecución cuando se cumplan ciertas condiciones. Por ejemplo, imagine que desea verificar cuáles son los valores cuando la variable fSpeed ​​alcanza 10. Para hacerlo, presione el botón Parar en MonoDevelop, haga clic con el botón derecho en su punto de corte y luego presione Propiedades de punto de interrupción.

enter image description here

establecer la condición de “Break cuando la condición es verdadera” y establecer la “expresión de la condición” a “fSpeed> = 10” y, a continuación, pulse OK.

Vuelva a colocar el editor de la unidad y pulse el botón Reproducir de la Unidad, cuando la condición se cumple el punto de interrupción se dispara y detener la aplicación.

Una nota sobre el uso de Puntos de interrupción de condición: Causan problemas de rendimiento ya que tiene que validar la expresión cada vez que se ejecuta.

esto debería ser en general mejor que debug.log (""); al menos si esto es lo que deseas.

0

Creo que la pregunta es después, es una forma de lanzar un "ejecutable de juego unificado" y adjuntar el depurador.
Algo así como ...
creando símbolos de depuración con gcc, creando la aplicación con DEBUG habilitado y ejecutando el programa ejecutable con gdb para depurarlo. De esta forma, puede iniciar sesiones de depuración sin usar un IDE. Pero eso está en C usando gcc ... en C# no hay necesidad de símbolos de depuración para el depurador adjunto para ver el código y se ejecuta en una máquina virtual.

Hay una conversación abierta acerca de cómo esto se puede hacer aquí:
https://github.com/0xd4d/dnSpy/issues/393

Algunas notas rápidas para alguien no versado en lenguas de la máquina virtual. C# produce un lenguaje intermedio cuando se compila. Contrariamente a C, por ejemplo, que produce código de máquina, ejecutado directamente por la CPU. En el caso de C# este lenguaje intermedio es llamado Common Language (porque es común para todos los lenguajes .NET como VB.NET, C# .NET y C++. NET. Este lenguaje intermedio no es ejecutado directamente por la CPU sino por una máquina virtual instanciado una vez por aplicación o proceso, que se llama CLR (Common Language Runtime). Esto significa que la mayoría de las veces, si las variables y métodos no son reemplazados por galimatías (que se llama ofuscación), el programa se puede leer directamente por un depurador conectado al ejecutable

De acuerdo con la conversación, el motor de unidad no utiliza el .NET CLR sino un CLR separado (potencialmente modificado) incrustado en el motor. Describen formas de hacerlo, pero, cree que es más seguro y fácil de usar el Editor de Unity.

¡La unidad se basa en el editor de todos modos! Por ejemplo, dentro del contexto del editor, puede cambiar las variables y las referencias públicas mientras juega el juego, que no es un enfoque de programación "clásico". Pero es un enfoque clásico de depuración.

Por último, hay cosas como los hilos del programa que no son de código abierto, por lo que dudo que cualquier herramienta externa pueda encontrar su camino alrededor del código. Incluso si es un lenguaje común puro, lo dudo seriamente porque si fuera CL puro no habría necesidad de incluir un CLR separado (potencialmente personalizado) en el motor.

Todo el malentendido en mi opinión, es causado por el hecho de que el lenguaje que usa Unity no es exactamente C#, sino una variante de unidad que se parece a C# y puede ser compatible con C# pero no saber hasta qué punto. Entonces, el "CLR" que está programando en Unity es en realidad el motor de la unidad en sí mismo. Un "CLR" se centró en renderizar juegos en muchas plataformas y no en el clásico C# CLR.

Sobre las otras respuestas:
- MonoDevelop le permite utilizar puntos de interrupción y macros del preprocesador tan bien como cualquier otro IDE.
- En cuanto a la depuración de texto utilizando el registro. Por supuesto, es posible, pero esto es lo que se hace cuando "depuración real" no está disponible.


Cuestiones relacionadas