28. CLASE CHARACTERCONTROLLER (I)
Un character Controller nos permite hacer fácilmente movimientos limitados por colisiones sin tener que lidiar con un rigidbody.
Comprobémoslo empíricamente, siguiendo estos pasos:
1.- Le borramos a la esfera el script que tiene vinculado.
2.- Le eliminamos a la esfera su componente rigidbody (botón derecho del ratón
situado sobre el nombre de dicho componente=> remove component)
3.- Con la esfera seleccionada, vamos al menú Component=>Physics=>Character
Controller. Nos saldrá un aviso preguntándonos si realmente queremos sustituir
el collider primitivo que por defecto trae la esfera por un Character
collider. Presionamos Replace.
4.- En Jerarquía seleccionamos suelo, y en el inspector desmarcamos el checkbox
situado junto a Mesh Collider.
5.- Play.
El cubo, afectado por las leyes físicas, atraviesa el suelo al que le hemos deshabillitado la malla. Sin embargo el cubo, que ahora está controlado por el character controller, no se ve afectado por las leyes físicas.
Antes de seguir, volvamos a habilitar la malla del suelo en su correspondiente checkbox.
Un character Controller no se ve afectado tampoco por fuerzas y se moverá sólo cuando llamemos a la función Move, específica de esta clase.
VARIABLES:
isGrounded:
var isGrounded : boolean
Booleano que devuelve true si nuestro character controller (controlador de personaje, podríamos traducirlo) estaba tocando el suelo durante el último movimiento.
velocity:
var velocity : Vector3
La velocidad relativa actual del character. La velocidad así retornada es la diferencia durante la última actualización entre la distancia antes y después de llamar a la función Move o SimpleMove, esto es, dónde estaba el último frame, o la última porción de frame o el último segundo el character antes de llamar a una de esas funciones y dónde estába despues, para que distancia partida por (tiempo, frame o fracción dada) sea igual a la velocidad por tiempo, frame o fracción dada.
Decimos que la velocidad es relativa porque no puede seguir movimientos del transform que suceden fuera del character controller (por ej un character emparentado bajo otro transform en movimiento, como por ejemplo un vehículo moviéndose)
collisionFlags:
var collisionFlags : CollisionFlags
Esta variable nos indicá qué parte de la cápsula (que es la forma que tiene un character controller) colisionó con el entorno durante la última llamada a CharacterController.Move.
Comprobamos que la variable es de tipo CollisionFlags, que tal como podemos sospechar es de tipo enumeración, permitiéndonos usar los siguientes valores:
None: No hay colisión.
Sides: Colisión en los lados.
Above: Colisión en la parte superior.
Bellow: Colisión en la parte inferior.
Así, un sistema para determinar si nuestro character controller ha topado con algo, y en qué parte de la cápsula, sería como sigue (no hace falta que tecleéis esto, es sólo a modo indicativo):
function Update () { var controller : CharacterController = GetComponent(CharacterController); controller.Move(Vector3(1,0,0)); if (controller.collisionFlags == CollisionFlags.None) print("No hay colisiones"); if (controller.collisionFlags & CollisionFlags.Sides) print("Colisión lateral, al menos"); if (controller.collisionFlags == CollisionFlags.Sides) print("Sólo colisión lateral, ninguna de otro tipo"); if (controller.collisionFlags & CollisionFlags.Above) print("Colisión superior, al menos"); if (controller.collisionFlags == CollisionFlags.Above) print("Sólo colisión superior, ninguna de otro tipo"); if (controller.collisionFlags & CollisionFlags.Below) print("Tocando tierra"); if (controller.collisionFlags == CollisionFlags.Below) print("Sólo tocando tierra, nada más"); }
Le añadimos el script a la esfera (si no lo tenía ya vinculado) y le damos al play.
La esfera se mueve hacia la derecha, hasta que impacta con el cubo (démonos cuenta que la esfera ya no tiene un ridigbody, pero gracias al character controller sigue colisionando con otros colliders. Debajo de la ventana game aparece impresa la última colisión, pero no es la única. Si le hacemos click al mensaje impreso nos saldrá una lista de todas las colisiones que ha sufrido nuestra esfera hasta topar con el cubo.
La función GetComponent que hemos tecleado al inicio del script aún no la hemos estudiado, pero su cometido es bastante obvio: buscar el componente del gameobject que hace la llamada y que sea del tipo que le pasamos como parámetro, retornándolo. En este caso, nos sirve para inicializar la variable controller, con la que trabajaremos para montar un primitivo sistema de identificación de colisiones.
la función Print es similar a Debug.Log, y la función Move la estudiaremos durante el próximo capítulo.
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)