introduccioÌn al scripting_unityspain

Upload: neopeplin

Post on 16-Oct-2015

11 views

Category:

Documents


0 download

TRANSCRIPT

  • INTRODUCCIN AL SCRIPTING CON UNITYEl Scripting es una parte esencial de Unity ya que define el comportamiento de tu juego. Este tutorial introducir los fundamentos del Scripting usando JavaScript. No se requiere ningn conocimiento previo de JavaScript o Unity.

    Tiempo para completarlo: 2 horas.Autor: Graham McAllister.Traduccin: Unity Spain

    1. Objetivos del tutorialEl Scripting es la forma en la que el usuario define el comportamiento del juego (o las normas) en Unity. El lenguaje de programacin recomendado para Unity es JavaScript, aunque C# o Boo pueden ser igualmente usados. Este tutorial cubrir los fundamentos del Scripting en Unity e introducir adems elementos clave de la Application Programming Interface (API). Puedes pensar en la API como un cdigo que ya ha sido escrito para ti y que permite concentrarte en el diseo de tu juego y acelerar el tiempo de desarrollo.

    Un buen entendimiento de estos principios bsicos es esencial para aprovechar todo el poder de Unity.

    2. Requisitos previosEste tutorial se centra en el elemento de Scripting de Unity, se asume que ya ests familiarizado con la interfaz de Unity (si no es as deberas leer el tutorial GUI Unity).

    Para hacer el Scripting ms fcil de

    CONTENIDOS:

    1. Objetivos del tutorial2. Requisitos previos3. Convenciones de

    nomenclatura4. Imput del jugador5. Conectar variables6. Acceder a los componentes7. Instanciar8. Depurar9. Tipos de Scripts comunes

  • entender, es preferible que tengas un editor de cdigo que tenga un soporte de marcacin (o reexaltacin) sintctica para JavaScript. Esto significa que las palabras reservadas (la sintaxis usada por JavaScript) estn coloreadas de forma distinta a las palabras definidas por el usuario. Uno de esos editores es SubEthaEdit.

    Nota: cualquier texto que requiera el usuario para realizar una accin comienza con un -.

    3. Convenciones de nomenclatura Antes de empezar es conveniente mencionar algunas convenciones de Unity.

    Variables (variables) - empiezan con una letra minscula. Las variables se usan para almacenar informacin sobre cualquier aspecto de un estado de juego.

    Functions (funciones) - empiezan con una letra mayscula. Las funciones son bloques de cdigos que han sido escritos una vez y que se pueden rehusar tantas veces como sea necesario.

    Classes (clases) - empiezan con una letra mayscula. stos pueden tomarse como colecciones de funciones.

    Consejo: cuando leas el cdigo de ejemplo o la Unity API, presta mucha atencin a la primera letra de las palabras. Esto te ayudar a comprender mejor la relacin entre los objetos.

    4. Imput del jugadorPara nuestro primer programa vamos a permitir que el jugador se mueva en un mundo de juego sencillo.

    Situar la escena:

    - Inicia Unity.

    Primero vamos a crear una superficie en la que camine el usuario. La superficie que vamos a usar es la forma de un cubo aplastado.

    - Crea un cubo y escala las dimensiones x,y,z a 5, 0.1, y 5 respectivamente, ahora debera parecerse a un amplio y llano plano. Renombra este objeto como Plano en la Vista de Jerarqua (Hierarchy View).

  • - Crea un segundo cubo y colcalo en el centro del plano. Si no puedes ver los objetos en la Vista de Juego (Game View), altera la cmara principal para que estn visibles. Renombra el objeto como Cubo1 (Cube1).

    -Tambin deberas crear un punto de luz y colocarlo encima de los cubos de forma que sean visibles ms fcilmente.

    - Guarda la escena seleccionando File->Save As y dale un nombre al juego.

    Nuestro primer Script

    Ahora estamos listos para empezar a programar juegos. Vamos a permitir que el jugador camine por el mundo de juego controlando la posicin de la cmara principal. Para esto vamos a escribir un script que leer la entrada desde el teclado, luego adjuntamos (asociamos) el script con la cmara principal (ms en la prxima seccin).

    - Comenzar creando un script vaco. Selecciona Assets->Create->JavaScript y renombra este script como Movimiento1 (Move1) en el Panel del Proyecto (Project Panel).

    - Haz doble click en el script Move1 y se ya abrir con la funcin Update() insertada (es un comportamiento por defecto), vamos a insertar nuestro cdigo dentro de esta funcin. Cualquiera cdigo que insertes dentro de la funcin Update() ejecutar cada frame.

    Para mover un objeto de juego en Unity necesitamos cambiar la propiedad de posicin de su transform , la funcin Translate perteneciente al transform nos permitir hacerlo. La funcin Translate toma 3 parmetros: los movimientos x, y, z. Si queremos controlar el objeto de juego de la cmara principal con las teclas del cursor, simplemente asociamos cdigo para determinar si las teclas del cursor estn siendo presionadas para los respectivos parmetros:

    function Update () {

    transform.Translate(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

    }

    La funcin Input.GetAxis() devuelve un valor entre -1 y 1, por ejemplo en el eje horizontal, la tecla izquierda del cursor devuelve -1, la tecla derecha del cursor devuelve 1.

    Fijate en que el parmetro 0 en el eje y ya que no estamos interesados en mover la cmara hacia arriba. Los ejes Horizontal y Vertical estn predefinidos en el Input Settings, los nombres y claves trazados a ellos pueden ser fcilmente cambiados en Edit->Project Settings->Input.

  • -Abre el JavaScript Move1 y escribe el cdigo superior, presta atencin a las maysculas.

    Adjuntar el script

    Ahora que nuestro primer script est escrito, cmo le decimos a Unity qu objeto de juego debera tener ese comportamiento? Todo lo que tenemos que hacer es adjuntar el script al objeto de juego que queremos que muestre ese comportamiento.

    - Para hacer esto, primero haz click en el objeto de juego que quieras que tenga el comportamiento definido en el script. En nuestro caso, esta es la Cmara Principal, y tu puedes seleccionarla desde la Vista de Jerarqua (Hierarchy View) o desde la Vista de Escena (Scene View).

    - Despus selecciona Components->Scripts->Move1 desde el men principal. As se adjunta el script a la cmara, deberas notar que el componente Move1 ahora aparece en la Vista de Inspector (Inspector View) para la cmara principal.

    Consejo: puedes tambin asignar un script a un objeto de juego arrastrando el script desde la Vista de Proyecto (Project View) hasta el objeto en la Vista de Escena (View Scene).

    -Pon en marcha el juego (presiona el icono play en la parte superior), deberas ser capaz de mover la cmara principal con las teclas del cursor o W,S,A,D.

    Probablemente notaste que la cmara se movi un poco demasiado rpido, vamos a buscar una mejor forma de controlar la velocidad de la cmara.

    Tiempo Delta

    Como el anterior cdigo estaba dentro de la funcin Update(), la cmara se mova a la velocidad medida en metros por frame. De todas formas es mejor asegurarse de que tus objetos de juego se mueven al ritmo predecible de metros por segundo. Para conseguir esto tenemos que multiplicar el valor dado desde la funcin Input.GetAxis() por el tiempo Delta y tambin por la velocidad a la que queremos movernos por segundo:

    var speed = 5.0;function Update () {var x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;var z = Input.GetAxis("Vertical") * Time.deltaTime * speed;transform.Translate(x, 0, z);}

    -Actualiza el script Move1 con el cdigo superior.

  • Date cuenta aqu que la velocidad variable se declara fuera de la funcin Update(), esto es llamado una variable expuesta (exponed variable), y aparecer en la Vista de Inspector (Inspector View) para cualquier objeto de juego al que est adjunto el script (la variable queda explicada en la Unity GUI). Exponer variables es til cuando el valor necesita ser modificado para conseguir el efecto deseado, esto es mucho ms fcil que cambiar cdigos.

    5.Conectar variables.Conectar variables a travs de GUI es una caracterstica muy poderosa de Unity. Permite que las variables que normalmente estaran asignadas en cdigo puedan ser hechas mediante el drag and drop (arrastrar y tirar) en la GUI de Unity. Esto permite hacer rpidos y fciles prototipos de ideas. Como las variables se conectan a travs de la GUI de Unity, sabemos que siempre necesitaremos exponer una variable en nuestro cdigo de script para poder asignar el parmetro en la

    Vista de Inspector (Inspector View).

    Vamos a demostrar el concepto de conectar variables creando un foco de luz que seguir al jugador (Cmara Principal) mientras se mueve.

    - Aade un foco de luz (spotlight) a la Vista de Escena (Scene View). Muvelo si es necesario para que est cerca de los otros objetos de juego.

    - Crea un nuevo JavaScript y nmbralo Follow (Seguir).

    Pensemos en lo que queremos hacer. Queremos que nuestro nuevo foco de luz apunte a cualquiera que sea la cmara principal. Para que esto ocurra, hay una funcin en Unity que lo hace, transform.LookAt(). Si estabas empezando a pensar cmo lo hago? y te imaginabas un montn de cdigos, entonces merece la pena recordar siempre que puedes revisar la API de Unity para usar una funcin que ya existe. Tambin podramos acertar mirando en la seccin transform de la API, ya que estamos interesados en alterar la posicin o rotacin de un objeto de juego.

    Ahora vamos a la seccin de conectar variables; qu usamos como un parmetro para LookAt()? Podemos insertar un objeto de juego, no obstante sabemos que queremos asignar la variable mediante la GUI, as que slo tendremos que usar una variable expuesta (del tupo Transform). Nuestro Follow.js script debera parecerse a esto:

  • var target : Transform;function Update () {transform.LookAt(target);}

    - Adjunta el script al foco de luz y fijate que cuando el componente se aade, la variable target (objetivo) est expuesta.

    - Con el foco de luz aun seleccionado, arrastra la Cmara Principal desde la Vista de Jerarqua (Hierarchy View) hasta la variable target en la Vista de Inspector (Inspector View). As se asigna la variable objetivo, esto es, el foco de luz no seguir a la Cmara Principal. Si queramos el foco de luz para seguir a un objeto de juego diferente, podramos simplemente arrastrar hasta l un objeto diferente (mientras sea del tipo Transform, claro).

    - Pon en marcha el juego. Si miras la Vista de Escena (Scene View) deberas ver el foco de luz siguiendo a la Cmara Principal. Puede que quieras cambiar la posicin del foco para mejorar el efecto.

    6.Acceder a los componentes.Como un objeto de juego puede tener adjuntos mltiples scripts (o otros componentes), a veces es necesario tener acceso a otras funciones o variables de los componentes. Unity permite de esta forma la funcin GetComponent().

    Ahora vamos a aadir otro script a nuestro foco de luz, lo que har que mire al Cube1 (Cubo1) cuando el botn de salto (barra espaciadora por omisin) se presione.

    Pensemos en esto primero, lo que queremos hacer:

    1. Detectar cuando el botn de salto ha sido presionado.2. Cuando el botn haya sido presionado haz que el foco mire al Cube1. Como lo hacemos? Bueno, el script Follow contiene una variable target (objetivo) cuyo valor determina a qu objeto de juego debera mirar el foco de luz. Debemos fijar un nuevo valor para este parmetro. Podramos insertar el valor para el cubo (ver la seccin Hacerlo con cdigo ms tarde), sin embargo sabemos que exponer la variable y asignarla mediante la GUI es una mejor forma de hacerlo.

    - Crea un nuevo JavaScript y llmalo Switch (Cambiar). Aade el siguiente cdigo a Switch.js:

    var switchToTarget : Transform;function Update () {if (Input.GetButtonDown("Jump"))GetComponent(Follow).target = switchToTarget;}

  • Fijate en particular como Follow es el parmetro de GetComponent(), ste devuelve una referencia al script Follow que nosotros podemos usar entonces para acceder a su target (objetivo) variable.

    - Aade el script Switch al foco de luz y asigna el Cube1 al parmetro switchToTarget (cambiar a objetivo) en la Vista de Inspector (Inspector View).

    - Pon en marcha el juego. Muevete por ah y verifica que el foco de luz te sigue como siempre, luego pulsa la barra espaciadora y el foco de luz debera enfocar el Cube1.

    Hacindolo con cdigo

    Anteriormente en el tutorial ya mencionamos que sera posible asignar las variables por medio de cdigo (a diferencia de la GUI de Unity), vamos a ver cmo hacerlo.

    Recuerda que esto es slo para comparar, asignar variables mediante la GUI es la forma recomendada.

    El problema en el que estbamos interesados anteriormente era cmo podamos hacer que el foco de luz mirara al Cube1 cuando la tecla espacio estuviese pulsada. Nuestra solucin era exponer una variable en el script Switch que pudisemos asignar despus llevando el Cube1 hasta ella desde la GUI de Unity. Hay dos maneras principales para hacerlo en cdigo:

    1. Usa el nombre del objeto de juego.2. Usa la etiqueta (tag) del objeto de juego.

    1. Nombre del objeto de juego:

    Un nombre de objeto de juego puede verse en la Vista de Jerarqua (Hierarchy View). Para usar este nombre con cdigo lo usamos como un parmetro en la funcin GameObject.Find(). As que si queremos que el botn espacio cambie el foco de luz desde la Cmara Principal hasta Cube1, el cdigo es el siguiente:

    function Update () {if (Input.GetButtonDown("Jump")){var newTarget = GameObject.Find("Cube").transform;GetComponent(Follow).target = newTarget;}}

  • Nota que ninguna variable se expone si la nombramos directamente en cdigo. Revisa el API para ms opciones usando Find().

    2. Etiqueta del objeto de juego.

    Una etiqueta del objeto de juego es un string que puede ser usado para identificar un componente. Para ver las etiquetas incorporadas, haz click en el botn Tag (etiqueta) en al Vista de Inspector (Inspector View) y date cuenta de que puedes adems crear las tuyas propias. La funcin para encontrar un componente con una etiqueta especfica es GameObject.FindWithTag() y toma un string como parmetro. Nuestro cdigo completo para hacerlo es:

    function Update () {if (Input.GetButtonDown("Jump")){var newTarget = GameObject.FindWithTag("Cube").transform;GetComponent(Follow).target = newTarget;}}

    7.Instanciar.A veces es conveniente crear objetos durante el tiempo de ejecucin (mientras se est jugando al juego). Para hacer esto usamos la funcin Instantiate.

    Vamos a mostrar cmo funciona creando un nuevo objeto de juego cada vez que el usuario presione la tecla fire (el botn izquierdo del ratn o el Ctrl izquierdo del teclado).

    Entonces qu queremos hacer? Queremos que el usuario se mueva normalmente, y cuando presione la tecla fire, se cree un nuevo objeto. Varias cosas en las que pensar:

    1. Qu objeto creamos?2. Dnde lo creamos?

    En cuanto al objeto a crear, la mejor forma de solventarlo es exponer una variable. Esto significa que podemos establecer qu objeto crear mediante el uso del drag and drop para asignar un objeto de juego a esta variable.

    Para saber dnde crearlo, por ahora slo crearemos el nuevo objeto de juego donde sea que el usuario (Cmara Principal) est actualmente situado cuando quiera que la tecla sea presionada. La funcin Instantiate toma 3 parmetros: (1) el objeto que queremos crear, (2) la posicin 3D del objeto, y (3) la rotacin del objeto.

  • El cdigo completo para hacer esto es el siguiente (Create.js):

    var newObject : Transform;function Update () {if (Input.GetButtonDown("Fire1")) {Instantiate(newObject, transform.position, transform.rotation);}}

    No olvides que transform.position y transform.rotation son la posicin y rotacin de transformar al que est adjunto el script; en nuestro caso ser la Cmara Principal.

    Sin embargo, cuando un objeto se crea, es normal que ese objeto sea un prefabricado. Vamos ahora a transformar el objeto de juego Cube1 en un prefabricado.

    - Primero, vamos a crear un prefabricado (prefab) vaco. Selecciona Assets-Create-Prefab. Llama al prefabricado Cube.

    - Arrastra el objeto de juego Cube1 desde la Vista de Jerarqua (Hierarchy View) hasta el prefabricado Cube en la Vista de Proyecto (Project View). Nota que el icono prefabricado cambia.

    Ahora podemos crear nuestro cdigo JavaScript.

    - Crea un nuevo JavaScript y llmalo Create (crear). Inserta el cdigo superior.- Adjunta este script a la Cmara Principal y asigna el prefabricado Cube a la variable newObject de la Cmara Principal.- Juega al juego y muvete como de costumbre. Cada vez que el botn fire sea pulsado deberas notar que un nuevo cubo aparece.

    8.Depurar.Depurar es la tcnica para encontrar y solucionar errores humanos en tu cdigo (vale, llammosles equivocaciones). Unity proporciona ayuda mediante la clase Debug (depurar), vamos ahora a mirar la funcin Debug.Log().

    Log

    La funcin Log() permite al usuario mandar un mensaje a la Consola de Unity. Algunas razones para hacer esto:

    1. Para probar que una cierta parte del cdigo est siendo alcanzada durante el tiempo de ejecucin.2. Para informar del estado de una variable.

    Vamos a usar ahora la funcin Log() para mandar un mensaje a la Consola de Unity cuando el usuario pulse la tecla fire.

  • - Abre el script Create y aade la siguiente lnea tras el cdigo Instantiate (instanciar) dentro del bloque if:

    Debug.Log("Cube created");

    - Pon en marcha el juego y pulsa la tecla ---. Deberas ver una lnea que aparece al pie de la GUI de Unity diciendo cube created (cubo creado), puedes hacer click en ella para examinar la Consola de Unity.

    Mirar

    Otra caracterstica til para depurar es exponer una variable particular. Esto hace que la variable sea visible en la Vista de Inspector (Inspector View) cuando se selecciona el modo Debug (depurar), pero no puede ser editado.

    Para demostrarlo, vamos a exponer una variable particular para contar el nmero de cubos que creamos.- Abre el script Create otra vez y aade 2 lneas:

    (1) Aade una variable particular llamada cubeCount .(2) Incrementa esta variable cuando se cree un cubo.El cdigo completo es el siguiente (Create.js):

    var newObject : Transform;private var cubeCount = 0;function Update () {if (Input.GetButtonDown("Fire1")) {Instantiate(newObject, transform.position, transform.rotation);Debug.Log("Cube created");cubeCount++;}}

    - Arranca el juego y pulsa la tecla fire (disparar) para crear algunos cubos. Date cuenta de cmo se incrementa la variable cubeCount en la Vista de Inspector cada vez que se crea un cubo. Nota adems cmo el nmero aparece sombreado en gris, lo que indica que es una variable nicamente de lectura (no se puede editar).

    9.Tipos de scripts comunes. Cuando se crea un nuevo JavaScript, por defecto ste contiene una funcin Update(). En esta seccin trataremos otras opciones comunes disponibles, simplemente reemplazando el nombre de la funcin Update() con uno de la lista inferior.

  • FixedUpdate()

    El cdigo situado dentro de esta funcin se ejecuta en intervalos regulares (a un ritmo de presentacin de frames fijado). Es muy comn usar este tipo de funcin cuando aplicamos fuerzas a un Rigidbody (cuerpo rgido).

    // Apply a upwards force to the rigid body every framefunction FixedUpdate () {rigidbody.AddForce (Vector3.up);}

    Awake()

    El cdigo dentro de esta funcin es llamado cuando se inicia el script.

    Start()

    Se llama antes de cualquier funcin Update, pero despus de la funcin Awake(). La diferencia entre las funciones Start() y Awake() es que la funcin Start() es llamada nicamente si el script es habilitado (si su checkbox est habilitada en la Vista de Inspector).

    OnCollisionEnter()

    El cdigo dentro de esta funcin se ejecuta cuando el objeto de juego al que pertenece el script colisiona con otro objeto de juego.

    OnMouseDown()

    El cdigo se ejecuta cuando el ratn hace clic sobre un objeto de juego que contiene un GUIElement (elemento GUI) o un Collider .

    // Loads the level named "SomeLevel" as a response// to the user clicking on the object

    function OnMouseDown () {Application.LoadLevel ("SomeLevel");}

    OnMouseOver()

    El cdigo aqu dentro se ejecuta cuando el ratn se coloca sobre un objeto de juego que contiene un GUIElement (elemento GUI) o un Collider .

    // Fades the red component of the material to zero// while the mouse is over the mesh

    function OnMouseOver () {renderer.material.color.r -= 0.1 * Time.deltaTime;}

  • Revisa la API de Unity para mas informacin sobre todas estas funciones.

    Resumen

    Este tutorial ha introducido los conceptos esenciales de los scripts en Unity. Ahora deberas leer otros tutoriales de Unity o intentar experimentar por ti mismo.