<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5586674761887030098</id><updated>2024-12-15T03:21:27.693-08:00</updated><category term="15_CLASE MONOBEHAVIOUR"/><category term="04_CLASE RIGIDBODY"/><category term="30_CLASE GUI"/><category term="03_CLASE TRANSFORM"/><category term="16_CLASE CAMERA"/><category term="23_CLASE GAMEOBJECT"/><category term="02_ESTRUCTURA VECTOR3"/><category term="31_CLASE GUILAYOUT"/><category term="34_CLASE INPUT"/><category term="00_INTRODUCCION"/><category term="01_CLASE OBJECT"/><category term="07_CLASE CHARACTERCONTROLLER"/><category term="17_CLASE LIGHT"/><category term="18_CLASE MATERIAL"/><category term="20_CLASE RENDERTEXTURE"/><category term="21_CLASE PARTICLEEMITTER"/><category term="39_CLASE EVENT"/><category term="42_ESTRUCTURA MATHF"/><category term="05_CLASE COLLIDER"/><category term="08_CLASE RENDERER"/><category term="10_CLASE JOINT"/><category term="11_CLASE HINGEJOINT"/><category term="22_CLASE MESH"/><category term="28_CLASE GUITEXT"/><category term="33_CLASE TEXTURE2D"/><category term="43_CLASE PHYSICS"/><category term="MONOGRAFICOS"/><category term="06_CLASE MESHCOLLIDER"/><category term="09_CLASE MESHFILTER"/><category term="12_CLASE SPRINGJOINT"/><category term="13_CLASE CHARACTERJOINT"/><category term="14_CLASE BEHAVIOUR"/><category term="19_CLASE CUBEMAP"/><category term="24_CLASE SHADER"/><category term="25_CLASE PHYSICMATERIAL"/><category term="26_CLASE COMPONENT"/><category term="27_CLASE GUIELEMENT"/><category term="29_CLASE GUITEXTURE"/><category term="32_CLASE TEXTURE"/><category term="35_ESTRUCTURA BOUNDS"/><category term="36_CLASE COLLISION"/><category term="37_CLASE CONTROLLERCOLLIDERHIT"/><category term="38_CLASE DEBUG"/><category term="40_CLASE GIZMOS"/><category term="41_CLASE LIGHTMAPSETTINGS"/><category term="44_ESTRUCTURA QUATERNION"/><category term="45_CLASE RANDOM"/><category term="46_ESTRUCTURA RAY"/><category term="47_ESTRUCTURA RAYCASTHIT"/><category term="48_ESTRUCTURA RECT"/><category term="49_CLASE RENDERSETTINGS"/><category term="50_CLASE SCREEN"/><category term="51_CLASE TIME"/><category term="52. CLASE YIELDINSTRUCTION"/><title type='text'>Tutorial de scripts para Unity 3d</title><subtitle type='html'>Tu videojuego comienza aquí.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>FM abogados Tenerife</name><uri>http://www.blogger.com/profile/11831811113007356059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfIHdNKtq2ZJXtvJsB9WEAE8LYjLa44uYYSXmcqQURuNzpRPsmuzfqfBWE-Cp_zkTbyNl3L_N8O7HV-eXvZdqAfWTow-KifgUN5EYCNdn7gtIRZi5VnBn0kacJ7M6JeW8/s220/logo-abogados-tenerife.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-4781886555976973341</id><published>2012-01-08T11:57:00.000-08:00</published><updated>2017-08-27T06:18:42.414-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MONOGRAFICOS"/><title type='text'>FISICAS: CONCEPTOS BASICOS (II)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;91&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Veíamos en la entrada anterior que un collider vendría a ser meramente un caparazón que le añadimos a una malla para que pueda colisionar con otras mallas, pudiendo ese caparazón tener la misma forma que la malla (mesh collider) o una forma que nosotros le diseñemos para él a partir de una o varias formas primitivas (primitive collider)que Unity nos ofrece.&lt;br /&gt;
&lt;br /&gt;
Supongamos entonces que tenemos dos mallas en nuestra escena, a cada una de las cuales le asignamos un collider (del tipo que sea, eso no importa para este ejemplo). A través de un script vinculado a una de las mallas movemos su transform para que colisione contra la otra malla. Probadlo si queréis con dos cubos (que ya traen &quot;de serie&quot; un collider primitivo (obviamente, un box collider)). Comprobaréis que pese a tener cada malla un collider, a efectos prácticos es como si no lo tuvieran, ya que se atraviesan. &lt;br /&gt;
&lt;br /&gt;
Esto sucede porque para que dos mallas puedan colisionar, además de estar ambas dotadas de su pertinente collider, es preciso que al menos una de las dos mallas tenga vinculado además un Rigidbody no kinemático. &lt;br /&gt;
&lt;br /&gt;
Olvidémonos de momento del palabro &quot;kinemático&quot; y centrémonos en el Rigidbody.&lt;br /&gt;
&lt;br /&gt;
Un &lt;span style=&quot;font-weight: bold;&quot;&gt;rigidbody&lt;/span&gt; es el conjunto de datos que permiten a Unity calcular, entre otras cosas, las consecuencias que tendrá una colisión para el gameobject al cual se asigna dicho rigidbody. &lt;br /&gt;
&lt;br /&gt;
Al igual que nos pasaría a nosotros si estuviéramos en clase de física, para que Unity calcule las consecuencias de una hipotética colisión necesita tener en cuenta factores como la masa del gameobject al que se vincula, la velocidad relativa a que se produce la colisión, si existe o no rozamiento y en qué medida, si hay o no gravedad, etc. Por resumir, asignando un rigidbody a un gameobject automáticamente estamos dotando a dicho gameobject de una serie de propiedades físicas, tales como gravedad, rozamiento y peso, ya que sin saber la masa de un objeto - por ejemplo- es imposible calcular el resultado de una colisión (probad si no a patear de manera indiscriminada objetos con diferentes masas, paredes de carga y yorkshires inclusive, para que comprobéis las diferentes posibilidades de desplazamiento). &lt;br /&gt;
&lt;br /&gt;
Lo más impactante para los recién llegados a Unity cuando le asignamos un rigidbody a una malla -como muchos ya habréis comprobado- es que automáticamente, salvo que el suelo a su vez tenga otro collider, nuestra malla se pierde en las profundidades de la escena. Por eso se tiende por algunos (manuales de pago incluidos) a simplificar en ocasiones cuando se explica lo que es un rigidbody, limitándolo a &quot;lo que hace que un objeto se vea afectado por la gravedad&quot;. &lt;br /&gt;
&lt;br /&gt;
Y por ahí suelen empezar también las confusiones entre colliders y rigidbodies, debido a que los dos tienden a solaparse y es difícil explicar uno sin mencionar al otro. Es verdad que ambos son necesarios para que se produzca una colisión, pero intervienen en apartados distintos: el collider sería el dónde (se produce la colisión) y el rigidbody el cómo.&lt;br /&gt;
&lt;br /&gt;
Supongo que se entiende que no tendría sentido asignar un rigidbody a una malla que no tenga un collider, ya que de nada sirve calcular una colisión que nunca tendrá lugar (ya que no hay collider para esa malla con el que colisionar o ser  colisionado)&lt;br /&gt;
&lt;br /&gt;
Sí cabe pensar en un collider que no tenga rigidbody. De hecho, es lo que en Unity se conoce como &quot;static colliders&quot;.&lt;br /&gt;
&lt;br /&gt;
Un collider estático, como su nombre indica, está pensado para objetos que no se van a mover en la escena. Este tipo de colliders sin rigidbody pueden interactuar/colisionar con otros colliders siempre que éstos colliders sí tengan vinculado un rigidbody (ya hemos visto que si ninguno de los dos objetos tiene un rigidbody la colisión no se produce, básicamente porque Unity no tiene ninguna forma de calcular las consecuencias de dicha colisión entre dos objetos &quot;no físicos&quot; y directamente obvia la colisión).&lt;br /&gt;
&lt;br /&gt;
Lo que sucede es que cuando un collider dinámico (con rigidbody) se mueve y fruto de ese movimiento colisiona con un collider estático (sin rigidbody), como Unity ignora las propiedades físicas del collider estático, meramente éste -haciendo honor a su nombre- no se moverá. Y de hecho, si se moviera, y precisamente por lo expuesto (Unity no sabe calcular cómo y cuánto se ha de mover) el costo computacional sería brutal.&lt;br /&gt;
&lt;br /&gt;
Por todo lo anterior, los static colliders son óptimos para las partes fijas de nuestro juego, tal como paredes, librerías, árboles y objetos similares que no han de moverse pero que tampoco han de atravesarse por los personajes y demás partes móviles del juego. &lt;br /&gt;
&lt;br /&gt;
Espero que estos conceptos que estoy intentando explicar a cuentagotas queden claros. Sé que al principio parece todo un poco confuso, pero es esencial entenderlos correctamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un abrazo y hasta pronto.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/4781886555976973341/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2012/01/fisicas-conceptos-basicos-ii.html#comment-form' title='17 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4781886555976973341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4781886555976973341'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2012/01/fisicas-conceptos-basicos-ii.html' title='FISICAS: CONCEPTOS BASICOS (II)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-3468965089549722243</id><published>2011-12-31T11:57:00.000-08:00</published><updated>2011-12-31T12:01:04.660-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MONOGRAFICOS"/><title type='text'>FISICAS: CONCEPTOS BASICOS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Examinadas las clases principales de Unity, quisiera ahora realizar una serie de incursiones más o menos extensivas en algunos aspectos del engine que creo que merecen una atención especial, bien por su importancia, bien por la dificultad para entenderlos. Así que, avisando de nuevo en que este que os está escribiendo no es en absoluto un experto en la materia, intentaré ayudar en lo que buenamente pueda.&lt;br /&gt;&lt;br /&gt;Quisiera empezar con un acercamiento a todo el componente de físicas del engine, que considero que es el centro neurálgico del noventa y pico por ciento de los videojuegos que se han creado. &lt;br /&gt;&lt;br /&gt;Existe entre los recién llegados a Unity bastante confusión entre los términos y conceptos que envuelven su apartado de físicas, y en consecuencia a veces no se aplican correctamente los elementos necesarios para –por ejemplo- detectar adecuadamente una colisión o permitir que un determinado gameobject sea inmune a la gravedad. Para que nuestro juego funcione adecuadamente y no consuma más recursos de los necesarios debemos tener muy claro cuál es la mejor solución para cada necesidad.&lt;br /&gt;&lt;br /&gt;Vamos a intentar desgranar para qué sirve cada cosa. Empezaremos por examinar las diferentes posibilidades de detección de colisiones que nos brinda Unity, y para ello necesitaremos introducir el primer concepto:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;COLLIDER: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt; Un collider, en términos muy básicos, es un envoltorio que hace que un determinado objeto se torne sólido y en consecuencia pueda chocar con otros objetos (siempre que a su vez esos otros objetos tengan otro collider). Un collider se compone, por un lado, de una determinada forma (que no tiene por qué coincidir con la forma del objeto, aunque es preferible que “casen” de alguna manera, para originar colisiones creíbles) y, por otro, de un determinado material físico (aquí no estamos hablando de colores o modos de reflejar la luz de una superficie, sino de capacidad de rebote y/o fricción de dicho objeto, así que no confundamos el término “material” que usamos para renderizar un objeto con el material físico).&lt;br /&gt;&lt;br /&gt;Atendiendo a su forma, podemos diferenciar los colliders en dos subgrupos: colliders de malla (mesh colliders) y colliders de primitivas (primitive colliders):&lt;br /&gt;&lt;br /&gt;El &lt;span style=&quot;font-weight:bold;&quot;&gt;mesh collider&lt;/span&gt; lo creamos cuando importamos una malla  desde alguna aplicación 3d tipo Blender o 3dMax. Al seleccionar dicha malla desde la vista de Proyecto y previo a importarlo, debemos (caso de querer este tipo de malla) marcar la casilla “generate colliders” (ver captura de pantalla) para que nuestra malla tenga un collider de este tipo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi86Wu0eSai0BsicXuL_NVurN9qIdRZQut019El7Z9MFUhOc0jOXz2HdZF6-Ll_2VMGw9TmWbzu15vPLWfDYMk7WmS3jfv334q2MDZUz5UHe7T7y0C7mX-iVY6Vo1F9eYxFCjypnWJFFKjS/s1600/generatecolliders.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 125px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi86Wu0eSai0BsicXuL_NVurN9qIdRZQut019El7Z9MFUhOc0jOXz2HdZF6-Ll_2VMGw9TmWbzu15vPLWfDYMk7WmS3jfv334q2MDZUz5UHe7T7y0C7mX-iVY6Vo1F9eYxFCjypnWJFFKjS/s320/generatecolliders.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5692384599099797154&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cuando marcamos esta casilla e importamos la malla,  Unity genera un collider que tendrá la misma forma que dicha malla (de ahí el nombre). Podríamos pensar: “pues ya está, es tan sencillo como pedir a Unity que genere colliders para todas las mallas que vayamos importando y ya tenemos nuestro sistema de detección de colisiones montado, sin necesidad de complicarnos la vida asignando colliders de primitivas que además no cuadran tan perfectamente con nuestras mallas como los colliders de malla”. &lt;br /&gt;&lt;br /&gt;Pero no es tan sencillo. Para empezar, dos colliders de malla no colisionarán entre sí si al menos uno de ellos no tiene marcado en el inspector el checkbox “convex”, que hace que el collider envuelva adecuadamente la malla. &lt;br /&gt;&lt;br /&gt;“No hay problema” –podemos pensar- “marco la casilla convex y asunto solucionado”.&lt;br /&gt;&lt;br /&gt;Sigue sin ser tan sencillo. Si dos colliders de malla colisionan entre sí a una velocidad importante es posible que no se detecte la colisión.&lt;br /&gt;&lt;br /&gt;“¿y para el caso de objetos que sé positivamente que no se moverán a mucha velocidad puedo usar mesh colliders?”&lt;br /&gt;&lt;br /&gt;La respuesta es: poder, se puede, pero si se puede evitar, mejor. Pensemos que la cantidad de recursos que consume un PC para calcular colisiones derivadas de mallas complejas es muy superior a la precisa para hacer lo propio con primitives colliders.&lt;br /&gt;&lt;br /&gt;En resumen, que deberíamos usar los colliders de malla en objetos que sepamos positivamente que en nuestro juego se moverán poco o nada, que no estarán sometidos a colisiones continuas con otros objetos y que tengan una forma difícil de casar con un collider primitivo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por su parte, el &lt;span style=&quot;font-weight:bold;&quot;&gt;primitive collider&lt;/span&gt; implica asignar a una malla un collider prefabricado por Unity, pudiendo meramente escoger entre las siguientes formas primitivas: esfera, caja, cápsula o rueda. Se trataría meramente de –teniendo nuestra malla seleccionada- irnos al menú Components=&gt;Physics  y seleccionar uno de los indicados colliders, para después moverlo de tal forma que encaje lo mejor posible con nuestra malla. &lt;br /&gt;&lt;br /&gt;En ocasiones precisaremos usar varios colliders primitivos para cubrir toda la fisonomía de una malla. Esto se puede conseguir creando un gameobject vacío y emparentar dichos colliders como hijos de esta, para crear así una unidad manipulable, por decirlo de alguna forma. &lt;br /&gt;&lt;br /&gt;Aunque este segundo sistema –primitive collider- es más trabajoso y antiestético que el anterior- mesh collider- es recomendable que en la medida de lo posible lo usemos para nuestras mallas. &lt;br /&gt;&lt;br /&gt;En próximos capítulos ahondaremos en esto. De momento, lo dejamos por hoy.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/3468965089549722243/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/12/fisicas-conceptos-basicos.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3468965089549722243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3468965089549722243'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/12/fisicas-conceptos-basicos.html' title='FISICAS: CONCEPTOS BASICOS'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-6870924939465068948</id><published>2011-11-01T07:00:00.000-07:00</published><updated>2011-11-01T07:10:43.739-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="52. CLASE YIELDINSTRUCTION"/><title type='text'>121. CLASE YIELDINSTRUCTION</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es una clase base para otras clases que vamos a introducir dentro de este apartado, para no disgregarlas mucho dado su pequeño tamaño. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CLASE WAITFORSECONDS:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Suspende la ejecución de una corrutina por una cantidad dada de segundos. Sólo puede usarse con una declaración yield en corrutinas. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;print (Time.time);            //Esto imprimirá 0.&lt;br /&gt;&lt;br /&gt;yield WaitForSeconds (5);     //Espera cinco segundos.&lt;br /&gt;&lt;br /&gt;print (Time.time);            //Ahora imprime 5.0.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta clase sólo la compone su constructor:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function WaitForSeconds (seconds : float) : WaitForSeconds &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CLASE WAITFORFIXEDUPDATE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espera hasta la siguiente función de actualización de frames fijados&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;yield new WaitForFixedUpdate ();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CLASE COROUTINE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MonoBehaviour.StartCoroutine devuelve una Coroutine. Las instancias de esta clase son usadas sólamente como referencia de esas coroutines y no tienen propiedades ni funciones. &lt;br /&gt;&lt;br /&gt;Una coroutine es una function que puede suspender su ejecución (yield) hasta que la instrucción dada YieldInstruction acaba.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/6870924939465068948/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/11/121-clase-yieldinstruction.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6870924939465068948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6870924939465068948'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/11/121-clase-yieldinstruction.html' title='121. CLASE YIELDINSTRUCTION'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-1341093177991415562</id><published>2011-11-01T05:15:00.000-07:00</published><updated>2011-11-01T05:38:13.326-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="51_CLASE TIME"/><title type='text'>120. CLASE TIME</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como su nombre indica (y tal como ya hemos visto en algunos ejemplos previamente) esta clase nos permite utilizar características de gran utilidad relacionadas con el tiempo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;time:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var time : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es el tiempo en segundos desde el inicio del juego (sólo lectura).           &lt;br /&gt;&lt;br /&gt;Cuando esta propiedad es llamada desde dentro de la función fixedUpdate devuelve la propiedad fixedTime.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update(){&lt;br /&gt;  print(Time.time);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No hace falta mucha explicación: nos aparece en pantalla el tiempo transcurrido desde el inicio del juego.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;timeSinceLevelLoad:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var timeSinceLevelLoad : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tiempo en segundos desde que el último level ha sido cargado (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;deltaTime:&lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var deltaTime : float &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tiempo en segundos que se tardó en completar el último frame (sólo lectura). Debemos usar esta propiedad para hacer que las cosas funcionen de manera independiente a la frecuencia de frames de casa ordenador. Así, cuando multiplicamos dentro de la función Update el movimiento de un objeto con Time.deltaTime estaremos queriendo decir: quiero mover este objeto 10 metros por segundo en lugar de 10 metros por frame. &lt;br /&gt;&lt;br /&gt;Recordemos que si llamamos a esta propiedad desde dentro de FixedUpdate, devuelve el delta time de framerate fijo, para adaptarse a éste.&lt;br /&gt; &lt;br /&gt;No debemos confiar en Time.deltaTime desde dentro de un onGUI, ya que OnGUI puede ser llamado múltiples veces por frame y delta time debe sostener el mismo valor cada llamada, hasta el siguiente frame en que será actualizado de nuevo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fixedTime:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fixedTime : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tiempo desde que el último FixedUpdate comenzó (sólo lectura). Este es el tiempo en segundos desde el inicio del juego. Fixed time es actualizado en intervalos regulares (igual que fixedDeltaTime) hasta que la propiedad time es alcanzada.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;maximumDeltaTime:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var maximumDeltaTime : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El máximo tiempo que un frame puede tomar. Physics y otras actualizaciones de frecuencia fija de frames (como FixedUpdate) trabajarán solo durante esta duración de tiempo por frame. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;smoothDeltaTime:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var smoothDeltaTime : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un Time.deltaTime suavizado.              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;timeScale:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt; static var timeScale : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La escala en la cual el tiempo pasa. Puede ser usada para efectos de cámara lenta. Cuando está establecida en 1.0, el tiempo transcurre igual que en la vida real. Cuando está en 0.5 está el doble de lento que en la vida real.  Si lo colocamos en cero el juego se pausa si todas las funciones son independientes del frame rate.     &lt;br /&gt;&lt;br /&gt;Si bajamos el timeScale es recomendable que también bajemos Time.fixedDeltaTime en la misma cantidad.&lt;br /&gt;  &lt;br /&gt;Las funcione dentro de FixedUpdate no serán llamadas cuando timeScale esté colocada a cero. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;frameCount:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var frameCount : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El número total de frames que han pasado (sólo lectura)     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;realtimeSinceStartup:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var realtimeSinceStartup : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tiempo real en segundos desde que el juego empezó (solo lectura). En casi todos los casos, no obstante, debemos usar Time.time en lugar de esto. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;captureFramerate:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var captureFramerate : int &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si está establecida en un valor superior a 0, el tiempo avanzará en (1.0 / captureFramerate) por frame  sin tener en cuenta el tiempo real. Esto es útil si quieres capturar una película donde necesitas una frecuencia de frames constante.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/1341093177991415562/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/11/120-clase-time.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/1341093177991415562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/1341093177991415562'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/11/120-clase-time.html' title='120. CLASE TIME'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-744189290198453504</id><published>2011-11-01T04:26:00.000-07:00</published><updated>2011-11-01T05:01:00.563-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="50_CLASE SCREEN"/><title type='text'>119. CLASE SCREEN</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Acceso a la pantalla de información. Esta clase puede ser usada para obtener la lista de las resoluciones soportadas, cambiar la resolución actual, esconder o mostrar el puntero de ratón del sistema, etc. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;resolutions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var resolutions : Resolution[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve todas las resoluciones de pantalla completa soportadas por el monitor (read only). Las resoluciones retornadas se ordenan por anchura, empezando por las resoluciones más bajas.    &lt;br /&gt;&lt;br /&gt;El tipo Resolucion es una estructura con las siguientes variables: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;width           Anchura de la resolución en píxeles.&lt;br /&gt;height         Altura de la resolución en píxeles.&lt;br /&gt;refreshRate Tipo de refresco de resolución vertical en Hz. &lt;br /&gt;&lt;/pre&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;currentResolution:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var currentResolution : Resolution &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variable de sólo lectura que devuelve la resolución de pantalla actual. Si el jugador está corriendo en modo windows, esto devuelve la resolución actual del escritorio.          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;showCursor:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var showCursor : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Debe el cursor ser visible?    &lt;br /&gt;&lt;br /&gt;Es enteramente posible implementar un cursor personalizado en lugar del que tiene el sistema. Para hacer esto debemos esconder el del sistema, seguir la posición o movimiento de ratón y mostrar nuestra propia imagen en el lugar preciso.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos a hacer desaparecer nuestro cursor. Para ello previamente eliminamos la luz que creamos en la lección anterior, y luego editamos nuestro Script (que recordaremos que tenemos vinculado a PortaScripts)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Screen.showCursor = false;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Observaremos que cuando pasamos el cursor por encima de la ventana Game, éste se torna invisible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;lockCursor:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var lockCursor : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Debe el cursor ser bloqueado?&lt;br /&gt;&lt;br /&gt;El cursor será ocultado automáticamete, centrado en la vista y haciendo que no se pueda abandonar ésta.              &lt;br /&gt;&lt;br /&gt;Si estamos realizando un juego de navegador web, el cursor podrá sólo ser bloqueado después de que el usuario haya hecho click en el contenido y  siempre que éste no abandone la vista presionando escape o cambiando a otra aplicación, ya que en estos casos el cursor será automáticamente desbloqueado. El bloqueo del cursor también se perderá cuando se salga del modo de pantalla completa. &lt;br /&gt;&lt;br /&gt;Se puede consultar si el cursor está actualmente bloqueado consultando el estado de lockCursor. Para proveer una buena experiencia de usuario es recomendable sólo bloquear el cursor como resultado de apretar un botón. También debemos consultar si el cursor  se desbloquea en orden a pej pausar el juego o hacer surgir un menú del juego.  En el  Web Player y Editor el cursor automáticamente se desbloqueará cuando aprietes escape. En el Standalone Player tienes control pleno sobre el bloqueo del ratón de manera que no perderás automáticamente el bloqueo del mismo a menos que cambies de aplicación. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;width:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var width : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La anchura actual de la ventana en la pantalla en píxeles (sólo lectura).&lt;br /&gt;&lt;br /&gt;Esta es la actual anchura de la ventana del jugador (en pantalla completa es también la resolución actual)        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;height:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var height : int &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La altura actual de la ventana en la pantalla en píxeles (sólo lectura)&lt;br /&gt;&lt;br /&gt;Esta es la actual altura de la ventana del jugador (en pantalla completa es tambén la resolución corriente)      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fullScreen:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fullScreen : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está el juego corriendo en pantalla completa?&lt;br /&gt;&lt;br /&gt;Es posible intercambiar al modo de pantalla completa cambiando esta propiedad.             &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;sleepTimeout:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var sleepTimeout : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un ajuste de ahorro de energía, permitiendo la atenuación de la pantalla algún tiempo después de la interacción del último usuario activo. Es muy útil para dispositivos táctiles, permitiendo el ahorro de la batería. &lt;br /&gt;&lt;br /&gt;SleepTimeout es medido en segundos, donde 0 significa que nunca duerme. El valor por defecto varía de plataforma en plataforma, siendo generalmente distinto a cero el dispositivos móviles.    &lt;br /&gt;&lt;br /&gt;En dispositivos móviles sería útil colocar esta variable a cero para juegos que usen acelerómetros como principal fuente de entrada. Sin embargo, estos juegos deberían permitir la atenuación de la pantalla mientras están en la pantalla del menú o pausados.       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SetResolution:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SetResolution (width : int, height : int, fullscreen : boolean, preferredRefreshRate : int = 0) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cambia la resolución de pantalla. Se usará una resolución de anchura por altura dada. Si la resolución indicada no existe o no es soportada por nuestro dispositivo, se usará la mas cercana a la indicada. &lt;br /&gt;&lt;br /&gt;Si el parámetro preferredRefreshRate es 0 (default) Unity cambiará a la mayor velocidad de actualización soportada por el monitor. &lt;br /&gt;&lt;br /&gt;Si preferredRefreshRate no es cero, Unity la usará si el monitor la soporta, y en otro caso encontrará la más alta soportada. &lt;br /&gt;&lt;br /&gt;En la web player sólo podemos cambiar de resolución depués de que el usuario ha hecho click en el contenido. La manera recomendada de hacer esto es cambiar la resolución sólo cuando el usuario haga clic en un botón designado a tal efecto. &lt;br /&gt;El cambio de resolución no sucede inmediatamente, sino cuando el frame actual acaba.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/744189290198453504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/11/119-clase-screen.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/744189290198453504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/744189290198453504'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/11/119-clase-screen.html' title='119. CLASE SCREEN'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-4793412372232823518</id><published>2011-11-01T03:15:00.001-07:00</published><updated>2011-11-01T04:17:44.730-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="49_CLASE RENDERSETTINGS"/><title type='text'>118. CLASE RENDERSETTINGS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta clase se corresponde con las variables que podemos encontrar en el inspector si nos vamos al menú=&gt;edit=&gt;Render Settings. &lt;br /&gt;&lt;br /&gt;Contiene valores para un rango de elementos visuales en tu escena, como niebla y luz de ambiente. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fog:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fog : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está habilitada la niebla?              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fogMode:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fogMode : FogMode &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Modo de niebla a usar. FogMode es una enumeración que admite los siguientes valores: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Linear                Niebla lineal.&lt;br /&gt;Exponential           Niebla exponencial.&lt;br /&gt;ExponentialSquared    Niebla exponencial al cuadrado (por defecto).&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fogColor:&lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fogColor : Color &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El color de la niebla.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fogDensity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fogDensity : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La densidad de la niebla exponencial. &lt;br /&gt;&lt;br /&gt;Resumamos lo visto con un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RenderSettings.fog = true;&lt;br /&gt;RenderSettings.fogColor = Color.blue;&lt;br /&gt;RenderSettings.fogDensity = 0.1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pulsamos play y habremos activado la niebla, que será de color azul y con una densidad de 0.1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fogStartDistance:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fogStartDistance : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La distancia inicial de la niebla lineal. Las distancias de inicio y final de la niebla son usadas por el modo de niebla Linear.          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fogEndDistance:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var fogEndDistance : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La distancia final de la niebla lineal (sólo para modo Linear).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ambientLight:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var ambientLight : Color &lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Color de la luz de ambiente de la escena.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;haloStrength:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var haloStrength : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tamaño del halo de luz. Para cualquier luz, el tamaño del halo es este valr multiplicado por Light.range.     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;flareStrength:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var flareStrength : float &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La intensidad de  las llamas/destellos en la escena.   &lt;br /&gt;&lt;br /&gt;Vamos a hacer un ejemplo progresivo de la utilidad de estas últimas variables. En primer lugar, eliminamos el script que tenemos vinculado al cubo. Acto seguido editamos MiPrimerScript como sigue:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RenderSettings.ambientLight = Color.green;          &lt;br /&gt;&lt;/pre&gt;       &lt;br /&gt;&lt;br /&gt;Salvamos y arrastramos a PortaScipts. Al darle al play deberíamos tener una luz de ambiente así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAF_KUfJUAVD4tc301SjcrWb72Pt0-HVkT7PQVH4KcZ5vu7mreRoH0sY7PtoB-ZMlHGjnyg8YBkj1T8l3JDP_PDqYD_E1CE1G0RamMACXTy1ZZlZhlAiZv6G6f9cAhgpDoN9fG3Hly3kVU/s1600/Captura_33.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAF_KUfJUAVD4tc301SjcrWb72Pt0-HVkT7PQVH4KcZ5vu7mreRoH0sY7PtoB-ZMlHGjnyg8YBkj1T8l3JDP_PDqYD_E1CE1G0RamMACXTy1ZZlZhlAiZv6G6f9cAhgpDoN9fG3Hly3kVU/s320/Captura_33.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5669976775758051362&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Démonos cuenta que no ha sido preciso vincularle el script a la luz principal para que tenga efecto. &lt;br /&gt;&lt;br /&gt;Ahora nos vamos al menú=&gt;Gameobject=&gt;Create other=&gt;SpotLight. Ubicamos nuestra nueva luz en las coordenadas 0,3,0, con una rotación de 90,0,0, para que se note claramente su efecto y los posteriores cambios. En el inspector, asimismo, marcar la casilla que pone &quot;draw hallo&quot;.&lt;br /&gt;&lt;br /&gt;Ya que al inicio de este repaso por las clases no cargamos ningún asset, nos faltará uno para completar nuestro ejemplo, así que vamos a menú=&gt;assets=&gt;import Package=&gt;Light Flares. Importamos.&lt;br /&gt;&lt;br /&gt;Ahora, de nuevo en el inspector de nuestra spotlight hacemos click en la pequeña fleha que encontramos junto a Flare y seleccionamos Small Flare.&lt;br /&gt;&lt;br /&gt;Podemos ya reescribir nuestro script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RenderSettings.ambientLight = Color.green;&lt;br /&gt;yield WaitForSeconds(5);&lt;br /&gt;RenderSettings.haloStrength = 0.2;&lt;br /&gt;RenderSettings.flareStrength = 0.2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dadle al play y observar los cambios transcurridos 5 segundos. HaloStrength afectará al diámetro del haz de luz que pega contra el suelo (la galleta o cookie, que dicen los anglosajones). FlareStrength en cambio se refiere a ese tipo de brillo que emite la fuente de la luz en su origen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;skybox:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var skybox : Material &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El skybox global en uso.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/4793412372232823518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/11/118-clase-rendersettings.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4793412372232823518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4793412372232823518'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/11/118-clase-rendersettings.html' title='118. CLASE RENDERSETTINGS'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-3065209864827398171</id><published>2011-11-01T02:31:00.001-07:00</published><updated>2011-11-01T02:52:38.976-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="48_ESTRUCTURA RECT"/><title type='text'>117. ESTRUCTURA  RECT</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variables y funciones para la creación y manejo de un rectángulo 2D definido por la posición x,y y anchura, altura. La estructura Rect es principalmente usada para operaciones 2D; el sistema UnityGUI la usa extensamente, además del posicionado de cámaras en la pantalla.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;x:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var x : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada izquierda del rectángulo (a lo largo del eje X).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;y:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var y : float &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada superior del rectángulo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;width:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var width : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anchura del rectángulo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;height:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var height : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Altura del rectángulo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;xMin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var xMin : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada izquierda del rectángulo.  Cambiando este valor conservamos el lado derecho del rectángulo (así width cambia también)    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;yMin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var yMin : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada superior del rectángulo. Cambiando este valor conservamos el lado inferior del rectángulo (así height cambiará también)          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;xMax:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var xMax : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada derecha del rectánculo. Cambiando este valor seguimos conservando el lado izquierdo del rectángulo, por lo que la anchura cambiará también. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;yMax:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var yMax : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordenada inferior del rectángulo. Cambiando este valor seguimos conservando el lado superior del rectángulo, así que la altura cambiará también. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Rect:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Rect (left : float, top : float, width : float, height : float) : Rect &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crea un nuevo rectángulo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Contains:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Contains (point : Vector2) : boolean &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Contains (point : Vector3) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve true si los componentes x e y  del parámetro point conforman  un punto dentro del rectángulo&lt;br /&gt;&lt;br /&gt;Un breve ejemplo explicativo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt;var rect = Rect (0, 0, 150, 150);&lt;br /&gt;&lt;br /&gt;if (rect.Contains(Input.mousePosition))&lt;br /&gt;  print(&quot;Dentro del rectángulo&quot;);&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;  print (&quot;Fuera del rectángulo&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hemos creado primero un plano a partir de las coordenadas 0(izquierda), 0(abajo), con 150 metros/unidades de ancho (a contar desde la izquierda) y otras tantas de alto(contadas desde abajo). Por lo tanto si el ratón lo ubicamos hacia la zona superior derecha se nos mostrará el mensaje de que estamos fuera del rectángulo y si hacemos lo propio hacia la zona inferior izquierda estaremos dentro del rectángulo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;MinMaxRect:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function MinMaxRect (left : float, top : float, right : float, bottom : float) : Rect &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crea un rectángulo entre min/max valores de coordenadas.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/3065209864827398171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/11/117-estructura-rect.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3065209864827398171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3065209864827398171'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/11/117-estructura-rect.html' title='117. ESTRUCTURA  RECT'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-203843102670192200</id><published>2011-10-31T16:28:00.000-07:00</published><updated>2011-10-31T16:39:43.236-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="47_ESTRUCTURA RAYCASTHIT"/><title type='text'>116. ESTRUCTURA RAYCASTHIT</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estructura usada para obtener información de vuelta de un raycast (rayo proyectado).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;point:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var point : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto de impacto en coordenadas globales donde el rayo golpea el collider&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;normal:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var normal : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El normal de la superficie que golpea el rayo.               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;baryentricCoordinate:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var barycentricCoordinate : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La coordenada baricéntrica del triángulo que golpeamos (baricentro = es un punto de una figura geométrica la recta que pasa por el cual divide la figura en dos partes iguales. )&lt;br /&gt;&lt;br /&gt;Esto nos permite interpolar cualquiera de los datos de los vértices a lo largo de los tres ejes.          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;distance:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var distance : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La distancia desde el origen del rayo hasta el punto de impacto.           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;triangleIndex:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var triangleIndex : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;el índice del triángulo que ha sido golpeado. El índice del triángulo es sólo válido si el colider que lo golpea es un MeshCollider.        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;textureCoord:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var textureCoord : Vector2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La coordenada de la textura UV en el punto de impacto.   Esto puede ser usado para pinturas de textura 3d o impactos de bala dibujados. Si el collider no es una mesh collider, retorna un Vector2 a cero.        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;textureCoord2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var textureCoord2 : Vector2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Las coordenadas de la textura uv secundaria.          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;lightmapCoord:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var lightmapCoord : Vector2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La coordinada del lightmap de uv en el punto de impacto. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;colider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var collider : Collider &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El collider que fue golpeado. Esta propiedad es nula si no se golpea nada y no-nula si golpeas algo.         &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;rigidbody:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var rigidbody : Rigidbody &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El rigidbody del collider que ha sido golpeado. Si el collider no está vinculado a un rigidbody es null.        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;transform:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var transform : Transform &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El Transform del rigidbody o collider que ha sido golpeado.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/203843102670192200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/116-estructura-raycasthit.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/203843102670192200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/203843102670192200'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/116-estructura-raycasthit.html' title='116. ESTRUCTURA RAYCASTHIT'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-4831117720520428253</id><published>2011-10-31T16:09:00.000-07:00</published><updated>2011-10-31T16:20:17.781-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="46_ESTRUCTURA RAY"/><title type='text'>115. ESTRUCTURA RAY</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estructura que nos permite representar y modificar rayos. Un rayo es una linea infinita que empieza en un punto dado y va en alguna dirección.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;origin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var origin : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto de origen del rayo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;direction:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var direction : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La dirección del rayo. La dirección es siempre un vector normalizado(1,0,0 o 0,1,0 o 0,0,1. Si asignamos un vector de longitud distinta de la unidad, será normalizado.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Ray:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Ray (origin : Vector3, direction : Vector3) : Ray &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crea un rayo que empieza en origin a lo largo de direction. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var ray = new Ray (transform.position, transform.forward);&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;En este ejemplo crearíamos un rayo que parte de la posición del transform al que está vinculado el script y que parte hasta el infinito a través del eje Z.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;GetPoint:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function GetPoint (distance : float) : Vector3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un punto tantas unidades como le pasemos en el parámetro a lo largo del rayo.         &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var r : Ray;&lt;br /&gt;print( r.GetPoint (10) ); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo imprime un punto situado 10 unidades a lo largo del rayo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ToString:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function ToString () : String &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function ToString (format : String) : String &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un string formateado para este rayo.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/4831117720520428253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/115-estructura-ray.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4831117720520428253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4831117720520428253'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/115-estructura-ray.html' title='115. ESTRUCTURA RAY'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-5602494660715554064</id><published>2011-10-31T12:54:00.001-07:00</published><updated>2011-10-31T13:34:34.088-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="45_CLASE RANDOM"/><title type='text'>114. CLASE RANDOM</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clase para generar números aleatorios. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;seed:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var seed : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coloca la semilla para el generador de números aleatorios. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;value:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var value : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un número aleatorio entre 0.0 (inclusive) y 1.0 (inclusive).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(var x: int =0; x&lt;10; x++){&lt;br /&gt;  print(Random.value);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;             &lt;br /&gt;&lt;br /&gt;Podréis comprobar que los diez números que nos aparecerán en pantalla están entre ambos valores. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;insideUnitSphere:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var insideUnitSphere : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un punto aleatorio dentro de una esfera con radio 1.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;transform.position = Random.insideUnitSphere * 2;&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;br /&gt;Este ejemplo situaría nuestro cubo en un punto aleatorio dentro de una esfera (3 dimensiones) con un radio de 2 unidades.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;insideUnitCircle:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var insideUnitCircle : Vector2 &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un punto aleatorio dentro de un círculo con radio 1.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var newPosition : Vector2 = Random.insideUnitCircle * 5;&lt;br /&gt;&lt;br /&gt;transform.position.x = newPosition.x;&lt;br /&gt;transform.position.y = newPosition.y;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;en este caso nuestro cubo se movería dentro de un círculo (2D) con radio de 5 unidades. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;onUnitSphere:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var onUnitSphere : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un punto aleatorio sobre la superficie de una esfera con radio 1.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function FixedUpdate(){&lt;br /&gt;  rigidbody.velocity = Random.onUnitSphere * 10;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;         &lt;br /&gt;&lt;br /&gt;Esta función mueve al rigidbody de nuestro cubo a una velocidad de 10 en una dirección aleatoria, por lo que no esperéis ver otra cosa al darle al play que un cubo volviéndose loco. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;rotation:&lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var rotation : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve una rotación aleatoria (read only)   &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var prefab : GameObject;&lt;br /&gt;Instantiate(prefab, Vector3.zero, Random.rotation);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo instanciaría un nuevo gameobject en el centro de la escena y con una rotación aleatoria. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Range:&lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Range (min : float, max : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un float aleatorio entre un min (inclusive) y max (inclusive). &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var prefab : GameObject;&lt;br /&gt;&lt;br /&gt;function Start () {&lt;br /&gt;  var position: Vector3 = Vector3(Random.Range(-5.0, 5.0), 0, Random.Range(-5.0, 5.0));&lt;br /&gt;  Instantiate(prefab, position, Quaternion.identity);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si arrastramos la esfera a la variable expuesta prefab, al darle al play observaremos que se clona una instancia de la misma y aparece en un lugar aleatorio en un margen de 5 metros en los ejes X y Z. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Range (min : int, max : int) : int&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;La misma función, pero admite y devuelve integers.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/5602494660715554064/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/114-clase-random.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5602494660715554064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5602494660715554064'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/114-clase-random.html' title='114. CLASE RANDOM'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-6642574506491436287</id><published>2011-10-31T11:26:00.000-07:00</published><updated>2011-10-31T12:49:57.786-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="44_ESTRUCTURA QUATERNION"/><title type='text'>113. ESTRUCTURA QUATERNION</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nuestros amigos los quaterniones son usados para representar rotaciones. Unity internamente usa Quaterniones para representar todas las rotaciones. &lt;br /&gt;&lt;br /&gt;Sin embargo, los quaterniones están basados en números complejos y no son fáciles de entender intuitivamente, así que casi nunca accederemos o modificaremos los componentes individuales de un Quaternión (x,y,z,w). Lo que será más habitual es que queramos meramente tomar rotaciones ya existentes (por ej desde un Transform) y usarlas para construir nuevas rotaciones (por ej interpolando suavemente entre dos rotaciones). &lt;br /&gt;&lt;br /&gt;Las funciones sobre Quaterniones que usaremos el 99% del tiempo (las otras funciones son para usos exóticos) son Quaternion.LookRotation, Quaternion.Angle, Quaternion.Euler, Quaternion.Slerp, Quaternion.FromToRotation y Quaternion.identity.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;eulerAngles:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var eulerAngles : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve la representacion en ángulos euler de la rotacion.           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ToAngleAxis:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function ToAngleAxis (out angle : float, out axis : Vector3): void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Convierte una rotación en una representación de angle-axis (ángulo de eje)     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SetFromToRotation:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void &lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;Crea una rotación que rota desde fromDirection hasta toDirection.     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ToString:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function ToString () : String &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function ToString (format : String) : String &lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;Devuelve un string formateado del Quaternion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;identity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var identity : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sería el equivalente a no rotation. El transform quedará perfectamente alineado con el mundo o con los ejes del padre.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;AngleAxis:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function AngleAxis (angle : float, axis : Vector3) : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crea una rotación que rota los ángulos que le pasemos como primer parámetro con respecto al eje que le pasamos como segundo.&lt;br /&gt;&lt;br /&gt;O sea, para girar nuestro cubo (previamente eliminadle el character controller que le añadimos el capítulo anterior), tecleamos: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;transform.rotation = Quaternion.AngleAxis(30, Vector3.up);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;De esta forma tan simple giramos el cubo 30 grados sobre el eje Y.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FromToRotation:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function FromToRotation (fromDirection : Vector3, toDirection : Vector3) : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crea una rotación que rota desde el primer parámetro al segundo.&lt;br /&gt;&lt;br /&gt;Normalmente usaremos esta función para rotar un transform uno de cuyos ejes sigue un objetivo en una dirección en coordenadas globales. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Slerp:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interpola esfériamente del primer al segundo parámetro durante el tercero. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;RotateTowards:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function RotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta : float) : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Efectúa una rotación entre el primer parámetro y el segundo. Esto es esencialmente lo mismo que Quaternion.Slerp, pero aquí la función se aregura de que la velocidad angular nunca exceda de la marcada en maxDegreesDelta. Si maxDegreesDelta tiene un valor negativo la rotación es empujada lejos del segundo parámetro (to).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Angle:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Angle (a : Quaternion, b : Quaternion) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el ángulo en grados entre dos rotaciones dadas.&lt;br /&gt;&lt;br /&gt;Veamos eso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var objetivo : Transform;&lt;br /&gt;&lt;br /&gt;function Update () {&lt;br /&gt;   var angulo : float = Quaternion.Angle(transform.rotation, objetivo.rotation);&lt;br /&gt;   Debug.Log(angulo);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Arrastramos la esfera a la variable expuesta objetivo. Si pulsamos play, observaremos que nos aparece un cero en pantalla, ya que (si teneis ambas figuras colocadas como yo) ambas tienen sus respectivas rotaciones a 0,0,0. Probad ahora a cambiar la rotación de una -o las dos- figuras. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Euler:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Euler (x : float, y : float, z : float) : Quaternion&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Euler (euler : Vector3) : Quaternion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve en quaterniones una rotación pasada como parámetro en grados euler.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/6642574506491436287/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/113-estructura-quaternion.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6642574506491436287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6642574506491436287'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/113-estructura-quaternion.html' title='113. ESTRUCTURA QUATERNION'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-6096983224425232161</id><published>2011-10-30T16:31:00.000-07:00</published><updated>2011-10-31T10:56:53.488-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="43_CLASE PHYSICS"/><title type='text'>112. CLASE PHYSICS (y II)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CapsuleCast:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CapsuleCast (point1 : Vector3, point2 : Vector3, radius : float, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CapsuleCast (point1 : Vector3, point2 : Vector3, radius : float, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lanza una cápsula contra todos los colliders de la escena y devuelve información de contra qué ha chocado. Devuelve true cuando el sweep (barrido) de la cápsula choca con algún collider. &lt;br /&gt;&lt;br /&gt;Los parámetros de esta función son:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;point1      El inicio de la cápsula. &lt;br /&gt;point2      El fin de la cápsula. &lt;br /&gt;radius      El radio de la cápsula. &lt;br /&gt;direction   La dirección en la cual hace el barrido la cápsula. &lt;br /&gt;hitInfo     Si devuelve true,  hitInfo contendrá más información sobre dónde golpeó &lt;br /&gt;            el collider. &lt;br /&gt;&lt;br /&gt;distance    La longitud del barrido. &lt;br /&gt;layerMask   Un Layer mask que se usa para ignorar selectivamente colliders cuando &lt;br /&gt;            se proyecte la cápsula.  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La cápsula viene conformada por las dos esferas con radios alrededor del point1 y point2, que forman los dos finales de la cápsula. Esto es útil cuando un Raycast no tiene suficiente precisión para lo que queremos hacer, como por ejemplo asegurarnos de que un personaje podrá moverse a cualquier sitio sin colisionar con nada en el camino. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SphereCast:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SphereCast (origin : Vector3, radius : float, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Proyecta una esfera contra todos los colliders de la escena y proporciona información sobre los que colisionan. Devuelve true si topa con alguno en su barrido.     &lt;br /&gt;&lt;br /&gt;Cuenta con estos parámetros:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;origin      El centro de la esfera al principio del barrido. &lt;br /&gt;radius      El radio de la esfera. &lt;br /&gt;direction   La dirección en la cual hace el barrido la esfera. &lt;br /&gt;hitInfo     Si la función devuelve true, esta variable contendrá más información &lt;br /&gt;            acerca de dónde el collider colisionó (Para más información ver: &lt;br /&gt;            RaycastHit). &lt;br /&gt;distance    La longitud del barrido. &lt;br /&gt;layerMask   Un Layer mask que se usa para ignorar selectivamente colliders cuando &lt;br /&gt;            se proyecta la cápsula. &lt;br /&gt;&lt;/pre&gt;                         &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta función es útil cuando un Raycast no nos da suficiente precisión, como por ejemplo en el caso en que queramos averiguar si un objeto de un determinado tamaño, como un character, será capaz de de moverse a algún lado sin colisionar con algo por el camino. En casos como estos es preferible usar la función SphereCast. &lt;br /&gt;&lt;br /&gt;Hemos de tener presente, eso sí, que la SphereCast no funcionará contra aquellos colliders configurados como triggers. &lt;br /&gt;&lt;br /&gt;Probemos un ejemplo. Previamente hay que añadirle un character controller al cubo. Acto seguido tecleamos este script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  var hit : RaycastHit;&lt;br /&gt;  var charCtrl : CharacterController = GetComponent(CharacterController);&lt;br /&gt;  var p1 : Vector3 = transform.position + charCtrl.center;&lt;br /&gt; &lt;br /&gt;  if (Physics.SphereCast (p1, charCtrl.height /2, transform.right, hit, 10)) {&lt;br /&gt;     Debug.Log(&quot;Hay un obstáculo a &quot; + hit.distance + &quot; metros&quot;);&lt;br /&gt;  }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lo que hemos hecho aquí es, a grandes rasgos, que nuestro cubo efectúe un barrido hacia la derecha en busca de obstáculos para un character con un radio equivalente a la mitad de la altura de nuestro character. Al topar con uno, se muestra un mensaje en pantalla junto con información suplementaria, como en este caso la distancia a que se halla dicho obstáculo. El ejemplo es un poco rupestre, pero nos permite intuir la utilidad de esta función para aplicársela a un personaje.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SphereCast (ray : Ray, radius : float, distance : float Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SphereCast (ray : Ray, radius : float, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CapsuleCastAll:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CapsuleCastAll (point1 : Vector3, point2 : Vector3, radius : float, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es como Physics.CapsuleCast, pero devolviendo todos los colliders que la cápsula intercepta en su barrido e información sobre los mismos. Devuelve un array con todos esos colliders.                 &lt;br /&gt;&lt;br /&gt;Parámetros:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;point1       El principio de la cápsula. &lt;br /&gt;point2       El final de la cápsula. &lt;br /&gt;radius       El radio de la cápsula. &lt;br /&gt;direction     La dirección en la cual efectúa el barrido la cápsula. &lt;br /&gt;distance      La longitud del barrido. &lt;br /&gt;layerMask     Un Layer mask que se usa para ignorar selectivamente algunos &lt;br /&gt;              colliders cuando se proyecta la cápsula &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La cápsula es definida por las dos esferas con su radio alrededor de point1 y point2, que forman los dos extremos de la cápsula. Son devueltos datos de todos los colliders contra los que nuestra cápsula proyectada choque en esa dirección. &lt;br /&gt;&lt;br /&gt;Recordemos que esta función no funciona contra colliders configurados como triggers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SphereCastAll:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SphereCastAll (origin : Vector3, radius : float, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SphereCastAll (ray : Ray, radius : float, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como physics.SphereCast, pero devolviendo todos los colliders que colisionen.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CheckSphere:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CheckSphere (position : Vector3, radius : float, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve true si hay algún collider tocando la esfera definida por position y radius en coordenadas globales.                &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CheckCapsule:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CheckCapsule (start : Vector3, end : Vector3, radius : float, layermask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve true si hay algún collider tocando la cápsula definida por el eje que va de start a end y que tiene el radio radius, en coordenadas globales.                   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;IgnoreCollision:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function IgnoreCollision (collider1 : Collider, collider2 : Collider, ignore : boolean = true) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hace que el sistema de detección de colisiones ignore todas las colisiones entre collider1 y collider2. Esto es muy útil por ejemplo para que los proyectiles no colisionen con el objeto que los dispara. &lt;br /&gt;      &lt;br /&gt;&lt;br /&gt;Esta función tiene algunas limitaciones: &lt;br /&gt;&lt;br /&gt; 1.- No es persistente. Esto significa que el estado de ignorar colisión no será almacenado en el editor cuando se salve la escena. &lt;br /&gt; 2.- Sólo puedes aplicar esta función a colliders en gameobjects activos. Cuando se desactiva el collider o el rigidbody vinculado se pierde el estado de IgnoreCollision y tendrás que llamar a esta función otra vez. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;IgnoreLayerCollision:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function IgnoreLayerCollision (layer1 : int, layer2 : int, ignore : boolean = true) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hace que el sistema de detección de colisiones ignore todas las colisiones entre cualquier collider en layer1 y otros en layer2.            &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;GetIgnoreLayerCollision:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function GetIgnoreLayerCollision (layer1 : int, layer2 : int) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Booleano que indica si las colisiones entre layer1 y layer2 están siendo ignoradas.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/6096983224425232161/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/112-clase-physics-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6096983224425232161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/6096983224425232161'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/112-clase-physics-ii.html' title='112. CLASE PHYSICS (y II)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-2762003930315688722</id><published>2011-10-30T15:45:00.000-07:00</published><updated>2011-10-30T16:30:58.289-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="43_CLASE PHYSICS"/><title type='text'>111. CLASE PHYSICS (I)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Componen esta clase, al igual que la estructura Mathf anterior, propiedades globales y métodos de ayuda relacionados con las físicas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;gravity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var gravity : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La gravedad aplicada a todos los rigidbodies en la escena. Puede ser desconectada para un rigidbody individual usando su propiedad useGravity.                  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Raycast:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Raycast (origin : Vector3,  direction : Vector3,  distance :  float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lanza un rayo contra todos los colliders en la escena. Devuelve true cuando el rayo intersecta algún collider.&lt;br /&gt;&lt;br /&gt;Tiene los siguientes parámetros:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;origin             El punto inicial del rayo en coordenadas globales. &lt;br /&gt;direction     La dirección del rayo. &lt;br /&gt;distance     La longitud o fuerza del rayo. &lt;br /&gt;layerMask     Una máscara de distribución (Layer mask) que se usa para ignorar&lt;br /&gt;                    selectivamente colliders cuando se proyecta un rayo. &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  var derecha : Vector3 = transform.TransformDirection (Vector3.right);&lt;br /&gt;  if (Physics.Raycast (transform.position, derecha, 10)) {&lt;br /&gt;  print (&quot;Hay algo a mi derecha&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lo que hacemos aquí es primero tomar la dirección local de nuestro cubo y convertirla en dirección global, a través de la función TransformDirection. Dicha dirección global la almacenamos en la variable &quot;derecha&quot;. Acto seguido, imprimimos un mensaje si desde la posición de nuestro cubo en una distancia no superior a diez metros hay a la derecha global del mismo otro objeto. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Raycast (origin : Vector3, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Proyecta un rayo contra todos los colliders en la escena y devuelve información detallada sobre qué golpeó.&lt;br /&gt;&lt;br /&gt;Los parámetros de este segundo prototipo de función son:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;origin        El punto de inicio del rayo en coordenadas globales. &lt;br /&gt;direction      La dirección del rayo. &lt;br /&gt;distance       La fuerza o longitud del rayo. &lt;br /&gt;hitInfo        Si se devuelve true, esta variable contendrá más información sobre &lt;br /&gt;               donde colisionó el collider. &lt;br /&gt;layerMask      Un layer mask usado para ignorar colliders selectivamente cuando se &lt;br /&gt;               proyecte un rayo.  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Raycast (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Son similares a las funciones anteriores, sólo que usando ray.origin y ray.direction en vez de origen y dirección como sendos Vector3.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;RaycastAll:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Lanza un rayo a través de la escena y devuelve todos los choques.           &lt;br /&gt;&lt;br /&gt;Vamos a adaptar un ejemplo del manual de referencia:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt;&lt;br /&gt;var choques : RaycastHit[];&lt;br /&gt;choques = Physics.RaycastAll (transform.position, transform.right, 100.0);&lt;br /&gt;&lt;br /&gt;for (var i = 0;i &lt; choques.Length; i++) {&lt;br /&gt;  var miChoque : RaycastHit = choques[i];&lt;br /&gt;  var renderer = miChoque.collider.renderer;&lt;br /&gt;&lt;br /&gt;  if (renderer) {&lt;br /&gt;      renderer.material.shader = Shader.Find(&quot;Transparent/Diffuse&quot;);&lt;br /&gt;      renderer.material.color.a = 0.3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vamos paso a paso en la explicación. Primero declaramos una variable que contendrá un array de tipo RaycastHit, que es precisamente lo que hemos visto que devuelve la función RaycastAll. La inicializamos con todas aquellas colisiones que sufra nuestro rayo, el cual proyectamos desde el cubo 100 metros a la derecha. &lt;br /&gt;&lt;br /&gt;Dado que puede haber más de una colisión, iteramos a través del array y el collider con el que se ha producido cada colisión le es asignado temporalmente a la variable miChoque, a través de la cual lo volvemos semitransparente.&lt;br /&gt;&lt;br /&gt;Si pulsamos play vemos que nuestra esfera se torna semiinvisible. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;LineCast:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Linecast (start : Vector3, end : Vector3, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve true si hay algún collider intersectando la línea entre start y end.                        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Linecast (start : Vector3, end : Vector3, out hitInfo : RaycastHit, layerMask : int = kDefaultRaycastLayers) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En este segundo prototipo, si se devuelve true, hitinfo contendrá más información sobre dónde colisionó el collider.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;OverlapSphere:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function OverlapSphere (position : Vector3, radius : float,  layerMask : int = kAllLayers) : Collider[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve un array con todos los colliders que toquen o estén dentro de la esfera cuya posición y radio pasamos como parámetros.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/2762003930315688722/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/111-clase-physics-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2762003930315688722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2762003930315688722'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/111-clase-physics-i.html' title='111. CLASE PHYSICS (I)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-1784941131011446078</id><published>2011-10-30T11:43:00.000-07:00</published><updated>2011-10-30T12:29:11.976-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="42_ESTRUCTURA MATHF"/><title type='text'>110. ESTRUCTURA MATHF (y III)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SmoothDamp:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SmoothDamp (current : float, target : float, ref currentVelocity : float, smoothTime : float, maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gradualmente cambia un valor hacia un objetivo en un determinado tiempo.     La función se puede usar para suavizar la transición de valores, colores, posiciones, escalares….  &lt;br /&gt;&lt;br /&gt;Cuenta con los siguientes parámetros:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;current          La posición actual. &lt;br /&gt;target           La posición que estamos tratando de alcanzar. &lt;br /&gt;currentVelocity  La velocidad actual. Este valor es modificado por la función cada &lt;br /&gt;                 vez que la llamamos. &lt;br /&gt;smoothTime       Aproximadamente el tiempo que tardaremos en alcanzar el objetivo. &lt;br /&gt;                 Un valor pequeño hará que allcancemos el objetivo más rápido.&lt;br /&gt;maxSpeed         Opcionalmente nos permite fijar la velocidad máxima. &lt;br /&gt;deltaTime        El tiempo desde la última llamada a esta función. Por defecto&lt;br /&gt;                 Time.deltaTime. &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var objetivo : Transform;&lt;br /&gt;var tiempoEmpleado = 3;&lt;br /&gt;private var yVelocity =4.0;&lt;br /&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  var newPosition : float = Mathf.SmoothDamp(transform.position.x, &lt;br /&gt;  objetivo.position.x, yVelocity, tiempoEmpleado);&lt;br /&gt;  transform.position = Vector3(newPosition, transform.position.y, &lt;br /&gt;  transform.position.z);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Salvamos y arrastramos el cubo a la variable expuesta &quot;objetivo&quot;. Lo que aquí estamos haciendo es usar la función SmoothDamp para ir marcando la nueva posición de nuestro cubo. El punto de origen será la posición actual del cubo (en el eje x), el destino la posición actual en dicho eje del transform que marcamos como objetivo, le establecemos un tiempo para que el origen alcance al objetivo de 3 segundos y le limitamos la velocidad máxima que pueda alcanzar nuestro cubo a cuatro metros por segundo. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SmoothDampAngle:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SmoothDampAngle (current : float, target : float, ref currentVelocity : float, smoothTime : float, maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cambia gradualmente un ángulo dado en grados hacia el ángulo que constituye el objetivo en un tiempo determinado.   El uso más común de esta función es para suavizar una cámara que esté siguiendo algún personaje o escena.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Repeat:&lt;/span&gt;       &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Repeat (t : float, length : float) : float &lt;/span&gt;       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Introduce en un bucle el valor t, de tal manera que nunca sea más grande que length y nunca más pequeño que 0.                 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;PingPong:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function PingPong (t : float, length : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hace rebotar el valor t, de tal manera que nunca sea mayor que length y nunca mayor que 0. El valor retornado se moverá atrás y adelante entre 0 y length.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;InverseLerp:&lt;/span&gt;        &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function InverseLerp (from : float, to : float, value : float) : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Calcula el parámetro Lerp entre dos valores.                &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ClosestPowerOfTwo:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function ClosestPowerOfTwo (value : int) : int &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Retorna la potencia de dos más cercana.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;IsPowerOfTwo:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function IsPowerOfTwo (value : int) : boolean &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve true si el valor es potencia de dos&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;NextPowerOfTwo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function NextPowerOfTwo (value : int) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el valor de la siguiente potencia de dos.                &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DeltaAngle:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DeltaAngle (current : float, target : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Calcula la diferencia más corta entre dos ángulos dados.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/1784941131011446078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/110-estructura-mathf-iii.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/1784941131011446078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/1784941131011446078'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/110-estructura-mathf-iii.html' title='110. ESTRUCTURA MATHF (y III)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-5421487649983388549</id><published>2011-10-30T09:52:00.001-07:00</published><updated>2011-10-30T11:17:26.094-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="42_ESTRUCTURA MATHF"/><title type='text'>109. ESTRUCTURA MATHF (II)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Ceil:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Ceil (f : float) : float&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el integer más pequeño igual o mayor que f.               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Floor:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Floor (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el mayor integer igual o más pequeño que f.              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Round:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Round (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve f redondeado al integer más cercano. Si el número acaba en .5 y queda entre dos integers, uno de los cuales es par y el otro impar, se devolverá el numero par.     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CeilToInt:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function CeilToInt (f : float) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el integer más pequeño igual o mayor que f.              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FloorToInt:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function FloorToInt (f : float) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el mayor integer menor o igual que f.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;RoundToInt:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function RoundToInt (f : float) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve f rendondeada al integer más cercano. Si e número acaba en .5 y por lo tanto está a medio camino entre dos integers, uno impar y el otro par, se devuelve el número par. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Sign:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Sign (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el signo de f.    Devuelve 1 si es positivo o cero, y -1 si f es negativo.         &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Clamp:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Clamp (value : float,  min : float,  max : float) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Clamp (value : int, min : int, max : int) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Restringe un valor entre un mínimo y un máximo, sean floats o ints.&lt;br /&gt;&lt;br /&gt;Vamos a verlo con un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(var x : int = 0; x &lt;= 10; x++) {&lt;br /&gt;  var numeroFijado : int = Mathf.Clamp(x, 1, 5); &lt;br /&gt;  Debug.Log(numeroFijado);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Mediante un bucle for le pasamos como primer parámetro a la función Clamp números del 10 al diez. Si desplegamos la consola tras probar este ejemplo veremos que cuando x vale 0, clamp devuelve el valor mínimo fijado (en este caso 1). Lo mismo pasa cuando x vale más de 5. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Clamp01:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Clamp01 (value : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fija un valor entre 0 y 1 y lo devuelve.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Lerp:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Lerp (from : float, to : float, t : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interpola a hacia b pasando por t. t queda fijada entre 0 y 1. Cuando t = 0 devuelve from. Cuando t = 1 devuelve to. Cuando t = 0.5 devuelve la media de a y b.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;LerpAngle:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function LerpAngle (a : float, b : float, t : float) : float &lt;/span&gt;       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo mismo que lerp, pero asegurándonos de interpolar valores correctamente cuando dé un giro de 360 grados.  Las variables a y b representan grados.   &lt;br /&gt;&lt;br /&gt;Para ilustrar esta función y la anterior vamos a apañar un pequeño ejemplo. Sería interesante que eliminárais el script vinculado a la esfera. Editamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var origen = -2.0;&lt;br /&gt;var destino = 1.0;&lt;br /&gt;var anguloInicial= 0.0;&lt;br /&gt;var anguloFinal= 90.0;&lt;br /&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  transform.position = Vector3(Mathf.Lerp(origen, destino, Time.time * 0.1), 0, 0);&lt;br /&gt;&lt;br /&gt;  var angle : float = Mathf.LerpAngle(anguloInicial, anguloFinal, Time.time * 0.1);&lt;br /&gt;  transform.eulerAngles = Vector3(0, angle, 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;    &lt;br /&gt;&lt;br /&gt;Salvamos y vinculamos el script al cubo. A la función Lerp le pasamos el parámetro de situación inicial -2, que coincide con su posición actual en el eje x, y le indicamos un destino en 1. Tradicionalmente como tercer parámetro se coloca Time.time, que pasa de 0 a 1 en un segundo, pero como queremos que el trayecto sea más lento, multiplicamos Time.time por 0.1, de tal manera que el trayecto total dure 10 segundos.&lt;br /&gt;&lt;br /&gt;Otro tanto hacemos con el angulo inicial y final. Como resultado, el cubo se moverá tres metros en el eje X y girará 90 grados sobre el eje Y en diez segundos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;MoveTowards:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function MoveTowards (current : float, target : float,  maxDelta : float) : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mueve el valor que indicamos en el parámetro current hacia el que indicamos en target. Hasta aquí la función sería parecida a  Mathf.Lerp, pero aquí nos aseguramos  de la que velocidad no exceda de  maxDelta. Valores negativos para maxDelta empuja el valor lejos del objetivo.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;MoveTowardsAngle:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function MoveTowardsAngle (current : float, target : float, maxDelta : float) : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo mismo que MoveTowards pero estando seguros de que los valores se interpolarán correctamente cuando gire 360 grados.  &lt;br /&gt;&lt;br /&gt;La diferencia de MoveTowards y MoveTowardsAngle con respecto de Lerp y LerpAngle la veremos más fácilmente rehaciendo el script anterior:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var origen = -2.0;&lt;br /&gt;var destino = 1.0;&lt;br /&gt;var minAngle = 0.0;&lt;br /&gt;var maxAngle = 90.0;&lt;br /&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  transform.position = Vector3(Mathf.MoveTowards(origen, destino, Time.time * 1),  &lt;br /&gt;  0,0);&lt;br /&gt;&lt;br /&gt;  var angle : float = Mathf.MoveTowardsAngle(minAngle, maxAngle, Time.time * 30);&lt;br /&gt;  transform.eulerAngles = Vector3(0, angle, 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;                                   &lt;br /&gt;&lt;br /&gt;La diferencia la tenemos que hallar en el tercer parámetro. En el caso de MoveTowards lo que le estamos pidiendo aquí al cubo es que se mueva en el eje x de la posición -2 a la 1 (3 metros, o sea) a razón de un metro por segundo. Y Para MoveTowardsAngle estamos indicándole al cubo que gire 90 grados a razón de 30 grados por segundo. De esta manera, en 3 segundos el cubo debería haber completado ambos movimientos. Probadlo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SmoothStep:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function SmoothStep (from : float, to : float, t : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Interpola entre mínimo y máximo y facilita entrada y salida de los límites. Sería como Lerp, pero con un impulso inicial. Si meramente sustituís em el último script MoveTowards por SmoothStep veréis a qué me refiero.     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Approximately:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Approximately (a : float, b : float) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Compara si dos valores en punto flotante son similares.   Debido a que los numeros en punto flotante son imprecisos no es recomendable compararlos usando el operador == (podría no devolver true), y es mejor utilizar esta función.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/5421487649983388549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/109-estructura-mathf-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5421487649983388549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5421487649983388549'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/109-estructura-mathf-ii.html' title='109. ESTRUCTURA MATHF (II)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-4944829540118855010</id><published>2011-10-30T07:22:00.001-07:00</published><updated>2011-10-30T07:56:30.684-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="42_ESTRUCTURA MATHF"/><title type='text'>108. ESTRUCTURA MATHF (I)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estructura que contiene una colección de funciones matemáticas que podemos usar para nuestros scripts. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;PI:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var PI : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El famoso 3.141592. (sólo lectura)&lt;br /&gt;&lt;br /&gt;Como pequeña anotación, observad que las variables de clase de Mathf comienzan por mayúscula, al contrario de las variables de clase del resto de clases y funciones en Unity. Tenedlo presente, ya que es una fuente importante de errores.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Infinity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var Infinity : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Representación del infinito positivo (sólo lectura)    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;NegativeInfinity:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var NegativeInfinity : float &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una representación del infinito negativo (sólo lectura)           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Deg2Rad:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var Deg2Rad : float &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conversión constante de grados a radianes (sólo lectura)    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Rad2Deg:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var Rad2Deg : float &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conversión constante de radianes a grados (sólo lectura)    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Epsilon:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var Epsilon : float &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El valor más pequeño que un float puede tener diferente de cero (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Sin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Sin (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el seno del ángulo f en radianes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Cos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Cos (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el coseno del ángulo f en radianes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Tan:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Tan(f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve la tangente del ángulo f en radianes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Asin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Asin (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el arco seno de f menos el ángulo en radianes cuyo seno es f.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Acos:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Acos (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el arco coseno de f menos el ángulo en radianes cuyo coseno es f.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Atan:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Atan (f : float) : float&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el arco tangente de f menos el ángulo en radianes cuya tangente es f.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Atan2:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Atan2 (y : float, x : float) : float &lt;/span&gt;        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el ángulo en radianes cuya tangente es y/x. &lt;br /&gt;&lt;br /&gt;El valor retornado es el ángulo entre el eje X y un vector 2D que empieza en cero y acaba en (x,y)    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Sqrt:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Sqrt (f : float) : float &lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve la raíz cuadrada de f.        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Abs:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Abs (value : float) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Abs (value : int) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el valor absoluto de value.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Min:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Min (a : float, b : float) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Min (params values : float[]) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Min (a : int, b : int) : int &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Min (params values : int[]) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el valor mínimo de dos o más valores dados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Max:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&lt;br /&gt;static function Max (a : float, b : float) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Max (params values : float[]) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Max (a : int, b : int) : int &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Max (params values : int[]) : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el valor máximo de dos o más valores.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Pow:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Pow (f : float, p : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devuelve f elevado a la potencia p.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Exp:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Exp (power : float) : float &lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve la potencia natural de un determinado número.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Log:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Log (f : float, p : float) : float &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Log (f : float) : float &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Devuelve el logaritmo de un determinado número en una base especificada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Log10:&lt;/span&gt;       &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Log10 (f : float) : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devuelve el logaritmo en base diez de un determinado número.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/4944829540118855010/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/108-estructura-mathf-i.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4944829540118855010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4944829540118855010'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/108-estructura-mathf-i.html' title='108. ESTRUCTURA MATHF (I)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-237314147094500415</id><published>2011-10-30T06:48:00.000-07:00</published><updated>2011-10-30T07:11:46.409-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="41_CLASE LIGHTMAPSETTINGS"/><title type='text'>107. CLASE LIGHTMAPSETTINGS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Almacena los mapas de luces (lightmaps) de la escena. &lt;br /&gt;&lt;br /&gt;Una escena puede tener varios lightmaps almacenados en ella, y suss componentes Renderer pueden usar esos lightmaps. Esto hace posible usar el mismo material en múltiples objetos, mientras cada objeto puede referirse a diferentes lightmaps o diferentes porciones del mismo lightmap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;lightmaps:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var lightmaps : LightmapData[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es un array de tipo LightmapData que puede almacenar diferentes lightmaps. LightmapData es una clase con dos variables: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;lightmapFar:          Lightmap que almacena la totalidad de la luz entrante.&lt;br /&gt;lightmapNear:         Lightmap que almacena sólo la luz indirecta entrante.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;lightsmapMode:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var lightmapsMode : LightmapsMode &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Modo de renderizado de lightmaps. LightmapsMode es una enumeración con los siguientes dos valores: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Single:       Modo de renderizado de lightmap tradicional.&lt;br /&gt;Dual:         Modo de renderizado de lightmap dual.&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/237314147094500415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/107-clase-lightmapsettings.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/237314147094500415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/237314147094500415'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/107-clase-lightmapsettings.html' title='107. CLASE LIGHTMAPSETTINGS'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-5580324841593440309</id><published>2011-10-30T04:53:00.000-07:00</published><updated>2011-10-30T06:25:41.630-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="40_CLASE GIZMOS"/><title type='text'>106. CLASE GIZMOS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Los Gizmos son usados para permitir un debug visual o bien para colocar ayudas en la vista de escena. &lt;br /&gt;&lt;br /&gt;Todos los gizmos deben ser dibujados o con la función OnDrawGizmos o con la función.  OnDrawGizmosSelected. La diferencia de ambas es que: &lt;br /&gt;&lt;br /&gt;OnDrawGizmos es llamada cada frame. &lt;br /&gt;OnDrawGizmosSelected es llamada sólo si el objeto al cual está vinculado el script es seleccionado. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;color:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var color : Color &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Establece el color para los gizmos que serán dibujados a continuación.         &lt;br /&gt;&lt;br /&gt;Vamos a hacer un pequeño ejemplo. Aseguráos de que MiPrimerScript sigue estando vinculado a la esfera, y acto seguido deseleccionar cualquier gameobject haciendo click en un espacio vacío de la Jerarquía. Comprobamos que en la vista game tengamos marcada la pestaña Gizmos. Escribimos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnDrawGizmosSelected () {&lt;br /&gt;  Gizmos.color = Color.blue;&lt;br /&gt;  var direction : Vector3 = transform.TransformDirection (Vector3.forward) * 5;&lt;br /&gt;  Gizmos.DrawRay (transform.position, direction);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le damos al play y no parece ocurrir nada. Esto es porque estamos llamando a la función OnDrawGizmosSelected, que sólo muestra el dibujo cuando seleccionamos el objeto al cual va vinculado el script, así que en la jerarquía seleccionamos la esfera y automáticamente nos debería aparecer una línea de color azul que va desde la posición del transform de la esfera cinco metros en adelante. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawRay:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawRay (r : Ray) : void &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawRay (from : Vector3, direction : Vector3) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dibuja un rayo que empieza desde from hasta from + direction. Lo hemos visto en funcionamiento en el ejemplo anterior.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawWireSphere:&lt;/span&gt;       &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawWireSphere (center : Vector3, radius : float) : void &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una esfera de alambre con centro y radio.  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var radio = 2.0;&lt;br /&gt;&lt;br /&gt;function OnDrawGizmos() {&lt;br /&gt;  Gizmos.color = Color.cyan;&lt;br /&gt;  Gizmos.DrawWireSphere (transform.position, radio);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;           &lt;br /&gt;&lt;br /&gt;Meramente como apunte, aquí la esfera de alambre se ve tengamos o no seleccionado el game object esfera, porque la hemos dibujado con la función OnDrawGizmos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawSphere:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawSphere (center : Vector3, radius : float) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una esfera sólida con centro y radio.               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawWireCube:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawWireCube (center : Vector3, size : Vector3) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una caja de alambre con centro y tamaño.             &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawCube:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawCube (center : Vector3, size : Vector3) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una caja sólida con centro y tamaño.              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawIcon:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawIcon (center : Vector3, name : String) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dibuja un icono en posición global en la vista de escena. El icono deberá tener el mismo nombre que le asignamos al parámetro name y estará ubicado en las coordenadas que le pasemos al parámetro center. El path del icono puede encontrarse en la carpeta Assets/Gizmos. &lt;br /&gt;&lt;br /&gt;Vamos por partes: Antes que nada necesitamos una imagen tipo icono. Yo para el ejemplo he usado &lt;a href=&quot;http://icons.iconarchive.com/icons/everaldo/starwars/128/X-Wing-icon.png&quot;&gt;ésta&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Renombramos a la imagen como &quot;nave&quot;. Por otro lado, en el archivo donde estamos guardando estos ejemplos, dentro de la carpeta assets, hemos de crear una carpeta llamada Gizmos, que es el path que Unity buscará para dar con los iconos de este tipo. Luego arrastramos nuestra nave a la recién creada carpeta. &lt;br /&gt;&lt;br /&gt;Y ahora editamos el script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnDrawGizmos () {&lt;br /&gt;   Gizmos.DrawIcon (transform.position + Vector3(0,2,0), &quot;nave.png&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Pulsamos el play, y dos metros por encima de nuestra esfera debería aparecernos la nave, tal que así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPJrBqHpIu0d62xAJXbEbFwArsF6rC9q6_LfoK1EocCHbeZDAGtZrPTWR5YiG7cEmOOONX6s2Y_otA6UCx68rPrKkSwre2tOnuHgjLChMgTyKjHu8dI4Tj3kVaonTjTHGG4_P58yDYc9sD/s1600/Captura_32.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 182px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPJrBqHpIu0d62xAJXbEbFwArsF6rC9q6_LfoK1EocCHbeZDAGtZrPTWR5YiG7cEmOOONX6s2Y_otA6UCx68rPrKkSwre2tOnuHgjLChMgTyKjHu8dI4Tj3kVaonTjTHGG4_P58yDYc9sD/s320/Captura_32.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5669261396374494066&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawGUITexture:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawGUITexture (screenRect : Rect, texture : Texture, mat : Material = null) : void &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawGUITexture (screenRect : Rect, texture : Texture, leftBorder : int, rightBorder : int, topBorder : int, bottomBorder : int, mat : Material = null) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una textura en coordenadas de pantalla. Es útil para backgrounds de GUI.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/5580324841593440309/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/106-clase-gizmos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5580324841593440309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/5580324841593440309'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/106-clase-gizmos.html' title='106. CLASE GIZMOS'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-8567411152669634409</id><published>2011-10-30T04:13:00.001-07:00</published><updated>2011-10-30T04:47:55.869-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="39_CLASE EVENT"/><title type='text'>105. CLASE EVENT (y III)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;GetTypeFromControl:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function GetTypeForControl (controlID : int) : EventType &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta función devuelve un tipo de evento que es filtrado para un determinado control cuya id pasamos como parámetro. Esta función es usada para implementar bloqueos de ratón y de focos de teclado.  &lt;br /&gt;&lt;br /&gt;El id del control para el que requerimos el tipo de evento se obtiene de  GUIUtilty.GetControlID (), y en EventType podemos ver una lista de sus posibles valores. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Use:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Use () : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Evento ya utilizado. deberíamos llamar a este método cuando ya hemos usado un evento. El tipo de evento será colocado  en EventType.Used, causando que otros elementos GUI lo ignoren.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;current:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var current : Event &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El evento actual/corriente que está siendo procesado en este mismo momento.&lt;br /&gt;&lt;br /&gt;Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;   var miEvento : Event = Event.current;&lt;br /&gt;   if(miEvento.type != EventType.repaint &amp;&amp; miEvento.type != EventType.layout){&lt;br /&gt; Debug.Log(&quot;Current detected event: &quot; + Event.current);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;              &lt;br /&gt;&lt;br /&gt;Salvamos y tras pulsar al play disparamos los eventos que deseemos. Detenemos el reproductor y accedemos a la consola donde se muestran los mensajes haciendo click sobre el último y ahí tendremos toda la información sobre teclas pulsadas, movimientos y clics del ratón, etc. Observaréis que descarté la impresión de eventos de tipo repaint y layout, que son los que se producen de manera automática y en un número mayor.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/8567411152669634409/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/105-clase-event-y-iii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/8567411152669634409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/8567411152669634409'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/105-clase-event-y-iii.html' title='105. CLASE EVENT (y III)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-606910272136117646</id><published>2011-10-30T03:30:00.000-07:00</published><updated>2011-10-30T04:47:12.555-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="39_CLASE EVENT"/><title type='text'>104. CLASE EVENT (II)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;clickCount:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var clickCount : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cuántos clicks de ratón consecutivos hemos recibido.                  &lt;br /&gt; &lt;br /&gt;Es usado en el evento EventType.MouseDown. Usadlo para diferenciar entre un click único y un doble click.&lt;br /&gt;&lt;br /&gt;Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private var numeroClicks : int = 0;&lt;br /&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;  var miEvento : Event = Event.current;&lt;br /&gt;  if (miEvento.isMouse) {&lt;br /&gt;     numeroClicks +=miEvento.clickCount;&lt;br /&gt;     Debug.Log(&quot;Mouse clicks: &quot; + numeroClicks);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Si lo probamos, vemos que tenemos un contador de clicks que contabiliza cada actividad (down y up) del botón del ratón desde el inicio del juego. Es una adaptación del script que está en el manual de referencia. Si os fijáis, declaramos la variable numeroClicks fuera de la función onGUI, para que no nos contabilice (como hace en el manual de referencia) los clicks de cada frame, sino los totales. Por lo demás, el script no tiene mucho misterio: inicializamos una variable de tipo Event con el evento actual, nos aseguramos de que el evento tenga que ver con el ratón y pasamos a contar clicks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;character:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var character : char &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tipo de caracter. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;   var miEvento : Event = Event.current;&lt;br /&gt;   if (miEvento.isKey) {&lt;br /&gt;       Debug.Log(&quot;Pulsado caracter: &quot; + miEvento.character);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;commandName&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var commandName : String &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El nombre de un evento de tipo ExecuteCommand o Validate Command (&quot;Copy&quot;, &quot;Cut&quot;, &quot;Paste&quot;, &quot;Delete&quot;, &quot;FrameSelected&quot;, &quot;Duplicate&quot;, &quot;SelectAll&quot;, etc) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;keyCode:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var keyCode : KeyCode &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El key code para eventos de teclado. Usado en los eventos EventType.KeyDown y EventType.KeyUp; devuelve el valor del KeyCode, por lo que se usa para manejar, por ejemplo, teclas de cursor, de funciones, etc. &lt;br /&gt;&lt;br /&gt;Teclead este código y tras salvar y darle al play pulsad por ejemplo una de las flechas de desplazamiento del teclado: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;  var miEvento : Event = Event.current;&lt;br /&gt;  if (miEvento.isKey) {&lt;br /&gt;     Debug.Log(&quot;El key code es: &quot; + miEvento.keyCode);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;shift:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var shift : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está shift pulsado? (sólo lectura)  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;control:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var control : boolean &lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está control pulsado? (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;alt:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var alt : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está alt pulsado? (Sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;capsLock:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var capsLock : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está el bloqueo de mayúsculas pulsado? (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;numeric:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var numeric : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Se está presionando alguna tecla del teclado numérico) (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;functionKey:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var functionKey : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Es la tecla presionada una tecla de función (alt, ctrl, shift, etc)? (Sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;isKey:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var isKey : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Es este evento un evento de teclado? (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;isMouse:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var isMouse : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Es este evento un evento de ratón? (sólo lectura)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/606910272136117646/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/104-clase-event-ii.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/606910272136117646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/606910272136117646'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/104-clase-event-ii.html' title='104. CLASE EVENT (II)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-3778958298920959348</id><published>2011-10-29T16:08:00.001-07:00</published><updated>2011-10-29T16:46:01.500-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="39_CLASE EVENT"/><title type='text'>107. CLASE EVENT (I)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tipos de teclas modificadores que pueden estar activos durante un proceso de pulsación de tecla. &lt;br /&gt;&lt;br /&gt;Los eventos pueden corresponder a entradas de usuario (teclas presionadas, acción de ratón) o bien ser distribuciones (layers) de unityGUI o eventos de renderizado.  Asi como OnGUI es potencialmente llamado multiples veces por frame. Event.current corresponde al actual evento dentro de la llamada a OnGUI. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;type:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var type : EventType &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variable que indica el tipo de evento. Es de tipo EventType, que es una enumeración que permite los siguientes valores: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;MouseDown           Un botón del ratón ha sido presionado. &lt;br /&gt;MouseUp             Un botón del ratón ha sido liberado. &lt;br /&gt;MouseMove           El ratón se ha movido (sólo en vista de edición).&lt;br /&gt;MouseDrag           El ratón fue arrastrado.&lt;br /&gt;KeyDown             Una tecla del teclado fue presionada. &lt;br /&gt;KeyUp               Una tecla del teclado fue liberada. &lt;br /&gt;ScrollWheel         La rueda del ratón se movió.&lt;br /&gt;Repaint             Un evento de repintado. Se envía uno cada frame. &lt;br /&gt;Layout              Un evento de distribución.&lt;br /&gt;DragUpdated         Solo en editor: operación de drag &amp; drop actualizada.&lt;br /&gt;DragPerform         Sólo en editor: operación de drag &amp; drop realizada.&lt;br /&gt;DragExited          Sólo en editor: operacion de drag &amp; drop finalizada.&lt;br /&gt;Ignore              el evento debe ser ignorado.&lt;br /&gt;Used                Evento ya procesado.&lt;br /&gt;ValidateCommand     Valida un comando especial (p.ej. copy &amp; paste)&lt;br /&gt;ExecuteCommand      Ejecuta un comando especial (p.ej. copy &amp; paste)&lt;br /&gt;ContextClick        El usuario ha hecho click con el botón derecho.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pongamos un breve ejemplo: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI () {&lt;br /&gt; Debug.Log(&quot;Current event detected: &quot; + Event.current.type);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este script meramente imprime el evento que está teniendo lugar cada frame. Prueba, tras pulsar play, a hacer click con diferentes botones del ratón, pulsa distintas teclas, mueve el ratón, etc. Luego detén el reproductor y haz click sobre el último mensaje de la consola para que te aparezca el pop up. Verás una lista enorme de eventos que han tenido lugar, la mayoría de repintado y distribución, pero entre ellos estarán los que hayas provocado durante ese tiempo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;mousePosition:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var mousePosition : Vector2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La posición del ratón. Variable usada en los eventos EventType.MouseMove y EventType.MouseDrag.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;delta:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var delta : Vector2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El movimiento relativo del ratón comparado con el último evento.           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;button:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var button : int &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Qué botón del ratón ha sido presionado.&lt;br /&gt;&lt;br /&gt;Apliquemos un ejemplo: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;  var miEvento : Event = Event.current;&lt;br /&gt;  if(miEvento.button == 0 &amp;&amp; miEvento.isMouse){&lt;br /&gt;     Debug.Log(&quot;Botón izquierdo&quot;);&lt;br /&gt;  } else if(miEvento.button == 1) {&lt;br /&gt;     Debug.Log(&quot;Botón derecho&quot;);&lt;br /&gt;  } else if (miEvento.button == 2) {&lt;br /&gt;     Debug.Log(&quot;Botón del centro&quot;); &lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creamos primero una instancia de la clase Event, que contendrá el evento actual. Si dicho evento es un evento de ratón (isMouse, que estudiaremos de aquí a un momento) y button vale cero (esto es, button vale cero pese a haber un evento de ratón, ya que si no hay evento de ratón button también vale cero, no sé si me estoy explicando)&lt;br /&gt;se imprime un mensaje, y así sucesivamente (con valores de button en uno y dos no hace falta descartar la posibilidad de que no se esté produciendo un evento de ratón por lo anteriormente explicado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;modifiers:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var modifiers : EventModifiers &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Qué tecla modificadora está siendo pulsada( ahift, ctrl, alt...)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnGUI() {&lt;br /&gt;  var miEvento : Event = Event.current;&lt;br /&gt;  Debug.Log(miEvento.modifiers);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Probad a pulsar las teclas modificadoras y las veréis impresas, a diferencia de las que no tienen esa condición.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/3778958298920959348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/107-clase-event-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3778958298920959348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/3778958298920959348'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/107-clase-event-i.html' title='107. CLASE EVENT (I)'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-8472346674203008783</id><published>2011-10-29T15:19:00.001-07:00</published><updated>2011-10-29T15:53:29.891-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="38_CLASE DEBUG"/><title type='text'>106. CLASE DEBUG</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clase que contiene métodos para desbugear con facilidad mientras se desarrolla un juego:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES DE CLASE:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;isDebugBuild:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static var isDebugBuild : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el diálogo Build Settings, que podemos encontrar en el menú=&gt;File,  hay un check box llamado “Development Build”. Si dicho check box está marcado, entonces isDebugBuild será true. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES DE CLASE:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawLine:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawLine (start : Vector3, end : Vector3, color : Color = Color.white, duration : float = 0.0f) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una lidea desde el punto que le pasemos como parámetro start hasta el establecido como end con el color que le establezcamos como tercer parámetro y durante un tiempo fijado en duration. Si la duración es 0 entonces la linea es dibujada un frame. &lt;br /&gt;&lt;br /&gt;La linea será dibujada en la vista de escena del editor. Si en la ventana Game está habilitada la opcion Gizmos, también se mostrará ahí la línea. &lt;br /&gt;&lt;br /&gt;Un pequeño ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt;  Debug.DrawLine (Vector3.zero, transform.position, Color.red);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Estamos dibujando una línea que empezaría en el centro de la escena y que iría hasta el centro del objeto que tiene vinculado el script, esto es, la esfera. La línea sería de color rojo y se dibuja cada frame, coincidiendo con las veces que es llamada la función Update. Si queremos ver también la línea en la vista Game, recordemos activar el botón Gizmos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;DrawRay:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function DrawRay (start : Vector3, dir : Vector3, color : Color = Color.white, duration : float = 0.0f) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dibuja una línea desde start a start+dir con el color que especifiquemos por una duración de tiempo también establecida. Si duración es 0 entonces la línea es dibujada un frame. &lt;br /&gt;&lt;br /&gt;Para ver las diferencias con la función anterior, lo mejor será realizar el mismo ejemplo con la nueva función. Así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Update () {&lt;br /&gt; Debug.DrawRay (Vector3.zero, transform.position*10, Color.red);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vemos que aquí el segundo parámetro no es el destino final del rayo, sino la dirección y distancia de éste. En este caso veremos una línea/rayo de 10 metros saliendo desde el centro de la escena.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Break:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Break () : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pausa el editor. Esto es útil cuando queremos comprobar ciertos valores en el inspector y no somos capaces de pausarlo manualmente.     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Log:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Log (message : object) : void&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anota mensajes en la consola de Unity:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Debug.Log(&quot;Hola, mundo&quot;); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Log (message : object, context : Object) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando seleccionas en mensaje en la consola se dibuja una  conexión con el objeto contextual. Esto es muy útil si queremos saber qué errores ocurren en un objeto. Me explico. Escribimos esto en MiPrimerScript (que recordemos que tenemos vinculado a la esfera):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Debug.Log (&quot;Hola, mundo&quot;, gameObject);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Al darle al play, tal como podemos suponer, aparece el mensaje impreso en la consola. Pero en este caso, si hacemos click sobre ese mensaje, observaremos que en la jerarquia automáticamente se nos selecciona la esfera durante unos segundos. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;LogError:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function LogError (message : object) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una variable de Debug.Log que anota un mensaje de error en la consola (en color rojo)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Debug.LogError(&quot;Esto es un error&quot;);  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function LogError (message : object, context : Object) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Variante similar a la que tratábamos antes para Log.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;LogWarning:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function LogWarning (message : object) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una variante de Debug.Log que muestra un mensaje de aviso en la pantalla (en color amarillo)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function LogWarning (message : object, context : Object) : void &lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;Mensaje vinculado a un determinado objeto, como en los dos casos anteriores.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/8472346674203008783/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/106-clase-debug.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/8472346674203008783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/8472346674203008783'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/106-clase-debug.html' title='106. CLASE DEBUG'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-4721739428261178696</id><published>2011-10-29T10:48:00.001-07:00</published><updated>2011-10-29T12:11:34.094-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="37_CLASE CONTROLLERCOLLIDERHIT"/><title type='text'>105. CLASE CONTROLLERCOLLIDERHIT</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ControllerColliderHit es usado por CharacterController.OnControllerColliderHit para dar información detallada sobre la colisión y como trabajar con ella. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;controller:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var controller : CharacterController &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El controller que golpea el collider.      &lt;br /&gt;&lt;br /&gt;un simple ejemplo, para el cual con la esfera seleccionada vamos a menú=&gt;Component=&gt;Physics=&gt;Character Controller, y reemplazamos la Sphere Collider. Luego escribimos el siguiente script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnControllerColliderHit(colision : ControllerColliderHit) {&lt;br /&gt;   Debug.Log(colision.controller.name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function FixedUpdate(){&lt;br /&gt;   collider.Move(Vector3(-8,0,0));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;br /&gt;Poco que explicar. Movemos la esfera hacia el cubo (notad que sustituimos la función AddForce por Move, ya que ahora nuestra esfera tiene un character controller. Una vez impacta con el cubo, se imprime el nombre del controller (la esfera)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;collider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var collider : Collider &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El collider que fue golpeado por el controller. Para verlo en un ejemplo sustituyamos &quot;colision.controller.name&quot; por &quot;colision.collider.name&quot;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;rigidbody:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var rigidbody : Rigidbody &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El rigidbody que fue golpeado por el controller. Es null si no se toca un rigidbody sino un collider estático.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;gameObject:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var gameObject : GameObject &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El game object que fue golpeado por el controller.                 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;transform:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var transform : Transform &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El transform que fue golpeado por el controller. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;point:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var point : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto de impacto en coordenadas globales. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;normal:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var normal : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El normal de la superficie con la que colisionamos en coordenadas globales.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;moveDirection:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var moveDirection : Vector3 &lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aproximadamente la dirección desde el centro de la cápsula al punto que tocamos. Esto puede ser útil para encontrar una dirección razonable para aplicar fuerzas a rigidbodies golpeados.            &lt;br /&gt;&lt;br /&gt;Por poner un ejemplo muy básico: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnControllerColliderHit(colision : ControllerColliderHit) {&lt;br /&gt;   colision.rigidbody.AddForce(colision.moveDirection * 15);&lt;br /&gt;   Debug.Log(colision.moveDirection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function FixedUpdate(){&lt;br /&gt;   collider.Move(Vector3(-2,0,0));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cuando el cubo recibe el impacto de la esfera, a su vez al rigidbody vinculado al cubo le aplicamos una fuerza en la misma dirección del impacto, multiplicada por quince. Paralelamente imprimimos la dirección desde el centro de la cápsula de nuestro controller al punto de contacto. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;moveLenght:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var moveLength : float &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Indica lo lejos que el character controller ha viajado hasta golpear al collider. Note que esto puede ser diferente  de lo que pasas a CharacterController.Move, porque todos los movimientos están constreñidos por colisiones.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/4721739428261178696/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/105-clase-controllercolliderhit.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4721739428261178696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/4721739428261178696'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/105-clase-controllercolliderhit.html' title='105. CLASE CONTROLLERCOLLIDERHIT'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-2575217682639081396</id><published>2011-10-29T09:13:00.001-07:00</published><updated>2011-10-29T10:29:26.072-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="36_CLASE COLLISION"/><title type='text'>104. CLASE COLLISION</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clase que obtiene diferente información de una colisión. &lt;br /&gt;&lt;br /&gt;La información de la collision es pasada a los eventos Collider.OnCollisionEnter, Collider.OnCollisionStay y Collider.OnCollisionExit. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;relativeVelocity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variable de sólo lectura que devuelve la velocidad lineal relativa de los dos objetos que colisionan.&lt;br /&gt;&lt;br /&gt;Para realizar un ejemplo, recoloquemos antes la esfera en (2,0,0). Luego escribamos nuestro script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnCollisionEnter(colision : Collision) {&lt;br /&gt;  var velCol: Vector3 = colision.relativeVelocity;&lt;br /&gt;  Debug.Log(velCol.magnitude);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function FixedUpdate(){&lt;br /&gt;  rigidbody.AddForce(Vector3(-4,0,0));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;     &lt;br /&gt;&lt;br /&gt;Expliquemos el script de abajo arriba. En la función FixedUpdate lo único que hacemos es aplicar una fuerza de cuatro unidades hacia la izquierda a la esfera, forzándola a colisionar con el cubo. En el momento en que la esfera topa con el cubo, los datos de la colisión son almacenados en el parámetro colision. Uno de dichos datos es, como estamos estudiando, la velocidad relativa a la que aquélla se produce, velocidad que almacenamos en la variable velCol, de tipo Vector3. Ya sólo nos queda imprimir la fuerza o longitud de dicho vector, que como recordaremos se hace a través de la variable magnitude.&lt;br /&gt;&lt;br /&gt;Pulsamos play y observamos que la magnitud de la colisión es de algo menos de 4 (fruto de descontar el rozamiento y la resistencia respecto de la fuerza aplicada)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;rigidbody:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var rigidbody : Rigidbody &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variable de sólo lectura que hace referencia al  rigidbody que golpeamos. Es nulo si el objeto que golpeamos es un collider sin rigidbody vinculado.         &lt;br /&gt;&lt;br /&gt;Es fácil de ilustrar con un ejemplo: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function OnCollisionEnter(colision : Collision) {&lt;br /&gt;  if(colision.rigidbody){&lt;br /&gt;     Debug.Log(&quot;He topado con el rigidbody del objeto &quot; + colision.rigidbody.name);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function FixedUpdate(){&lt;br /&gt;  rigidbody.AddForce(Vector3(-4,0,0));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;        &lt;br /&gt;&lt;br /&gt;No hay mucho que explicar. Si el collider con el que topa nuestra esfera tiene un rigidbody, se nos imprime un texto que además incluye el nombre del objeto al que dicho rigidbody pertenece. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;collider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var collider : Collider &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El collider que golpeamos (sólo lectura).&lt;br /&gt;&lt;br /&gt;Para determinar la parte concreta que golpeamos de cada collider deberemos iterar a través de los puntos de contacto con la propiedad contacts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;transform:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var transform : Transform&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El transform del objeto que golpeamos (read only). Si chocamos contra un collider con un rigidbody, el transform será el vinculado al rigidbody. Si colisionamos contra un collider sin rigidbody, el transform será el vinculado al collider.                &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;gameObject:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var gameObject : GameObject &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Variable de sólo lectura que devuelve el objeto con el que chocamos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;contacts:&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var contacts : ContactPoint[] &lt;/span&gt;               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto de contacto generado por el engine de físicas. &lt;br /&gt;&lt;br /&gt;Cada contacto implica un punto de contacto, un normal y dos colliders que colisionan (ver ContactPoint). A  través de OnCollisionStay o OnCollisionEnter puedes siempre estar seguro de que el contacto tiene al menos un elemento.  &lt;br /&gt;&lt;br /&gt;ContactPoint es una estructura que tiene estas variables:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) point: el punto de contacto. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;       function OnCollisionEnter(colision : Collision) {&lt;br /&gt;            if(colision.relativeVelocity.magnitude &gt; 2){&lt;br /&gt;              print(&quot;Puntos de colision: &quot; + colision.contacts.Length);&lt;br /&gt;              print(&quot;Primer punto de colision: &quot; + colision.contacts[0].point);&lt;br /&gt;       }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function FixedUpdate(){&lt;br /&gt;            rigidbody.AddForce(Vector3(-8,0,0));&lt;br /&gt;       }&lt;br /&gt;&lt;/pre&gt;                &lt;br /&gt;  &lt;br /&gt;Una breve explicación del script: Como en el anterior aplicamos una fuerza a la esfera que la obliga a colisionar con el cubo. Si dicha colisión tiene una fuerza superior a 2 unidades se imprimen dos mensajes: uno que indica el número de colisiones que se ha producido y otro el punto exacto de la primera colisión. Si no hubiéramos establecido una fuerza mínima del contacto para que aparecieran los mensajes, el propio contacto de la esfera con el suelo habría disparado dichos mensajes. Pulsamos play y veremos uno de los mensajes, y si hacemos click sobre dicho mensaje para que nos aparezca el popup de la consola, encontraremos el segundo, tal como muestro en esta captura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsfXGry2YOUkSKMQH_-Po-XVR4DzQD82RRbgyfGTCkZQKjl_nc9X8EyiAjzwym5aNmcjpnKtSpIqWK9K-ukdXhEIgOxNZvu-xgRL5qKOyxTqjrIggqookfogMxsD93155rSkV3ARSD4DZS/s1600/Captura_31.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 306px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsfXGry2YOUkSKMQH_-Po-XVR4DzQD82RRbgyfGTCkZQKjl_nc9X8EyiAjzwym5aNmcjpnKtSpIqWK9K-ukdXhEIgOxNZvu-xgRL5qKOyxTqjrIggqookfogMxsD93155rSkV3ARSD4DZS/s320/Captura_31.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5668962971827633378&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) normal: El normal del punto de contacto. &lt;br /&gt;&lt;br /&gt;3) thisCollider: El primer collider en contacto, o sea, el vinculado al script. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;      function OnCollisionEnter(colision : Collision) {&lt;br /&gt;      if (colision.relativeVelocity.magnitude &gt; 2){&lt;br /&gt;         print(&quot;This collider is named: &quot; + colision.contacts[0].thisCollider.name);&lt;br /&gt;      }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      function FixedUpdate(){&lt;br /&gt;         rigidbody.AddForce(Vector3(-8,0,0));&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;En este sencillo script observamos que thisCollider se corresponde a la esfera.&lt;br /&gt;&lt;br /&gt;4) otherCollider: El otro collider en  contacto. Para comprobar que hace referencia al cubo, meramente sustituir en el script anterior thisCollider por otherCollider.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/2575217682639081396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/104-clase-collision.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2575217682639081396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2575217682639081396'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/104-clase-collision.html' title='104. CLASE COLLISION'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5586674761887030098.post-2411135080589515800</id><published>2011-10-29T04:47:00.001-07:00</published><updated>2011-10-29T05:27:21.551-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="35_ESTRUCTURA BOUNDS"/><title type='text'>103. ESTRUCTURA BOUNDS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s1600/unity_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s320/unity_icon.png&quot; height=&quot;91&quot; border=&quot;0&quot; width=&quot;86&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como es fácil apreciar, Bounds no es una clase, sino una estructura. La diferencia, aunque a efectos prácticos una clase es lo mismo que una estructura, es más de tipo semántico. Esto es, cuando nos topamos con una estructura, se nos quiere informar de que la misma tiene un componente de complemento a una o varias clases que no suelen tener las clases en sí.&lt;br /&gt;&lt;br /&gt;La estructura bounds representa una caja de bordes con los ejes alineados. También denominada AABB (para abreviar axis-aligned bounding box), es una caja alineada con los ejes de coordenadas globales que envuelve algún objeto. &lt;br /&gt;&lt;br /&gt;Como la caja nunca rota respecto de los ejes, puede ser definida por su centro y  extensiones, o alternativamente por mínimo y máximo. (center, extents, min y max, en inglés)&lt;br /&gt;&lt;br /&gt;La estructura Bounds se usa en Collider.bounds, Mesh.bounds y Renderer.bounds.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;VARIABLES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;center:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var center : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El centro de la caja.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;size:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var size : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tamaño total de la caja. Es siempre dos veces más grande que las extensiones (extents)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;extents:&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var extents : Vector3 &lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Las extensiones de la caja. Es siempre la mitad del tamaño (size)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;min:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var min : Vector3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto mínimo de la caja. Es siempre igual a center – extents.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;max:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;var max : Vector3 &lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El punto máximo de la caja. Siempre es igual a center+extents. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;FUNCIONES:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;static function Bounds (center : Vector3, size : Vector3) : Bounds &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crea una nueva caja de bordes con un centro dado y un tamaño total. Las extensiones deben ser la mitad del tamaño dado. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;SetMinMax:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function SetMinMax (min : Vector3, max : Vector3) : void &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Establece los bordes en los valores mínimos y máximos de la caja. Usar esta función es más rápido que asignar min y max de manera separada.         &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Encapsulate:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Encapsulate (point : Vector3) : void&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Encapsulate (bounds : Bounds) : void&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Incrementa la caja para incluir el punto que se pasa como parámetro (1er prototipo) o para incluir la nueva caja (2º prototipo)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Expand:&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Expand (amount : float) : void &lt;/span&gt;       &lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Expand (amount : Vector3) : void &lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Expande la caja para incrementar su tamaño en una cantidad a lo largo de cada cara.             &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Intersects:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Intersects (bounds : Bounds) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Hay alguna otra caja intersectando nuestra caja?      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Contains:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function Contains (point : Vector3) : boolean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Está el punto point contenido en la caja?         &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;sqrDistance:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function SqrDistance (point : Vector3) : float&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El cuadrado de la distancia entre el punto point y la caja. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;intersectRay:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;function IntersectRay (ray : Ray) : boolean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿El rayo ray intersecta esta caja?  &lt;br /&gt;&lt;br /&gt;Pongamos un ejemplo. Previamente ubicamos la esfera (que es el gameobject al que tenemos vinculado nuestro script) en la posicion (2,0,2), y le añadimos de nuevo un componente Rigidbody.&lt;br /&gt;&lt;br /&gt;Ahora reeditamos MiPrimerScript así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var rayo : Ray = new Ray (Vector3.zero, Vector3.forward);;&lt;br /&gt;&lt;br /&gt;function Update () {&lt;br /&gt;   Debug.DrawRay (Vector3.zero, Vector3.forward * 999, Color.green);&lt;br /&gt;   var bordes : Bounds = transform.collider.bounds;&lt;br /&gt;   if (bordes.IntersectRay (rayo))&lt;br /&gt;      Debug.Log(&quot;La caja tocó el rayo&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function FixedUpdate() {&lt;br /&gt;   rigidbody.AddForce(-Vector3.right*6*Time.deltaTime);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creamos primero un rayo que surge en el centro global de la escena y se prolonga a lo largo del eje z positivo (vulgarmente, hacia delante). Ya dentro de la función update dibujamos ese mismo rayo que ya tenemos descrito, para que visualmente podamos seguir lo que está pasando. Acto seguido creamos una instancia de la estructura Bounds que en un alarde de originalidad llamaremos bordes, y la inicializaremos con la caja de bordes del collider de nuestro gameobject (la caja que envuelve el collider, ojo, no confundir con el collider mismo. En este caso el collider tiene forma de escena y el Bounds de la esfera sigue teniendo forma de caja). Dejamos establecido que si la caja toca el rayo se mostrará un mensaje en pantalla, así que sólo nos queda darle movimiento a la esfera para que cuando intersecte el rayo (que aquí hemos dibujado a través de DrawRay, pero que podríamos haber dejado invisible) se muestre dicho mensaje.</content><link rel='replies' type='application/atom+xml' href='http://unityscripts.blogspot.com/feeds/2411135080589515800/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://unityscripts.blogspot.com/2011/10/103-estructura-bounds.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2411135080589515800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5586674761887030098/posts/default/2411135080589515800'/><link rel='alternate' type='text/html' href='http://unityscripts.blogspot.com/2011/10/103-estructura-bounds.html' title='103. ESTRUCTURA BOUNDS'/><author><name>UnityScripts</name><uri>http://www.blogger.com/profile/03182489150638732558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQ_SHyUUQvV8DONxnvA3sOM9AkrV6jBrDjoHxwKRRo8JodXzeO2hKk5Qa71lPvU9gxa8qHZeE2EVnr_OZFeSuJcOQ0VyVwFasLuMna2djUHl4D7U5drhFTYUpUe3Q98Wsm2L43PeXlO-c/s72-c/unity_icon.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>