UNITY 3D REFERENCE SCRIPTING By: Deodato Pechir. INDICE DINÁMICO – REFERENCIA DE SCRIPTING MENU: VARIABLES. SCRIPTING BASICOS (if, switch, while, for). TIPO DE FUNCIONES UNITY. INPUT CONTROLLERS. TRANSFORM MOVIMIENTO. TRANSFORM ROTACION/ESCALA. FUNCIONES BASICAS. • MIRAR HACIA UN PUNTO. • GIRAR CON SUAVIDAD HACIA UN PUNTO. • BUSCAR GAMEOBJECTS/GETCOMPONENTS. • COMPONENTES ACTIVACION / DESACTIVAR. • TIME. • PAUSA GAME. • GAMEOBJECT DESACTIVAR. • RANDOM. • INSTANCIAR PREFABS. • DESTRUIR OBJETOS. • LOCAL TO WORLD SPACE / INVERSE. • VECTOR3 DISTANCIA/ANGULO. • DEBUG. • PHYSICS. • SCREEN. • APLICATIONS. • AUDIO. • GIZMOS. • COMPARTIR VARIABLES/FUNCIONES ENTRE SCRIPTS SOBRE EL MISMO GAMEOBJECT. • ENUM - VARIABLE LISTA. • MATERIALES. RAYCASTING. TRIGGERS. COLLISION. DYNAMICS. RAGDOLL. SCREENPONTRAY (CLICK & MOVE & ROTATE). SAVE & LOAD SCENE VALUES. ANIMATION. GUI: TEXTURE / TEXT. YIELD / CORRUTINAS. INVOKE / CORRUTINAS. Nota: Si quieres regresar al Índice haz click sobre el Cubo en la parte superior derecha de cada página 3 www.3dboxweb.com VARIABLES: var DeoValor1 : String; //Textos var DeoValor2 : float; // Valores enteros var DeoValor3 : int; //Valores decimales var DeoValor4 : boolean; //Valores boleanos 0, 1,true, false. var DeoValor5 : GameObject; //Objetos dentro de la escena. var DeoValor6 : Transform; //Valores de transform de un GameObject (mover, rotar, escalar). var DeoValor7 : Rigidbody; //Valor de un GameObject de tipo rigidbody. var DeoValor8 : Collision; //Valor de un GameObject cuando Colisiona. var DeoValor9 : AudioClip; //Valor de un GameObject de tipo sonido. var DeoValor10 : ParticleEmitter; //Valor de un GameObject de tipo partículas. var DeoValor11 : Texture2D; //Valor de una Textura. var DeoValor12 : Camera; //Valor de un GameObject de tipo Cámara. var DeoValor13 : Light; //Valor de un GameObject de tipo Luces. var DeoValor14 : CharacterController; //Valor de un GameObject de tipo Control de personaje (1ra y 3ra Persona). var DeoValor15 : Color; //Valor de cambio/asignación de color en una variable. var DeoValor16 : Material; //Valor de un GameObject de tipo Material. var DeoValor17 : AnimationClip; //Valor de un GameObject de tipo Animación (Clips). var DeoValor18 : Renderer; // Valor de un GameObject de tipo Render materiales/color/visible, etc. var DeoValor[] : Cualquier Tipo; // Valor para crear / Eliminar slots para almacenar variables del tipo de variable asignada. Variables Privadas: No permite publicarse dentro del Inspector. private var DeoValor : String = "Hola todos"; Variables Públicas: Permite comunicarse entre los Scripts del mismo GameObject u otros GameObjects (Consume mas memoria): static var DeoValor : String = "Hola todos"; 4 www.3dboxweb.com SCRIPTS BÁSICOS: CONDICIONANTES: if (Valor1 comparador Valor2){ //acción }else { //otra acción } if (Valor1 comparador Valor2){ //acción A }else if { //Acción B } else { //Otra Acción } Comparadores: '>' A es mayor que B '<' A es Menor que B '==' A es igual a B '!=' A No es igual a B '>=' A Es mayor o igual a B '<=' A Es menor o igual a B && Para 2 o más comparaciones. || Para una u otra comparación. SWITCH: var CambioArma = "A"; switch (CambioArma){ case "A": Debug.Log ("Cambio a Metralleta"); break; // termina la acción en este punto case "B": Debug.Log ("Cambio a Lanza Misiles"); break; // termina la acción en este punto default: // si no hay ningún caso, se ejecuta el de default (nada). break; // termina la acción en este punto } 5 www.3dboxweb.com WHILE: function Start () { var Valor : int = 0; // variable para usar en el loop. // Si es igual a 10 o mayor se cumpla el loop. while (Valor <= 10) { // Se hace aquí la acción que queremos repetir. Debug.Log("Cantidad: " + Valor); // Agregamos el valor de 1, cada q se hace un loop. Valor ++; } } FOR: for (var Valor : int = 0; Valor <= 10; Valor ++) { // Se hace aquí la acción que queremos repetir. Debug.Log ("Cantidad" + Valor); } FOR IN & ARRAY: // Creamos un arreglo para almacenar varios valores. var nombres = new Array(); // Creamos un arreglo para almacenar varios valores. var nombres = new Array("Juan", " Pedro ", " Jesús ", " Martin "); //arreglo y sus valores nombres[0] = "Juan"; nombres[1] = "Pedro"; nombres[2] = "Jesús"; nombres[3] = "Martin"; // obtener los valores del arreglo meterlos en una variable function Start () { for (var Imprimir in nombres){ Debug.Log (Imprimir); } // obtener los valores del arreglo meterlos en una variable function Start () { for (var Imprimir in nombres){ Debug.Log (Imprimir); } 6 www.3dboxweb.com TIPO DE FUNCIONES UNITY: EVENTOS ESCENAS: function function function function function function Update () {} LateUpdate () {} FixedUpdate () {} Awake() {} Start () {} Reset () {} – – – – – – Es llamado cada frame. Es llamado cada frame. Si el “Behaviour” esta “activado”. Es llamado cada Fixed frame (Físicas). Es llamado cuando una instancia de script se está cargado (antes). Es llamado al inicio de la escena cuando esta se haya cargado (después). Reinicia los valores por default. – – – – – – Es Es Es Es Es Es EVENTOS PARA MOUSE: function function function function function function OnMouseEnter () {} OnMouseOver () {} OnMouseExit () { } OnMouseDown () {} OnMouseUp () } OnMouseDrag () {} llamado llamado llamado llamado llamado llamado cuando el mouse Entra en el GUIElement o un Collider. cada frame cuando el mouse esta Encima del GUIElement o Collider. cuando el mouse ya no está más sobre GUIElement o Collider. cuando el mouse Presiono botón sobre un GUIElement o Collider. cuando el mouse Soltó el botón sobre un GUIElement o Collider. cuando el mouse Presiono botón sobre un GUIElement o Collider y aun continua presio. EVENTOS TRIGGERS: function OnTriggerEnter () {} function OnTriggerExit() {} – Es llamado cuando el Collider u otros entran en el Trigger. –Es llamado cuando el Collider u otros han parado de tocar en el Trigger. function OnTriggerStay () } – Es llamado 1 vez por Frame por cada Collider u otros que están tocando al Trigger. EVENTOS COLISIONADORES_ function OnCollisionEnter () {} function OnCollisionExit() {} function OnCollisionStay() {} – Es llamado cuando este Collider/rigidbody a comenzado a tocar otro rigidbody/Collider. – Es llamado cuando este Collider/rigidbody ha dejado de tocar a otro Collider/rigidbody. – Es llamado 1 vez por frame cada que este Collider/rigidbody está tocando otro Collider/rigidbody. EVENTOS VISIBLES: function OnBecameVisible () {} – Es llamado cuando el Render se ha cambiado a Visible por cualquier cámara. function OnBecameInvisible() {} – Es llamado cuando el Render se ha cambiado a Invisible por cualquier cámara. 7 www.3dboxweb.com TRASNFORM MOVIMIENTO: Vector.zero (0,0,0) | Vector.one (1,1,1) | Vector.up (0,1,0) | Vector.forward (0,0,1) | Vector.right (1,0,0,) TRANSFORM POSITION: // Vector3. transform.position = Vector3 (0, 0, 0); // Vector1. transform.position.X = 10; | -- transform.position = Vector3.zero; transform.position.Y = 10; | transform.position.Z = 10; // Una manera de usar el Vector3 = forward (eje azul), up (eje verde), right (eje rojo). function Update() { transform.position += transform.forward/up/right * 0.2 *Time.deltaTime; } TRANSFORM TRANSLATE: function Update() { // Mueve al objeto hacia arriba en el "world space" 1 unidad/segundo. transform.Translate (Vector3.up * 0.2 * Time.deltaTime, Space.Self); } TRANSFORM LINEAR INTERPOLATE: var Smooth : float = 1; function Update() { //OPCION 1: no permite que exceda la velocidad, así llega al target asignado. transform.position = Vector3.Lerp (transform.position, Vector3 (0, 0, 0), Time.deltaTime * Smooth); //OPCION 2: Puede exceder la velocidad y salir del target asignado. transform.position = Vector3.MoveTowards (transform.position, Vector3 (0, 0, 0), Time.deltaTime * Smooth); } ANIMACIÓN LINEAL PINGPONG. var Velocidad : float ; var Distancia : float; var Altura : float; function Update () { transform.position.y = Mathf.PingPong(Time.time * Velocidad, Distancia) + Altura; } 8 www.3dboxweb.com TRANSFORM ROTACIÓN / ESCALA: TRANSFORM ROTATE (eulerAngles:Vector3, Space:Space.World/Self): function Update() { // Pone al objeto a rotar en el eje de las X 20 grados/segundo. transform.Rotate (Vector3(20 * Time.deltaTime, 0, 0), Space.Self); } TRANSFORM ROTATE AROUND (point:Vector3, Axis:Vector3, angle:float): function Update() { // Pone al objeto en un solo eje a girar en su origen a 20 grados/segundo [Vector3.zero = Vector3 (0, 0, 0)]. transform.RotateAround (Vector3(1,0,0), Vector3.up, 20 * Time.deltaTime); } TRANSFORM ROTATE INTERPOLATE (from:Quaternion, to:Quaternion, t:float): var to : Transform; var GirarVelocidad = 1.5; function Update() { transform.rotation =Quaternion.Slerp (from.rotation, to.rotation, Time.deltaTime * GirarVelocidad); } TRANSFORM SCALE (localScale:Vector3): function Update () { //escalara al objeto -0.5 unidades/segundo. transform.localScale -= Vector3 (0.5 * Time.deltaTime, 0, 0); } / transform.localScale.x += 0.02; 9 www.3dboxweb.com INPUT/GET CONTROLLERS: INPUT - GET AXIS: function Update () { // Mueve al objeto en horizontal/vertical del axis del inputs, agrega el valor del axis. transform.Translate (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical")); Debug.Log (Input.GetAxis ("Horizontal")); Debug.Log (Input.GetAxis ("Vertical")); } INPUT - GETBUTTON: function Update () { if (Input.GetButtonDown ("NOMBRE_INPUT")){ //acción } } INPUT - MOUSEWHEEL: var mouseWheel : float = Input.GetAxis ("Mouse Wheel"); GETMOUSE BUTTON: function Update () { if ( Input.GetMouseButtonDown (0) ){ //acción } } GETKEY - STRINGS: function Update () { if ( Input.GetKeyDown ("space") ){ } } GETKEY - KEYCODE: function Update () { if ( Input.GetKeyDown (KeyCode.Space) ){ //acción } } //Input: Sensibility: 1, Type: Mouse Movements, Axis: 3rd Axis Scroll. // 0 = Izquierdo, 1 = Derecho, 2 =Scroll 10 www.3dboxweb.com FUNCIONES BÁSICAS: MIRAR HACIA UN PUNTO. transform.LookAt (VariableTransform); GIRAR CON SUAVIDAD HACIA UN PUNTO. var target : Transform; var Angulo = Quaternion.LookRotation (target.position - transform.position, Vector3.up); transform.rotation = Quaternion.Slerp (transform.rotation, Angulo, Time.deltaTime * 0.5); //Rotación en un solo eje siguiendo a un objeto en los 3 ejes. transform.rotation.y = Quaternion.LookRotation(target.position - transform.position)[1]; transform.LookAt ( Vector3 (target.position.x, 0, target.position.z) * .1* Time.deltaTime ); BUSCAR GAMEOBJECTS / GETCOMPONENTS. vGameObject = GameObject.FindWithTag ("Nom breTag"); // Buscar objetos dinámicamente en la escena por tag. vGameObject = GameObject.Find ("NombreGameObject"); // Buscar objetos dinámicamente en la escena por nombre. vGameObject.GetComponent("NombreScript").variableOfuncion(); // Conectarse al script de otro gameObject de la escena. COMPONENTES ACTIVACION / DESCTIVAR. light.enabled = true / false; // Luces Camera.enabled = true / false; // Cámaras renderer.enabled = false; // Render collider.isTrigger = true; // Colisionar TIME. Time.time // Se mete en una variable y se captura el tiempo cuando se ejecuta. Time.deltaTime // Regula la velocidad del "transform" en frames/segundos Time.smoothDeltaTime // Regula la velocidad del "transform" en frames/segundos suavemente. Time.realtimeSinceStartup // El tiempo real en segundos desde que el juego inicio. 11 www.3dboxweb.com PAUSE GAME. Time.timeScale = 0 / 1; AudioListener.pause = true / false; // Pausa toda la acción del juego 0: Pausa, 1: Reanudar. // Pausa el audio que escucha el listener de la cámara. GAMEOBJECT DESCTIVAR. gameObject.SetActiveRecursively (false/true); // Desactiva por completo al GameObjeto y sus Child así como scripts. RANDOM. Random.Range (); Random.Rotation (); // Creación de Random entre un Mínimo y Máximo. // Creación de Random en rotación. INSTANCIAR PREFABS. var Jugador : GameObject; Instantiate (VariableGameObject, Posicion, Rotacion); -- Instantiate (VariableGameObject, transform.position, transform.rotation); DESTUIR OBJETOS. Destroy (gameObject); Destroy (this); Destroy (rigidbody); / Destroy (gameObject, 1); //Destruir GameObject / por tiempo // Destruir el script de la instancia. // Destruye el Rigidbody del GameObject. LOCAL TO WORLD SPACE / INVERSE Transform.TransformDirection (Vector3.forward/right/up); Transform.TransformInverseDirection (Vector3.forward/right/up); //Cambia de Local a world space X,Y,Z. //Cambia de World a Local space X,Y,Z. VECTOR3 DISTANCIA/ANGULO. var Jugador : Transform; var Distancia = Vector3.Distance (Jugador.position, transform.position); var Angulo = Vector3.Angle (Jugador.position, transform.forward); // Jugador posición, Objeto posición (a, b) | (a-b) // Angulo de rotación de un objeto. DEBUG. Debug.Log (Mensaje/Variable); Debug.LogError (Mensaje/Variable); Debug.LogWarning (Mensaje/Variable); Debug.break; Debug.DrawLine (Start:Vector3, End:Vector3, color:Color); Debug.DrawRay (Start:Vector3, Dir:Vector3, color:Color); // // // // // Imprime mensajes en la consola de Unity. Una variante del "Log" que imprime mensajes de error en la consola. variante del "Log", imprime mensajes de advertencia en la consola. Crea una pausa en el Editor, para poder checar scripting. Dibuja una línea inicio-final-color . // Dibuja una línea inicio-Dir-color. 12 www.3dboxweb.com PHYSICS. var Distancia : float; var RayHit: RaycastHit; var Destino: Transform; var Radio : int; OverlapSphere (transform.position, Radio) : Collider[] // Regresa un arreglo de colliders que tocan una esfera Physics.Raycast (transform.position, transform.forward, RayHit, Distancia); // Línea con Distancia (Inicio, Dirección, info del Hit, Distancia). Physics.Lineast (transform.position, Destino.position, RayHit); // Línea detecta colisiones (Inicio, Final, info del Hit). Physics.IgnoreCollision (Instacia.collider, transform.root.collider, true); // Ignorar la colisión de la instancia con el personaje. SCREEN. Screen.showCursor = true / false; Screen.lockCursor = true / false; Screen.width; Screen.height; Screen.fullScreen = true / false; Screen.SetResolution = (800, 600, true); //Mostrar u Ocultar Mouse. //Bloquear, Ocultar y Centrar el Mouse. // Muestra la resolución en ancho en px. // Muestra la resolución en alto en px. // Cambia a pantalla completa. // Asigna la resolución asignada. APPLICATIONS. Application.Quit; Application.CancelQuit; Application.LoadLeve ("NombreNivel"); Application.CaptureScreenshot ("Screenshot.png"); Application.OpenURL ("http://www.url.com"); // // // // // Sale de la aplicación (Tecla Escape). Cancela el salir de la aplicación (Escape). Carga 1 escena, debe de estar cargada en Build. Captura una imagen en la ruta de la aplicación. Cargar una liga para una dirección web. // // // // // // // // Reproducir audio. Detener audio. Pausa del audio. Nivel del audio. Silenciar el audio. Loop del audio. Reproducir AudioClip. Esperar a que termine el audio. AUDIO. audio.Play (); audio.Stop (); audio.Pause (); audio.volume = 0.5; audio.mute = true/false; audio.loop = true/false; audio.PlayOneShot (Sonido); yield WaitForSeconds (audio.clip.length); 13 www.3dboxweb.com GIZMOS ICON function OnDrawGizmos (){ Gizmos.DrawIcon (transform.position, "WayPoint.psd"); } // Debde estar dentro de una Carpeta “Gizmos”. COMUNICACIÓN ENTRE SCRIPTS POR MEDIO DE VARIABLES DE TIPO SCRIPT. AI_Script1 var OtroScript : AI_Script2; OtroScript.NombreFuncion(); OtroScript.Variable = 2; AI_Script2 var Variable = 1; function NombreFuncion () {} // Variable para guardar la conexión con el otro Script (se tiene que llamar como el script a llamar). //Ejecutamos la función que hay en el “Script 2”, o se puede poner algún valor en variables. // Mandarle un nuevo valor a la variable del “Script 2”. // Se deja en “Static” para poder acceder a la variable desde otro script. // Se deja en “Static” para poder acceder a la función desde otro script. COMUNICACIÓN ENTRE SCRIPTS POR MEDIO DEL GETCOMPONENT. Script_1 var A : int = 5; //Local en el mismo GameObject entrar a cualquier componente. Script_2 = this.GetComponent ("Script_2"); //Target entrar al componente de otro GameObject en la escena. Script_2 = GameObject.Find ("Sphere2").GetComponent ("Script_2"); print (A+Script_2.B); Script2.Ejecutar(); Script_2 var B : int = 5; function Ejecutar(){ //hacer algo } ENUM VARIABLES – LISTA: INSPECTOR. enum vAcciOpciones { Atacar, Saltar, Correr, Esconder } // CREAR VARIABLE CON OPCIONES DE SELECCINO DE LISTA var Acciones : vAcciOpciones; // Mostrar variable con opciones en el Inspector if if if if // // // // (Acciones (Acciones (Acciones (Acciones == == == == vAcciOpciones.Atacar) {} vAcciOpciones.Saltar) {} vAcciOpciones.Correr) {} vAcciOpciones.Esconder) {} si si si si se se se se selecciono selecciono selecciono selecciono Atacar crear una acción. Saltar crear una acción. Correr crear una acción. Esconder crear una acción. 14 www.3dboxweb.com MATERIALES. renderer.material.color = color.red; (green, blue, White. Black, yellow, cyan, magenta). // Cambio de Color en materiales. renderer.material = VariableMaterial; renderer.material.mainTexture = VariableTextura; // Aplicar un material. // Aplicar una Textura al color principal del material. renderer.material.SetColor ("_SpecColor", Color.red); renderer.material.SetTexture ("_MainText", VariableTextura); // Tipos de color: _Color, _SpecColor, _Emission, _ReflectColor. // Tipos de materiales: _MainText, _BumpMap, _Cube BLENDING DE 2 MATERIALES (misma textura, solo diferentes atributos). // Controla el Blending entre materiales que tengan las mismas texturas (solo cambien características). var Material1 : Material; var Material2 : Material; var duration : int = 2.0; function Update (){ // pingpong va de 0 a 1 y regresa, para controlar la velocidad se divide para regresar valor 1. var Blend : float = Mathf.PingPong (Time.time, duration) / duration; renderer.material.Lerp (Material1, Material2, Blend); } ANIMACION PARA MOVER TEXTURAS. var Velocidad : float = 0.5; function Update () { var offset : float = Time.time * Velocidad; // Cambiar el Offset del Diffuse en "X" progresivamente sin pasar del 1(%1). renderer.material.SetTextureOffset ("_MainTex", Vector2(offset%1,0)); // Cambiar el Offset del Bump en "X" progresivamente sin pasar del 1 renderer.material.SetTextureOffset ("_BumpMap", Vector2(-offset%1,0)); } 15 www.3dboxweb.com RAYCASTING. DETECTAR COLLISION // Si detecta que se acerca a 1.5 unidad en dirección hacia arriba var Distancia : float =1.5; if (Physics.Raycast (transform.position, Vector3.forward, Distancia) ){} //Lanza un Rayo (Posición, Dirección, Distancia). Debug.DrawRay (transform.position, Vector3.forward*Distancia, Color.red); // Dibujar en Debug Líneas (Inicio, Dirección, Color). LANZAR RAYO CON DISTASNCIA A DONDE APUNTE EL MOUSE (CAMARA). var Distancia : int =10; // Distancia del Rayo var rayo : RaycastHit; // Variable de Rayo var rayo = Camera.main.ScreenPointToRay (Input.mousePosition); // rayo de la posición del mouse (Camara). // Lanza un rayo y si golpea con algo regresara true Physics.Raycast (Camera.main.transform.position, rayo.direction, hit, Distancia); // (Inicio, Dirección, info del Hit, Distancia). Debug.DrawRay (Camera.main.transform.position, rayo.direction* Distancia, Color.red); // Dibujar en el editor el rayo con la misma info. rayo.point: origen del rayo donde golpeo. rayo.normal: en la cara de la normal en la que pego el rayo. rayo.distance: distancia del rayo del punto de origen al destino. rayo.collider: Obtener con que collider golpeo. rayo.rigidbody: Obtener el Rigidbody del collider que golpeo. rayo.transform: Obtener el transform del Rigidbody/collider con el que golpeo. 16 www.3dboxweb.com TRIGGERS: ACTIVAR: CON TRIGGERS ESPECÍFICOS (NOMBRE). var V_Trigger : boolean; function OnTriggerEnter (El_trigger : Collider){ if (El_trigger.gameObject.name == "Puerta"){ Debug.Log ("A entrado al área de ataque"); var V_Trigger : boolean = true; } } DESACTIVAR: CON TRIGGERS ESPECÍFICOS (NOMBRE). var V_Trigger : boolean; function OnTriggerExit (El_trigger : Collider){ if (El_trigger.gameObject.name == "Puerta"){ Debug.Log ("A salido del área de ataque"); var V_Trigger : boolean = false; } } ACTIVADO: CON TRIGGERS ESPECÍFICOS (NOMBRE). var V_Trigger : boolean; function OnTriggerStay (El_trigger : Collider){ if (El_trigger.gameObject.name == "Puerta"){ Debug.Log ("Sigue sobre el área de ataque"); } } 17 www.3dboxweb.com COLLISIONS: COLISION CON COLLIDERS EN ESPECÍFICO function OnCollisionEnter (Colisionando : Collision){ if (Colisionando.gameObject.name == "NombreMesh"){ Debug.Log ("Colisión con el mesh: NombreMesh"); } } COLISION SOBRE CUALQUIER COLLIDER Y SABER POSICION Y CARA NORMAL. var ParticleExplotion : GameObject; function OnCollisionEnter (Colisionando : Collision){ //variable "contactPoint" para saber x, y, z de del objeto al colisionar. var Impacto : ContactPoint = Colisionando.contacts[0]; Debug.Log ("Posicion: " + Impacto.point); Debug.Log ("Normal: " + Impacto.normal); Debug.Log ("Nombre: " + Impacto.otherCollider.name); Debug.Log ("Prefab: " + Impacto.thisCollider.name); //Sobre la cara que impacto el misil obtener la cara de la normal de frente (up) . var rotacion = Quaternion.FromToRotation ( Vector3.up, Impacto.normal ); //crear la instancia dinámica de la explosión con la posición y la cara de enfrente donde colisiono y aplicar partículas de explosión. var InstantiateExplosion : GameObject = Instantiate( ParticleExplotion, impacto.point, rotacion); } 18 www.3dboxweb.com DYNAMICS. MOVER RIGIDBODIES. gameObject.name.AddComponent (Rigidbody); rigidbody.AddForce (Vector3 (0, 10, 0)); rigidbody.velocity = transform.TransformDirection (0, 0, speed); //Agregar componente de Rigidbody. //Agregar una fuerza a un Rigidbody. //Mover objeto con Rigidbody. LANZAR INSTANCIA RIGIDBODY SIN COLISIONAR CON EL PLAYER. var Bala : Rigidbody; var speed = 30; //crear instancias a partir de la variable dinámica para cargar objetos de tipo Rigidbody (misil). var Bala_Instanseada : Rigidbody = Instantiate(Bala, transform.position, transform.rotation); //Que el misil cuando se cree dinámicamente (instanseado) no colisione con el personaje (root). Physics.IgnoreCollision (Bala_Instanseada.collider, transform.root.collider, true); //LocalSpace a WorlSpace, Como el objeto es Rigidbody, este tiene propiedades de velocidad, y le agregamos una fuerza inicial por la variable dinámica Bala_Instanseada.velocity = transform.TransformDirection (0, 0, speed); CREAR EXPLOSION RIGIDBIDY. var explosionRadius = 5; var explosionPower = 2000.0; //Cuando el misil se impacta busca en un radio quienes tienen "colliders" y los almacena en un arreglo. var colliders : Collider[] = Physics.OverlapSphere( transform.position, explosionRadius ); //Descargamos todos los colliders almacenados en el arreglo en una variable "hit". for (var hit in colliders){ // Para que NO intente mover cualquier objeto con "collider" si el collider tiene Rigidbody le agregamos una fuerza para poderlo impulsarlo. if (hit.rigidbody){ //agregar impulso al objeto "rigidbody" que este en el mismo radio cuando impacto el misil. hit.rigidbody.AddExplosionForce (explosionPower, transform.position, explosionRadius); } } 19 www.3dboxweb.com RAGDOLL. //Variable para cargar el RagDoll var Ragdoll_Body : Transform; function Start (){ //Reproducción de animación animation.wrapMode = WrapMode.Loop; animation.Play ("run"); // Esperar yield WaitForSeconds (1.5); //Destruir Mesh animado Destroy(gameObject); // Instancia para cambiar por ragdoll var Morir : Transform = Instantiate(Ragdoll_Body, transform.position, transform.rotation); Switch_Ragdoll (transform, Morir); } function Switch_Ragdoll (Fuente : Transform, Destino : Transform) { Destino.position = Fuente.position; Destino.rotation = Fuente.rotation; // Igualar los valores de "transform" que tienen el mismo nombre. for (var child : Transform in Destino) { var JointTransforms = Fuente.Find(child.name); Switch_Ragdoll (JointTransforms, child); } } 20 www.3dboxweb.com SCREEN POINT RAY (CLICK & MOVE/ROTATE). // Genera un Rayo desde la posición del puntero del mouse. var rayo : Ray = Camera.main.ScreenPointToRay (Input.mousePosition); // Variable para saber cuándo se crea un rayo y pega con algo. var hit : RaycastHit; //MOVER //hasta que se le de click en una posición nos dé la posición. if (Physics.Raycast (rayo, hit)){ //Obtener del RayCast el punto donde se lanzo el rayo (x, y, z) ' Vector3. PosicionDestino = hit.point; //ROTAR if (PlanoEscena.Raycast (rayo, hitDist)) { //Obtener la Posición donde se dio click del Plano. var ClickPosicion = rayo.GetPoint(hitDist); //De acuerdo a la posición calcular el ángulo de rotación. var RotacionPlayer= Quaternion.LookRotation(ClickPosicion - transform.position); // Rotar el objeto con los ángulos de Rot. Obtenidos. transform.rotation = RotacionPlayer; } //Mover constantemente al personaje a la nueva PosicionDestino. transform.position = Vector3.Lerp (transform.position, PosicionDestino, Time.deltaTime * Mover); } 21 www.3dboxweb.com SAVE & LOAD SCENE VALUES: AI_CheckPoint var vCheckPoint : String; var Script_Salvar : AI_Save_Load; function OnTriggerEnter () { Script_Salvar.Salvar_CP = vCheckPoint; print ("Checkpoint >" +vCheckPoint+ "< Activado"); } AI_Save_Load var Salvar_CP : String = "A"; var Character : GameObject; function Update () { //SAVE - Click Izquierdo if (Input.GetButtonDown ("Salvar")) { PlayerPrefs.SetString("info", Salvar_CP); print ("Salvado: "+Salvar_CP); } //LOAD - Click Derecho if (Input.GetButtonDown ("Cargar")) { Application.LoadLevel ("Escena"); } } // CREAR PERSONAJE DINAMICAMENTE function Start (){ //La información se guarda en: HKEY_CURRENT_USER/Software/<compañía>/<proyecto> var Save_Load : String = PlayerPrefs.GetString("info"); print ("Check Point Cargado: " + Save_Load); if (Save_Load == "A"){ Instantiate (Character, } else if (Save_Load == "B"){ Instantiate (Character, } else if (Save_Load == "C"){ Instantiate (Character, } else if (Save_Load == "D"){ Instantiate (Character, } } Vector3 (0,0,0), transform.rotation); Vector3 (0,0,11), transform.rotation); Vector3 (0,0,24), transform.rotation); Vector3 (0,0,38), transform.rotation); 22 www.3dboxweb.com ANIMATION: ANIMATION STATES. //Reproducir la animación general o por animación. animation.Play(); / animation.Play("Subir"); //Detener la animación general y rebobinar o por animación. animation.Stop(); / animation.Stop("Subir"); //Detener la animación en general o por animación. animation.Rewind(); / animation.Rewind("Subir"); //Activar/Desactivar (Pause) la animación en general o por animación. animation.enabled = true/false; / animation["walk"].enabled = true/false; //Controla la animación Walk su velocidad = reproducción atrás (-1)/Adelante (1). animation["walk"].speed = -1 ó 1; //Fade al cambiar a animación Walk animation.CrossFade ("Walk"); Fade del Split Walk con los otros splits en 2 seg. / animation.CrossFade ("Walk", 0.2); //Esperar hasta que la animación termine de reproducir. yield WaitForSeconds (animation.clip.lenght); //Modo de reproducción de las animaciones animation.wrapMode = WrapMode. Loop; (WrapMode.default, .One, .Loop, .PingPong, .ClampForever). animation ["NomAnim"].wrapMode = WrapMode.Loop; // Modeo de reproducción de una animación. GET CHARACTER CONTROLLER. // Obtener los componentes de "CharacterController" y saber cuando el personaje toca el piso. var controller : CharacterController = GetComponent(CharacterController); if (controller.isGrounded){ //Acción} GET CHARACTER MOTOR. // Obtener los componentes de "CharacterMotor" y modificar velocidad de movimientos del player. var Motor : CharacterMotor = GetComponent(CharacterMotor); Motor.movement.maxForwardSpeed = 1.0; Motor.movement.maxSidewaysSpeed = 1.0; Motor.movement.maxBackwardsSpeed = 1.0; 23 www.3dboxweb.com GUI: TEXTURE / TEXT: GUI BUTTON TEXTURES. //variable de sonido var Sonido : AudioClip; //variables de nivel y texturas (cambiar). var NivelCargar : String; var Textura_A : Texture2D; var Textura_B : Texture2D; //Al poner el mouse encima cambiar a textura B function OnMouseEnter () { guiTexture.texture = Textura_B; } //Al salir el mouse cambiar a textura A function OnMouseExit (){ guiTexture.texture = Textura_A; } POSICION DE GUITEXTURE DE ACUERDO A RESOLUCIÓN var position : Rect; var vTexture : Texture2D; function Start(){ position = Rect( ( Screen.width - vTexture.width ) / 2, ( Screen.heigh - vTexture.height ) / 2, vTexture.width, vTexture.height ); } function OnGUI(){ GUI.DrawTexture( position, crosshairTexture ); } GUI TEXT. // Texto guiText.text = "Texto"; // Texto + Variable guiText.text = "Texto" + Variable; //Al hacer click y soltar el botón del ratón cargar el nivel function OnMouseUp (){ Application.LoadLevel (NivelCargar); } // Variable convertida a string guiText.text = Variable.ToString(); GUI BAR TEXTURE // Cambio dinámico del tamaño del texto guiText.fontSize = 12; // Cambio del Pixel Inset en Textures guiTexture.pixelInset = Rect (ValorXInset, ValorYInset, WithInset, HeightInset); // Cambio de color en el material del texto guiText.material.color = Color.green; // Cambio dinámico del estilo del texto guiTextfontStyle = FontStyle.Bold; 24 www.3dboxweb.com . YIELD / CORRUTINAS: 1. Ejemplo ----- Sin corrutina (probar esto en Update No funciona sin corrutina). // Se suspende por 2 segundos yield WaitForSeconds (2); //Imprimir el valor del tiempo 5 seg. Debug.Log (Time.time); 2. Ejemplo ----- Ejecuta a “Tiempo” pero continúa después de llamar “Tiempo” inmediatamente. Tiempo (); print ("Imprimir ahora"); function Tiempo () { Debug.Log ("Imptimir al instante"); yield WaitForSeconds (2); Debug.Log ("Imprimir 2 seg despues"); } 3. Ejemplo ----- Ejecutara “Tiempo” y esperar hasta que termine antes su propia ejecución. // Iniciar la Corrutina y accionar Función Tiempo. yield StartCoroutine ("Tiempo"); Debug.Log ("Imprimir después de 2 Seg de Función Tiempo"); function Tiempo () { Debug.Log ("Tiempo --> Al instante"); yield WaitForSeconds (2); Debug.Log ("Tiempo --> A los 2 Seg"); } 25 www.3dboxweb.com INVOKE - CORRUTINAS: 1. Ejemplo ----- Ejecutar. //invocar: (función, tiempo ejecución). Invoke ("FuncionDeo", 2); function FuncionDeo () { Debug.Log ("Se activa al tiempo: " + Time.time + " Seg"); } 2. Ejemplo ----- Repetición //invocar repetidamente: (función, tiempo ejecución, cada X segundos). InvokeRepeating ("ElTiempo", 0, 1); function ElTiempo () { Debug.Log ("Se activa al tiempo: " + Time.time + " Seg"); } 3. Ejemplo ----- Repetición / Cancelar. var Esfera : Rigidbody; InvokeRepeating("LanzarEsfera", 0, 0.5); //Activar Invoke function LanzarEsfera () { Instantiate(Esfera).velocity = Vector3 (0, 0, Random.Range(1, 20)); } // Cancelar la repetición cuando del invoke al presionar click. function Update () { if (Input.GetKeyDown (KeyCode.Mouse0)){ CancelInvoke (); //Cancelar Invoke. } }