26. CLASE COLLIDER (II)
FUNCIONES:
ClosestPointOfBounds:
function ClosestPointOnBounds (position : Vector3) : Vector3
Devuelve el punto más cercano de nuestro Collider con respecto a un punto dado. Esto puede ser usado para calcular puntos de choque cuando se aplique daño derivado de una explosión.
Raycast:
function Raycast (ray : Ray, hitInfo : RaycastHit, distance : float) : boolean
Proyecta un rayo que devuelve true si tropieza con algún collider en la dirección y distancia indicadas.
Consta de varios parámetros. El primero es de tipo Ray, y nos vamos a detener un momento en él.
La estructura Ray nos permite crear una línea con un origen y una dirección. Consta de dos variables -de nombre origin y direction- que no son sino sendos Vector3 para representar el inicio y la dirección de dicha linea. Para verlo gráficamente, tecleamos el siguiente script:
function Update(){
var rayo : Ray;
rayo.origin = transform.position;
rayo.direction = transform.right;
Debug.DrawLine(rayo.origin, rayo.direction);
}
Al darle al play, observamos en la ventana de escena el rayo saliendo del cubo. Si queremos ver el mismo efecto en la ventana del juego, hemos de activar el botón gizmo que aparece encima de ésta, a su derecha:
El segundo parámetro de la función Raycast -HitInfo- contendrá información sobre aquello con lo que golpeó el collider para el caso de que la función devuelva true, esto es, tropiece con algo.
El tercer parámetro -distance- es obviamente la longitud del rayo.
OnTriggerEnter:
function OnTriggerEnter (other : Collider) : void
Esta función y las que restan forman parte de la categoría de "mensajes enviados".
Al estudiar la variable isTrigger decíamos que si nuestro collider habilitaba dicha variable, se convertía en un trigger (disparador) y dejaba de colisionar con otros rigidbodies, y que en lugar de responder a las físicas, al entrar en contacto (o dejar de tenerlo) con ellos lanzaba una serie de mensajes.
OnTriggerEnter, así, es llamada cuando nuestro trigger entra en contacto con otros colliders, de tal manera que podemos escribir dentro de dicha función el código que defina lo que queramos que ocurra cuando se produce dicho contacto.
Para explicarlo gráficamente, vamos a intentar hacer un script progresivo. Empecemos por eliminar el script que tenemos vinculado al cubo. Después, abrimos MiPrimerScript en Proyecto. Tecleamos lo siguiente:
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}
Salvamos y arrastramos el script a la esfera. Tal como es de esperar, ésta recibe una fuerza hacia la derecha que le lleva a chocar con el cubo.
¿Qué sucede si nuestra esfera es convertida en trigger?. Probémoslo:
collider.isTrigger =true;
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}
Le damos al play y observamos que la esfera ha perdido toda solidez, de tal suerte que atraviesa el suelo y cae. Tenemos que evitar para nuestros fines que la esfera se mueva en el eje Y, evitando que caiga. Una variable que ya hemos estudiado viene en nuestra ayuda:
collider.isTrigger =true;
rigidbody.constraints = RigidbodyConstraints.FreezePositionY;
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}
Ahora hemos preparado el terreno para lo que quería demostrar. De momento observamos que la esfera, en efecto, ya no cae (no puede operar en el eje Y), pero atraviesa -tal como era de esperar- el cubo. Vamos ahora a diseñarle un comportamiento específico a la esfera para cuando entre en contacto con el cubo.
collider.isTrigger =true;
rigidbody.constraints = RigidbodyConstraints.FreezePositionY;
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}
function OnTriggerEnter(loPrimeroQuePille) {
loPrimeroQuePille.gameObject.renderer.material.color = Color.red;
}
Démosle al play y luego la explicamos.
Efectivamente, en el momento en que nuestro trigger/esfera topa con otro collider, lo valores del mismo son asignados al parámetro de la función OnTriggerEnter y podemos acceder a ellos para, como es el caso, por ejemplo cambiarle el color al cubo. Puede parecer un poco tortuoso todo el camino que nos lleva del collider loPrimeroQuePille hasta el color, pero con un poco de práctica y/o una guia rápida a mano, y conociendo el principio y el final del path, el resto es bastante sencillo.
Fijémonos por otro lado en que este tipo de funciones no pertenecen propiamente a la clase, no usan un operador punto para vincularse a un objeto de una clase, sino que se usan de manera independiente, aunque para su activación requieren que efectivamente un collider con el trigger habilitado entre en contacto con algo. Es decir, su inclusión en la clase collider es más por "afinidad" que porque realmente formen parte de aquella.
OnTriggerExit:
function OnTriggerExit (other : Collider) : void
Es llamada cuando el collider "other" deja de tocar con nuestro trigger.
OnTriggerStay:
function OnTriggerStay (other : Collider) : void
Es llamada casi todos los frames que el collider other esté tocando nuestro trigger.
OnCollisionEnter:
function OnCollisionEnter (collisionInfo : Collision) : void
Es llamada cuando nuestro collider/rigidbody empiece a tocar otro rigidbody/collider.
OnCollisionExit:
function OnCollisionExit (collisionInfo : Collision) : void
Es llamada cuando nuestro collider/rigidbody deja de tocar otro rigidbody/collider.
OnCollisionStay:
function OnCollisionStay (collisionInfo : Collision) : void
Es llamada una vez por frame por cada collider/rigidbody que esté tocando nuestro rigidbody/collider.
Con la tecnología de Blogger.
BUSCADOR
PÁSATE POR EL FORO
API DE UNITY
TEMAS
- 00_INTRODUCCION (3)
- 01_CLASE OBJECT (3)
- 02_ESTRUCTURA VECTOR3 (4)
- 03_CLASE TRANSFORM (7)
- 04_CLASE RIGIDBODY (8)
- 05_CLASE COLLIDER (2)
- 06_CLASE MESHCOLLIDER (1)
- 07_CLASE CHARACTERCONTROLLER (3)
- 08_CLASE RENDERER (2)
- 09_CLASE MESHFILTER (1)
- 10_CLASE JOINT (2)
- 11_CLASE HINGEJOINT (2)
- 12_CLASE SPRINGJOINT (1)
- 13_CLASE CHARACTERJOINT (1)
- 14_CLASE BEHAVIOUR (1)
- 15_CLASE MONOBEHAVIOUR (9)
- 16_CLASE CAMERA (6)
- 17_CLASE LIGHT (3)
- 18_CLASE MATERIAL (3)
- 19_CLASE CUBEMAP (1)
- 20_CLASE RENDERTEXTURE (3)
- 21_CLASE PARTICLEEMITTER (3)
- 22_CLASE MESH (2)
- 23_CLASE GAMEOBJECT (6)
- 24_CLASE SHADER (1)
- 25_CLASE PHYSICMATERIAL (1)
- 26_CLASE COMPONENT (1)
- 27_CLASE GUIELEMENT (1)
- 28_CLASE GUITEXT (2)
- 29_CLASE GUITEXTURE (1)
- 30_CLASE GUI (8)
- 31_CLASE GUILAYOUT (4)
- 32_CLASE TEXTURE (1)
- 33_CLASE TEXTURE2D (2)
- 34_CLASE INPUT (4)
- 35_ESTRUCTURA BOUNDS (1)
- 36_CLASE COLLISION (1)
- 37_CLASE CONTROLLERCOLLIDERHIT (1)
- 38_CLASE DEBUG (1)
- 39_CLASE EVENT (3)
- 40_CLASE GIZMOS (1)
- 41_CLASE LIGHTMAPSETTINGS (1)
- 42_ESTRUCTURA MATHF (3)
- 43_CLASE PHYSICS (2)
- 44_ESTRUCTURA QUATERNION (1)
- 45_CLASE RANDOM (1)
- 46_ESTRUCTURA RAY (1)
- 47_ESTRUCTURA RAYCASTHIT (1)
- 48_ESTRUCTURA RECT (1)
- 49_CLASE RENDERSETTINGS (1)
- 50_CLASE SCREEN (1)
- 51_CLASE TIME (1)
- 52. CLASE YIELDINSTRUCTION (1)
- MONOGRAFICOS (2)
ENTRADAS
-
▼
2011
(127)
-
▼
octubre
(121)
- 116. ESTRUCTURA RAYCASTHIT
- 115. ESTRUCTURA RAY
- 114. CLASE RANDOM
- 113. ESTRUCTURA QUATERNION
- 112. CLASE PHYSICS (y II)
- 111. CLASE PHYSICS (I)
- 110. ESTRUCTURA MATHF (y III)
- 109. ESTRUCTURA MATHF (II)
- 108. ESTRUCTURA MATHF (I)
- 107. CLASE LIGHTMAPSETTINGS
- 106. CLASE GIZMOS
- 105. CLASE EVENT (y III)
- 104. CLASE EVENT (II)
- 107. CLASE EVENT (I)
- 106. CLASE DEBUG
- 105. CLASE CONTROLLERCOLLIDERHIT
- 104. CLASE COLLISION
- 103. ESTRUCTURA BOUNDS
- 102. CLASE INPUT (y IV)
- 101. CLASE INPUT (III)
- 100. CLASE INPUT (II)
- 99. CLASE INPUT (I)
- 98. CLASE TEXTURE2D (y II)
- 97. CLASE TEXTURE2D (I)
- 96. CLASE TEXTURE
- 95. CLASE GUILAYOUT (y IV)
- 94. CLASE GUILAYOUT (III)
- 93. CLASE GUILAYOUT (II)
- 92. CLASE GUILAYOUT (I)
- 91. CLASE GUI (y VIII)
- 90. CLASE GUI ( VII)
- 89. CLASE GUI (VI)
- 88. CLASE GUI (V)
- 87. CLASE GUI (IV)
- 86. CLASE GUI (III)
- 85. CLASE GUI ( II)
- 84. CLASE GUI (I)
- 83. CLASE GUITEXTURE
- 82. CLASE GUITEXT (y II)
- 81. CLASE GUITEXT (I)
- 80. CLASE GUIELEMENT
- 79. CLASE COMPONENT
- 78. CLASE PHYSICMATERIAL
- 77. CLASE SHADER
- 76. CLASE GAMEOBJECT (y VI)
- 75. CLASE GAMEOBJECT (V)
- 74. CLASE GAMEOBJECT (IV)
- 73. CLASE GAMEOBJECT (III)
- 72. CLASE GAMEOBJECT (II)
- 71. CLASE GAMEOBJECT (I)
- 70. CLASE MESH (y II)
- 69. CLASE MESH (I)
- 68. CLASE PARTICLEEMITTER (y III)
- 67. CLASE PARTICLEEMITTER (II)
- 66. CLASE PARTICLEEMITTER (I)
- 65. CLASE RENDERTEXTURE (y III)
- 64. CLASE RENDERTEXTURE (II)
- 63. CLASE RENDERTEXTURE (I)
- 62. CLASE CUBEMAP
- 61. CLASE MATERIAL (y III)
- 60. CLASE MATERIAL (II)
- 59. CLASE MATERIAL (I)
- 58. CLASE LIGHT (y III)
- 57. CLASE LIGHT (II)
- 56. CLASE LIGHT (I)
- 55. CLASE CAMERA (VI)
- 54. CLASE CAMERA (V)
- 53. CLASE CAMERA (IV)
- 52. CLASE CAMERA (III)
- 51. CLASE CAMERA (II)
- 50. CLASE CAMERA (I)
- 49. CLASE MONOBEHAVIOUR (y IX)
- 48. CLASE MONOBEHAVIOUR (VIII)
- 47. CLASE MONOBEHAVIOUR (VII)
- 46. CLASE MONOBEHAVIOUR (VI)
- 45. CLASE MONOBEHAVIOUR (V)
- 44. CLASE MONOBEHAVIOUR (IV)
- 43. CLASE MONOBEHAVIOUR (III)
- 42. CLASE MONOBEHAVIOUR (II)
- 41. CLASE MONOBEHAVIOUR (I)
- 40. CLASE BEHAVIOUR
- 39. CLASE CHARACTERJOINT
- 38. CLASE SPRINGJOINT
- 37. CLASE HINGEJOINT (y II)
- 36. CLASE HINGEJOINT (I)
- 35. CLASE JOINT (y II)
- 34. CLASE JOINT (I)
- 33. CLASE MESHFILTER
- 32. CLASE RENDERER (y II)
- 31. CLASE RENDERER (I)
- 30. CLASE CHARACTERCONTROLLER (y III)
- 29. CLASE CHARACTERCONTROLLER (II)
- 28. CLASE CHARACTERCONTROLLER (I)
- 27. CLASE MESHCOLLIDER
- 26. CLASE COLLIDER (II)
- 25. CLASE COLLIDER (I)
- 24. CLASE RIGIDBODY (y VIII)
- 23. CLASE RIGIDBODY (VII)
- 22. CLASE RIGIDBODY (VI)
- 21. CLASE RIGIDBODY (V)
-
▼
octubre
(121)
Gracias por toda la información.
un saludo
al tratar de usar el priemr ejemplo me sale este error me podrias ayudar
NullReferenceException: Object reference not set to an instance of an object
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.String cacheKeyName, System.Type[] cacheKeyTypes, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.Object[] args, System.String cacheKeyName, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.SetProperty (System.Object target, System.String name, System.Object value)
Ray.Update () (at Assets/Ray.js:3)
ya pude solucionar el problema
el error estava en que habia llamado al script Ray al cambiar el nombre todo quedo funcionando me di cuenta dos segundos despues de haber publicado XD
function OnTriggerEnter(loPrimeroQuePille)
Esta funciona no va bien despues de buscar un rato llegue a la conclusion esta
function OnTriggerEnter(loPrimeroQuePille : Collider)
Asi si funciona.
Muy bueno el curso, muchas gracias.