Guía de Scripting en Unity 3D
Guía de Scripting en Unity 3D
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 DeoValor[] : Cualquier Tipo; // Valor para crear / Eliminar slots para almacenar variables del tipo de variable asignada.
SCRIPTS BÁSICOS:
CONDICIONANTES:
WHILE:
function Start () {
var Valor : int = 0; // variable para usar en el loop.
FOR:
// obtener los valores del arreglo meterlos en una variable // obtener los valores del arreglo meterlos en una variable
function Start () { function Start () {
for (var Imprimir in nombres){ for (var Imprimir in nombres){
Debug.Log (Imprimir); Debug.Log (Imprimir);
} }
6
www.3dboxweb.com
EVENTOS ESCENAS:
EVENTOS TRIGGERS:
function OnTriggerStay () } – Es llamado 1 vez por Frame por cada Collider u otros que están tocando al Trigger.
EVENTOS COLISIONADORES_
function OnCollisionEnter () {} – Es llamado cuando este Collider/rigidbody a comenzado a tocar otro rigidbody/Collider.
function OnCollisionExit() {} – Es llamado cuando este Collider/rigidbody ha dejado de tocar a otro Collider/rigidbody.
function OnCollisionStay() {} – 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); -- transform.position = Vector3.zero;
// Vector1.
transform.position.X = 10; | 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);
}
function Update () {
transform.position.y = Mathf.PingPong(Time.time * Velocidad, Distancia) + Altura;
}
8
www.3dboxweb.com
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);
}
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);
}
var to : Transform;
var GirarVelocidad = 1.5;
function Update() {
transform.rotation =Quaternion.Slerp (from.rotation, to.rotation, Time.deltaTime * GirarVelocidad);
}
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 - GETBUTTON:
function Update () {
if (Input.GetButtonDown ("NOMBRE_INPUT")){
//acción
}
}
INPUT - MOUSEWHEEL:
var mouseWheel : float = Input.GetAxis ("Mouse Wheel"); //Input: Sensibility: 1, Type: Mouse Movements, Axis: 3rd Axis Scroll.
GETMOUSE BUTTON:
function Update () {
if ( Input.GetMouseButtonDown (0) ){ // 0 = Izquierdo, 1 = Derecho, 2 =Scroll
//acción
}
}
GETKEY - STRINGS:
function Update () {
if ( Input.GetKeyDown ("space") ){
}
}
GETKEY - KEYCODE:
function Update () {
if ( Input.GetKeyDown (KeyCode.Space) ){
//acción
}
}
10
www.3dboxweb.com
FUNCIONES BÁSICAS:
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; // Pausa toda la acción del juego 0: Pausa, 1: Reanudar.
AudioListener.pause = true / false; // 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 (); // Creación de Random entre un Mínimo y Máximo.
Random.Rotation (); // 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 (gameObject, 1); //Destruir GameObject / por tiempo
Destroy (this); // Destruir el script de la instancia.
Destroy (rigidbody); // Destruye el Rigidbody del GameObject.
VECTOR3 DISTANCIA/ANGULO.
var Jugador : Transform;
var Distancia = Vector3.Distance (Jugador.position, transform.position); // Jugador posición, Objeto posición (a, b) | (a-b)
var Angulo = Vector3.Angle (Jugador.position, transform.forward); // Angulo de rotación de un objeto.
DEBUG.
Debug.Log (Mensaje/Variable); // Imprime mensajes en la consola de Unity.
Debug.LogError (Mensaje/Variable); // Una variante del "Log" que imprime mensajes de error en la consola.
Debug.LogWarning (Mensaje/Variable); // variante del "Log", imprime mensajes de advertencia en la consola.
Debug.break; // Crea una pausa en el Editor, para poder checar scripting.
Debug.DrawLine (Start:Vector3, End:Vector3, color:Color); // Dibuja una línea inicio-final-color .
Debug.DrawRay (Start:Vector3, Dir:Vector3, color: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.
APPLICATIONS.
AUDIO.
GIZMOS ICON
function OnDrawGizmos (){
Gizmos.DrawIcon (transform.position, "WayPoint.psd"); // Debde estar dentro de una Carpeta “Gizmos”.
}
AI_Script1
var OtroScript : AI_Script2; // Variable para guardar la conexión con el otro Script (se tiene que llamar como el script a llamar).
OtroScript.NombreFuncion(); //Ejecutamos la función que hay en el “Script 2”, o se puede poner algún valor en variables.
OtroScript.Variable = 2; // Mandarle un nuevo valor a la variable del “Script 2”.
AI_Script2
var Variable = 1; // Se deja en “Static” para poder acceder a la variable desde otro script.
function NombreFuncion () {} // Se deja en “Static” para poder acceder a la función desde otro script.
Script_1
Script_2
var A : int = 5;
//Local en el mismo GameObject entrar a cualquier componente. var B : int = 5;
Script_2 = this.GetComponent ("Script_2");
//Target entrar al componente de otro GameObject en la escena. function Ejecutar(){
Script_2 = GameObject.Find ("Sphere2").GetComponent ("Script_2"); //hacer algo
}
print (A+Script_2.B);
Script2.Ejecutar();
MATERIALES.
renderer.material.color = color.red; (green, blue, White. Black, yellow, cyan, magenta). // Cambio de Color en materiales.
// 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 () {
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));
RAYCASTING.
DETECTAR COLLISION
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).
TRIGGERS:
COLLISIONS:
//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); //Agregar componente de Rigidbody.
rigidbody.AddForce (Vector3 (0, 10, 0)); //Agregar una fuerza a un Rigidbody.
rigidbody.velocity = transform.TransformDirection (0, 0, speed); //Mover objeto con Rigidbody.
//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);
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 );
RAGDOLL.
//Reproducción de animación
animation.wrapMode = WrapMode.Loop;
animation.Play ("run");
// Esperar
yield WaitForSeconds (1.5);
Destino.position = Fuente.position;
Destino.rotation = Fuente.rotation;
//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);
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, Vector3 (0,0,0), transform.rotation);
}
else if (Save_Load == "B"){
Instantiate (Character, Vector3 (0,0,11), transform.rotation);
}
else if (Save_Load == "C"){
Instantiate (Character, Vector3 (0,0,24), transform.rotation);
}
else if (Save_Load == "D"){
Instantiate (Character, 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");
//Fade al cambiar a animación Walk Fade del Split Walk con los otros splits en 2 seg.
animation.CrossFade ("Walk"); / animation.CrossFade ("Walk", 0.2);
Motor.movement.maxForwardSpeed = 1.0;
Motor.movement.maxSidewaysSpeed = 1.0;
Motor.movement.maxBackwardsSpeed = 1.0;
23
www.3dboxweb.com
// Texto
//Al salir el mouse cambiar a textura A guiText.text = "Texto";
function OnMouseExit (){
guiTexture.texture = Textura_A; // Texto + Variable
} guiText.text = "Texto" + Variable;
//Al hacer click y soltar el botón del ratón cargar el nivel // Variable convertida a string
function OnMouseUp (){ guiText.text = Variable.ToString();
Application.LoadLevel (NivelCargar);
} // Cambio de color en el material del texto
guiText.material.color = Color.green;
.
YIELD / CORRUTINAS:
1. Ejemplo ----- Sin corrutina (probar esto en Update No funciona sin corrutina).
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.
function Tiempo () {
Debug.Log ("Tiempo --> Al instante");
yield WaitForSeconds (2);
Debug.Log ("Tiempo --> A los 2 Seg");
}
25
www.3dboxweb.com
INVOKE - CORRUTINAS:
function FuncionDeo () {
Debug.Log ("Se activa al tiempo: " + Time.time + " Seg");
}
function ElTiempo () {
Debug.Log ("Se activa al tiempo: " + Time.time + " Seg");
}
function LanzarEsfera () {
Instantiate(Esfera).velocity = Vector3 (0, 0, Random.Range(1, 20));
}