{"id":12933,"date":"2022-01-31T12:00:13","date_gmt":"2022-01-31T10:00:13","guid":{"rendered":"https:\/\/www.espai.es\/blog\/?p=12933"},"modified":"2022-01-31T18:21:40","modified_gmt":"2022-01-31T16:21:40","slug":"buenas-practicas-en-c-2","status":"publish","type":"post","link":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/","title":{"rendered":"Buenas pr\u00e1cticas en C# (Parte 3)"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en <a href=\"https:\/\/www.espai.es\/blog\/?s=C%23\">C#<\/a> para <a href=\"https:\/\/www.espai.es\/blog\/?s=unity\">Unity<\/a>, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el <a href=\"https:\/\/www.espai.es\/blog\/2021\/11\/buenas-practicas-en-c\/\">primer<\/a> y el <a href=\"https:\/\/www.espai.es\/blog\/2021\/12\/aprende-las-buenas-practicas-en-c-y-haz-programas-faciles-de-entender\/\">segundo<\/a> art\u00edculo.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2>Buenas pr\u00e1cticas en C#<\/h2>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Usa nombres descriptivos en tus variables (y funciones)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Usa clases de utilidad para tareas comunes<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Almacena la informaci\u00f3n en objetos en lugar de arrays<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">No abuses de las variables est\u00e1ticas<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Alinea el c\u00f3digo con las llaves en vertical<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Crea las variables como privadas si no planeas compartirlas<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Evita los comentarios innecesarios (si usas bien el punto 1).<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Usa Enums<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Evita funciones con muchos par\u00e1metros. Si es necesario usa un struct.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">No silencies los errores (Exception)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">BONUS: ESPEC\u00cdFICAS PARA UNITY<\/span><\/h2>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Guarda las referencias necesarias en el <a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/MonoBehaviour.Start.html\">Start()<\/a><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Usa <a href=\"https:\/\/docs.unity3d.com\/es\/530\/ScriptReference\/MonoBehaviour-print.html\">print()<\/a> en todas partes<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">No todo son <a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/GameObject.html\">GameObjects<\/a><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Usa \u00ab<a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/RequireComponent.html\">RequireComponent<\/a>\u00bb<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Update vs <a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/MonoBehaviour.FixedUpdate.html\">FixedUpdate<\/a><\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas en C# 1: Guarda las referencias necesarias en el Start()<\/span><\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00c9chale un vistazo a este c\u00f3digo:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-12935\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1-1024x270.png\" alt=\"fragmento de codigo\" width=\"1024\" height=\"270\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1-1024x270.png 1024w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1-300x79.png 300w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1-768x203.png 768w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1-700x185.png 700w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-1.png 1077w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Aparentemente es muy inocente, estamos accediendo al script del personaje en el Update y comprobando un valor. \u00bfCu\u00e1l es el problema?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estamos obligando a Unity a \u201cbuscar\u201d <\/span><span style=\"font-weight: 400;\">en cada fotograma<\/span><span style=\"font-weight: 400;\"> el gameObject Player, y luego dentro del player, el componente ScriptPersonaje. Algo as\u00ed como leer un libro en casa, y a cada p\u00e1gina cerrarlo, guardarlo en la estanter\u00eda, volver a cogerlo, buscar la p\u00e1gina y leer la siguiente.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Hay una forma m\u00e1s eficiente:<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12936\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-2.png\" alt=\"espai buenas practicas c# codigo 2\" width=\"917\" height=\"357\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-2.png 917w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-2-300x117.png 300w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-2-768x299.png 768w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-2-700x273.png 700w\" sizes=\"auto, (max-width: 917px) 100vw, 917px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Como ves, el c\u00f3digo es muy similar, solo que guardamos el script una sola vez en el Start, y luego en Update lo reutilizamos las veces que haga falta. Suele llamarse \u201ccachear\u201d un objeto, aunque suene raro porque es un anglicismo.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12934\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/cacheando.png\" alt=\"perro cacheado pr \" width=\"942\" height=\"695\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/cacheando.png 942w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/cacheando-300x221.png 300w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/cacheando-768x567.png 768w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/cacheando-700x516.png 700w\" sizes=\"auto, (max-width: 942px) 100vw, 942px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Esto no son Buenas pr\u00e1cticas en C#\u2026 Imagen cortes\u00eda de humoranimal.com<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas en C# 2: <\/span>Usa print() en todas partes<\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">La consola es tu amiga. Puedes mostrar todos los mensajes que necesites, desde volcar el contenido de variables que usas en el c\u00f3digo hasta el t\u00edpico \u201cpaso por aqu\u00ed\u201d que se usa para comprobar si entramos en una funci\u00f3n. Por ejemplo:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-12937 size-full\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-3.png\" alt=\"fragmento de c\u00f3digo\" width=\"653\" height=\"177\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-3.png 653w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-3-300x81.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Si ejecutamos este c\u00f3digo, la consola nos ir\u00e1 informando cada vez que el usuario pulse \u201cEsc\u201d.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Otro ejemplo:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12938\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-4.png\" alt=\"fragmento de c\u00f3digo\" width=\"647\" height=\"115\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-4.png 647w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-4-300x53.png 300w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">La consola nos avisar\u00e1 cuando nuestro gameObject (el que contiene este script) choque con otro, y nos dir\u00e1 c\u00f3mo se llama ese otro.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Incluso este ejemplo es v\u00e1lido:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12939\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-5.png\" alt=\"fragmento de c\u00f3digo\" width=\"545\" height=\"286\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-5.png 545w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-5-300x157.png 300w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/p>\n<p style=\"text-align: center;\">Buenas pr\u00e1cticas en C#<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">No es lo recomendado por lo poco que se explica, pero nos servir\u00eda para asegurarnos que nuestro programa pasa por ah\u00ed.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas en C# 3: <\/span><span style=\"font-weight: 400;\">No todo son GameObjects<\/span><\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Cuando queremos pasar un objeto desde el editor, es com\u00fan este c\u00f3digo:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12940\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-6.png\" alt=\"fragmento de c\u00f3digo\" width=\"385\" height=\"46\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-6.png 385w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-6-300x36.png 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">o su versi\u00f3n m\u00e1s refinada:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12941\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-7.png\" alt=\"fragmento de c\u00f3digo\" width=\"400\" height=\"81\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-7.png 400w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-7-300x61.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Los 2 nos permiten asignar ese valor (en el editor) para que el script lo utilice. \u00bfEntonces cu\u00e1l es el problema?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El problema es que GameObject son todos, o casi. Podr\u00eda pasar aqu\u00ed un enemigo, el suelo, un gameObject vac\u00edo o cualquier cosa, y el editor dir\u00eda \u201cOK programmer\u201d. El error saldr\u00eda m\u00e1s adelante al intentar acceder a algo espec\u00edfico del player, como las vidas. Un ejemplo aqu\u00ed:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12942\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-8.png\" alt=\"fragmento de c\u00f3digo\" width=\"762\" height=\"162\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-8.png 762w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-8-300x64.png 300w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-8-700x149.png 700w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">La l\u00ednea 5 funcionar\u00eda bien si hemos pasado al player desde el editor, pero si es otro objeto \u00a1fallar\u00e1 en tiempo de ejecuci\u00f3n! El programa no tiene forma de saberlo hasta que intenta acceder al script y se encuentra\u2026 Que no lo encuentra.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Una forma de corregir esto ser\u00eda declarar la variable as\u00ed:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12943\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-9.png\" alt=\"fragmento de c\u00f3digo\" width=\"433\" height=\"32\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-9.png 433w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-9-300x22.png 300w\" sizes=\"auto, (max-width: 433px) 100vw, 433px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">con este cambio tan breve, nos aseguramos que el gameObject que pasamos desde el editor <span style=\"text-decoration: underline;\">contiene s\u00ed o s\u00ed<\/span> el script que necesitamos, y lo m\u00e1s importante, no nos dejar\u00e1 asignar un gameObject que no lo contenga.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas en C# 4: <\/span>Usa \u00abrequiredcomponent\u00bb<\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Aqu\u00ed deber\u00eda a\u00f1adir \u201c&#8230;para reutilizar scripts y garantizar que funcionan\u201d.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Imagina que creamos un script que necesita un RigidBody para funcionar, \u00e9ste:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12944\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-10.png\" alt=\"fragmento de c\u00f3digo\" width=\"580\" height=\"366\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-10.png 580w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-10-300x189.png 300w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Si lo a\u00f1adimos a un objeto cualquiera, funcionar\u00e1 si \u00e9ste tiene un RigidBody. PERO fallar\u00e1 si no lo tiene, porque damos por hecho que est\u00e1 y en tiempo de ejecuci\u00f3n (en el Start) Unity ver\u00e1 que no existe. Recibimos un desagradable mensaje de error:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>\u201cMissingComponentException: There is no &#8216;Rigidbody&#8217; attached to the \u00abCube\u00bb game object, but a script is trying to access it.\u201d<\/b><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Si queremos evitar esto, podemos garantizar que el componente se crear\u00e1 autom\u00e1ticamente cuando a\u00f1adamos nuestro script, as\u00ed:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12945\" src=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-11.png\" alt=\"fragmento de c\u00f3digo\" width=\"632\" height=\"157\" srcset=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-11.png 632w, https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/espai-buenas-practicas-c-codigo-11-300x75.png 300w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Es decir, a\u00f1adimos la l\u00ednea 1 justo antes de la declaraci\u00f3n de clase. El resultado ser\u00e1 que el propio editor crear\u00e1 el RigidBody por nosotros, y problema resuelto.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas en C# 5: <\/span><span style=\"font-weight: 400;\">Update vs FixedUpdate<\/span><\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Por \u00faltimo, m\u00e1s que una recomendaci\u00f3n es una duda muy com\u00fan. \u00bfPara qu\u00e9 tenemos Update y FixedUpdate? Parecen la misma cosa, pero tienen sus diferencias:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Update se ejecuta en cada fotograma, es decir que su frecuencia no podemos saberla. En un ordenador potente pueden ser 60 veces por segundo, en uno m\u00e1s lento quiz\u00e1s 20. La cuesti\u00f3n es que se ejecuta tanto como es posible, y por eso aqu\u00ed suele ir<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">La recogida del input del usuario (Input.getKey y dem\u00e1s)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Movimiento \u201cmanual\u201d de los objetos, con .position o .translate<\/span><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Nota: No olvides usar Time.deltaTime en tus c\u00e1lculos para que el movimiento sea constante.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">FixedUpdate (como su nombre indica) se ejecuta x veces por segundo. Siempre a esa velocidad, no importa el ordenador en el que est\u00e9 funcionando. Esta estabilidad es necesaria para las f\u00edsicas, no es lo mismo aplicar una fuerza a un objeto 20 veces por segundo que 60, en el primer caso el objeto se mover\u00e1 y en el 2o\u2026 \u00a1Saldr\u00e1 disparado!\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En cambio, no nos interesa recoger aqu\u00ed el \u201cinput\u201d del usuario, porque al ser menos frecuente podemos perder pulsaciones de teclas y estropear la jugabilidad.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Recuerda que en este caso, deltatime no es necesario porque la frecuencia es constante.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a1Y hasta aqu\u00ed el art\u00edculo sobre Buenas pr\u00e1cticas en C#! Hasta la pr\u00f3xima.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes&#8230;<\/p>\n","protected":false},"author":3,"featured_media":12947,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_ef_editorial_meta_date_first-draft-date":"","_ef_editorial_meta_paragraph_assignment":"","_ef_editorial_meta_checkbox_needs-photo":"","_ef_editorial_meta_number_word-count":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[379,5],"tags":[201,89,322],"class_list":["post-12933","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-productividad","category-programacion","tag-productividad","tag-programacion-2","tag-unity"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai<\/title>\n<meta name=\"description\" content=\"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai\" \/>\n<meta property=\"og:description\" content=\"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Escola Espai\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-31T10:00:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-31T16:21:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Escobar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Escobar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\"},\"author\":{\"name\":\"Escobar\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602\"},\"headline\":\"Buenas pr\u00e1cticas en C# (Parte 3)\",\"datePublished\":\"2022-01-31T10:00:13+00:00\",\"dateModified\":\"2022-01-31T16:21:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\"},\"wordCount\":1069,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png\",\"keywords\":[\"productividad\",\"programaci\u00f3n\",\"unity\"],\"articleSection\":[\"Productividad\",\"Programaci\u00f3n\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\",\"url\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\",\"name\":\"Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai\",\"isPartOf\":{\"@id\":\"https:\/\/www.espai.es\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png\",\"datePublished\":\"2022-01-31T10:00:13+00:00\",\"dateModified\":\"2022-01-31T16:21:40+00:00\",\"author\":{\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602\"},\"description\":\"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage\",\"url\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png\",\"contentUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png\",\"width\":1000,\"height\":500,\"caption\":\"espai buenas pr\u00e1cticas en c#\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.espai.es\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Buenas pr\u00e1cticas en C# (Parte 3)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.espai.es\/blog\/#website\",\"url\":\"https:\/\/www.espai.es\/blog\/\",\"name\":\"Blog Escola Espai\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.espai.es\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602\",\"name\":\"Escobar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6fb517675f8bc757ee26d9143abae3c5eac58b13068bfcbc1485bbb092cef370?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6fb517675f8bc757ee26d9143abae3c5eac58b13068bfcbc1485bbb092cef370?s=96&d=mm&r=g\",\"caption\":\"Escobar\"},\"sameAs\":[\"http:\/\/www.espai.es\"],\"url\":\"https:\/\/www.espai.es\/blog\/author\/escobar\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai","description":"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/","og_locale":"es_ES","og_type":"article","og_title":"Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai","og_description":"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.","og_url":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/","og_site_name":"Blog Escola Espai","article_published_time":"2022-01-31T10:00:13+00:00","article_modified_time":"2022-01-31T16:21:40+00:00","og_image":[{"width":1000,"height":500,"url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","type":"image\/png"}],"author":"Escobar","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Escobar","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#article","isPartOf":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/"},"author":{"name":"Escobar","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602"},"headline":"Buenas pr\u00e1cticas en C# (Parte 3)","datePublished":"2022-01-31T10:00:13+00:00","dateModified":"2022-01-31T16:21:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/"},"wordCount":1069,"commentCount":0,"image":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","keywords":["productividad","programaci\u00f3n","unity"],"articleSection":["Productividad","Programaci\u00f3n"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/","url":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/","name":"Buenas pr\u00e1cticas en C# (Parte 3) - Blog Escola Espai","isPartOf":{"@id":"https:\/\/www.espai.es\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage"},"image":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","datePublished":"2022-01-31T10:00:13+00:00","dateModified":"2022-01-31T16:21:40+00:00","author":{"@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602"},"description":"Hola y bienvenidos a un nuevo art\u00edculo del blog. Seguimos con las buenas pr\u00e1cticas en C# para Unity, este ser\u00e1 el tercer y \u00faltimo art\u00edculo sobre este tema. Hoy veremos desde el punto 1 al 5 (de Unity), si quieres refrescar la memoria aqu\u00ed tienes el primer y el segundo art\u00edculo.","breadcrumb":{"@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#primaryimage","url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","contentUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","width":1000,"height":500,"caption":"espai buenas pr\u00e1cticas en c#"},{"@type":"BreadcrumbList","@id":"https:\/\/www.espai.es\/blog\/2022\/01\/buenas-practicas-en-c-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.espai.es\/blog\/"},{"@type":"ListItem","position":2,"name":"Buenas pr\u00e1cticas en C# (Parte 3)"}]},{"@type":"WebSite","@id":"https:\/\/www.espai.es\/blog\/#website","url":"https:\/\/www.espai.es\/blog\/","name":"Blog Escola Espai","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.espai.es\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/d2e265073982f28e16cb7edccbd16602","name":"Escobar","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6fb517675f8bc757ee26d9143abae3c5eac58b13068bfcbc1485bbb092cef370?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6fb517675f8bc757ee26d9143abae3c5eac58b13068bfcbc1485bbb092cef370?s=96&d=mm&r=g","caption":"Escobar"},"sameAs":["http:\/\/www.espai.es"],"url":"https:\/\/www.espai.es\/blog\/author\/escobar\/"}]}},"jetpack_featured_media_url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2022\/01\/buenas-practicas-en-c.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/12933","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/comments?post=12933"}],"version-history":[{"count":15,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/12933\/revisions"}],"predecessor-version":[{"id":12964,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/12933\/revisions\/12964"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/media\/12947"}],"wp:attachment":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/media?parent=12933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/categories?post=12933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/tags?post=12933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}