You are on page 1of 89

Usando guiones Creando Y

El comportamiento de los GameObjects est controlada por los componentes que estn
conectados a ellos. Aunque los componentes integrados de Unity pueden ser muy verstil,
pronto encuentra que necesita ir ms all de lo que pueden ofrecer para implementar sus
propias caractersticas de juego. Unidad le permite crear sus propios componentes
utilizandoguiones . Estas te permiten disparar eventos del juego, modificar las propiedades de
los componentes con el tiempo y responder a la entrada del usuario en cualquier forma que
desee.
Unidad admite tres lenguajes de programacin de forma nativa:

C # (pronunciado C-sharp), un lenguaje estndar de la industria similar a Java o C ++;

UnityScript , un lenguaje diseado especficamente para su uso con la Unidad y el

modelo de JavaScript;
Boo , un lenguaje .NET con sintaxis similar a Python.
Adems de estos, muchos otros lenguajes .NET pueden utilizarse con Unity si pueden
compilar una DLL compatible - ver esta pgina para ms detalles.
Aprender el arte de la programacin y el uso de estos lenguajes particulares est ms all del
alcance de esta introduccin.Sin embargo, hay muchos libros, tutoriales y otros recursos para
aprender a programar con Unity. Vea la seccin Aprender de nuestro sitio web para ms
detalles.

Scripts Creando
A diferencia de la mayora de los otros activos, los scripts se crean generalmente dentro de la
Unidad directamente. Puedes crear un nuevo script en el men Crear en la parte superior
izquierda del panel Proyecto o seleccionando Activos> Crear> C # Guin (o JavaScript script /
Boo) en el men principal.
El nuevo script se crear en cualquier carpeta que haya seleccionado en el panel Proyecto. El
nombre del nuevo archivo de script ser seleccionado, le pide que introduzca un nuevo
nombre.

Es una buena idea para escribir el nombre de la nueva secuencia de comandos en este punto
en lugar de editar ms tarde. El nombre que introduzca se utilizar para crear el texto inicial
dentro del archivo, como se describe a continuacin.

Anatoma de un archivo de secuencias de


comandos
Al hacer doble clic en un activo de la escritura en la unidad, se le abrir en un editor de
texto. Por defecto, la unidad utilizar MonoDevelop, pero puede seleccionar cualquier editor te
gusta desde el panel Herramientas externas en las preferencias de Unity.
El contenido inicial del archivo se ver algo como esto:

utilizando UnityEngine;
utilizando System.Collections;

pblica clase

MainPlayer : MonoBehaviour {

// Utilice esta para inicializacin


void start () {

// Actualizacin se llama una vez por cuadro


void Update () {

}
}

Una secuencia de comandos hace que su relacin con el funcionamiento interno de la Unidad
mediante la implementacin de una clase que deriva de la clase incorporada
llamada MonoBehaviour . Usted puede pensar en una clase como una especie de modelo
para la creacin de un nuevo tipo de componente que se puede conectar a
GameObjects. Cada vez que se conecta un componente de secuencia de comandos para un
GameObject, se crea una nueva instancia del objeto definido por el plano. El nombre de la
clase se toma del nombre que proporcion cuando se cre el archivo. El nombre de la clase y
el nombre del archivo debe ser el mismo para que el componente de secuencia de comandos
para ser conectado a un GameObject.
Las principales cosas a tener en cuenta, sin embargo, son las dos funciones definidas dentro
de la clase. La actualizacin dela funcin es el lugar para colocar el cdigo que se encargar
de la actualizacin del marco para la GameObject. Esto podra incluir el movimiento, lo que
provoc las acciones y la respuesta a la entrada del usuario, bsicamente cualquier cosa que
necesita ser manejado con el tiempo durante el juego. Para activar la funcin de actualizacin
para hacer su trabajo, a menudo es til para poder establecer las variables, lea las
preferencias y hacer conexiones con otros GameObjects antes de cualquier accin del juego
tiene lugar. El Start funcin ser llamada por la Unidad antes de que comience el juego (es

decir, antes de la funcin de actualizacin se llama por primera vez) y es un lugar ideal para
hacer cualquier inicializacin.
Nota para los programadores experimentados: puede que se sorprenda de que la
inicializacin de un objeto no se hace usando una funcin constructora. Esto se debe a la
construccin de objetos es manejado por el editor y no tiene lugar al inicio del juego como se
podra esperar. Si intenta definir un constructor para un componente de secuencia de
comandos, interfiera con el normal funcionamiento de la Unidad y puede causar mayores
problemas con el proyecto.
Un script Boo sigue aproximadamente el mismo diseo que un script C # pero UnityScript
funciona un poco diferente: -

#pragma estricta

funcin

Start

() {

la funcin

de actualizacin

() {

En este caso, las funciones de inicio y Actualizar tienen el mismo significado, pero la clase no
se declara explcitamente. La secuencia de comandos en s se supone para definir la

clase; derivar implcitamente de MonoBehaviour y tome su nombre del nombre de archivo del
activo guin.

Controlando la ONU GameObject


Como se seal anteriormente, una secuencia de comandos slo define un plan para un
componente y por lo que ninguno de su cdigo se activar hasta que se adjunta un ejemplo de
la secuencia de comandos a un GameObject. Puede adjuntar un script arrastrando el
elemento script para un GameObject en el panel de jerarqua o al inspector de la GameObject
que est seleccionado actualmente. Tambin hay un submen Scripts en el men de
componentes que contendr todas las secuencias de comandos disponibles en el proyecto,
incluidos los que haya creado usted mismo. La instancia de secuencia de comandos se
parece mucho a cualquier otro componente en el Inspector: -

Una vez conectado, el guin comenzar a trabajar cuando usted presiona el juego y ejecutar
el juego. Usted puede comprobar esto aadiendo el siguiente cdigo en la funcin de inicio: -

// Utilizar esto para inicializacin


vaco Inicio () {
Debug.log ( "estoy vivo!" );
}

Debug.log es un comando simple que slo imprime un mensaje de salida de la consola de la


Unidad. Si pulsa Reproducir ahora, debera ver el mensaje en la parte inferior de la ventana
principal editor de Unity y en la ventana Console (men:Ventana> Consola ).

Variables
Un script funciona como cualquier otro componente en su mayor parte, pero te dars cuenta
de que el tema Inspector para el script se parece un poco al lado de los otros componentes

con sus propiedades editables. Puede permitir que los valores de la secuencia de comandos
para editar desde el Inspector utilizando variables: -

utilizando UnityEngine;
utilizando System.Collections;

pblica clase

MainPlayer : MonoBehaviour {

myName cadena pblica;

// Utilice esta para inicializacin


void start () {
Debug.log ( "Estoy vivo y mi nombre es" + myName);
}

// Actualizacin se llama una vez por cuadro


void Update () {

Este cdigo crea un elemento en el inspector etiqueta "Mi Nombre".

La unin hace la etiqueta Inspector mediante la introduccin de un espacio donde se produce


una letra mayscula en el nombre de la variable. Sin embargo, esto es puramente para fines
de visualizacin y siempre se debe utilizar el nombre de la variable dentro de su cdigo. Si
edita el nombre y luego pulse Play, ver que el mensaje incluye el texto que ha introducido.

En C # y Boo, debe declarar una variable como pblico a verlo en el Inspector. En UnityScript,
las variables son pblicos por defecto a menos que se especifique que deberan ser privadas:
-

# pragma estricta

privado

var invisibleVar: int ;

funcin Start () {

La unidad ser realidad permitir cambiar el valor de las variables de un guin mientras que el
juego est en marcha. Esto es muy til para ver los efectos de los cambios directamente sin
tener que detener y reiniciar. Cuando termina el juego, los valores de las variables se
restablecern a lo que eran antes de pulsar Play. Esto asegura que usted es libre de modificar
la configuracin de su objeto, sin temor a hacer ningn dao permanente.

GameObjects Control de Utilizacin de componentes


En el editor de la Unidad, se realizan cambios en las propiedades de los componentes utilizando el
Inspector. As, por ejemplo, los cambios en los valores de posicin del componente Transformar dar
lugar a un cambio en la posicin de la GameObject.Del mismo modo, se puede cambiar el color de los
materiales de un procesador o la masa de un Rigidbody con un efecto correspondiente en la apariencia o
el comportamiento de la GameObject. En su mayor parte, de scripting es tambin acerca de cmo
modificar las propiedades de componentes para manipular GameObjects. La diferencia, sin embargo, es
que una secuencia de comandos puede variar el valor de una propiedad gradualmente con el tiempo o en
respuesta a la entrada del usuario. Al cambiar, crear y destruir objetos en el momento adecuado,
cualquier tipo de juego puede ser implementado.

Acceso a los Componentes


El caso ms simple y ms comn es cuando un script necesita acceso a otros componentes conectados al
mismo GameObject.Como se mencion en la seccin de Introduccin, un componente es en realidad una
instancia de una clase por lo que el primer paso es obtener una referencia a la instancia del componente
que desee trabajar. Esto se hace con el getComponentfuncin. Por lo general, usted quiere asignar el
objeto de componentes a una variable, que se realiza en C # utilizando la siguiente sintaxis: -

void start () {
Rigidbody rb = getComponent < Rigidbody > ();

En UnityScript, la sintaxis es sutilmente diferente: -

funcin

Start

() {

var rb = getComponent. < Rigidbody > ();


}

Una vez que tenga una referencia a una instancia de componente, puede establecer los valores de sus
propiedades tanto como lo hara en el Inspector: -

void start () {
Rigidbody rb = getComponent < Rigidbody > ();

// Cambiar la masa de Rigidbody del objeto.


rb.mass = 10F;
}

Una caracterstica adicional que no est disponible en el Inspector es la posibilidad de llamar a funciones
en instancias de componentes: -

void start () {
Rigidbody rb = getComponent < Rigidbody > ();

// Aadir una fuerza a la Rigidbody.


rb.AddForce (Vector3.up * 10F);
}

Tenga en cuenta tambin que no hay ninguna razn por qu no puede tener ms de un script
personalizado adjunto al mismo objeto. Si necesita acceder a un script desde otra, puede utilizar
getComponent como de costumbre y slo tiene que utilizar el nombre de la clase de escritura (o el
nombre del archivo) para especificar el tipo de componentes que desea.
Si intenta recuperar un componente que en realidad no se ha agregado a la GameObject entonces
getComponent devolver null; obtendr un error nula referencia en tiempo de ejecucin si se intenta
cambiar los valores en un objeto nulo.
Dado que algunos tipos de componentes se utilizan con mucha frecuencia, la Unidad ofrece un plus en
las variables de acceder a ellos en la clase MonoBehaviour, para que puedas usar cosas como: -

vaco Inicio () {
transform.position = Vector3.zero;
}

... Sin primero tener que utilizar getComponent acceder a la transformada de componentes. La lista
completa de las variables integradas de componentes se da en la pgina de referencia de la escritura
MonoBehaviour. Tenga en cuenta que como con getComponent, si el componente deseado no est
conectado al objeto a continuacin, la variable contendr un valor nulo.

Acceso a otros objetos


A pesar de que a veces operan de manera aislada, es comn que las secuencias de comandos para realizar
un seguimiento de otros objetos. Por ejemplo, un enemigo perseguidor puede ser que necesite saber la
posicin del jugador. Unidad proporciona una serie de diferentes maneras de recuperar otros objetos,
cada uno adecuado para determinadas situaciones.

Vinculacin de objetos con variables


La forma ms sencilla de encontrar un GameObject relacionado es aadir una variable GameObject
pblico al guin: -

pblica clase

Enemigo : MonoBehaviour {

jugador GameObject pblico;

// Otras variables y funciones ...


}

Esta variable ser visible en el Inspector como cualquier otro: -

Ahora puede arrastrar un objeto de la escena o el panel Jerarqua en esta variable para asignarlo. Las
variables de la funcin getComponent y acceso a los componentes estn disponibles para este objeto
como con cualquier otro, por lo que puede utilizar cdigo como el siguiente: -

pblica clase

Enemigo : MonoBehaviour {

jugador GameObject pblico;

void start () {
// Inicia el enemigo diez unidades detrs del personaje
del jugador.
transform.position = player.transform.position Vector3.forward * 10 f;
}
}

Adems, si declarar una variable pblica de un tipo de componente en el script, puede arrastrar cualquier
GameObject que tiene ese componente conectado en la misma. Esto acceder al componente directamente
en lugar de la propia GameObject.

pblica Transform playerTransform;

Vinculacin de objetos junto con las variables es ms til cuando usted est tratando con objetos
individuales que tienen conexiones permanentes. Puede utilizar una variable de matriz para enlazar
varios objetos del mismo tipo, pero las conexiones todava debe estar hecho en el editor de Unity en
lugar de en tiempo de ejecucin. A menudo es conveniente para localizar objetos en tiempo de ejecucin
y la unidad ofrece dos maneras bsicas de hacer esto, como se describe a continuacin.

Encontrar objetos secundarios


A veces, una escena del juego har uso de una serie de objetos del mismo tipo, como enemigos,
waypoints y obstculos. Estos pueden necesitar ser rastreado por un guin especial que supervisa o

reacciona a ellos (por ejemplo, todos los puntos de ruta pueden necesitar estar disponibles para el script
bsqueda de caminos). Utilizacin de variables para vincular estos objetos es una posibilidad, pero que
har que el proceso de diseo tedioso si cada nuevo waypoint tiene que ser arrastrado a una variable en
un guin. Del mismo modo, si se elimina un waypoint, entonces es una molestia tener que quitar la
referencia variable para el objeto que falta. En casos como este, a menudo es mejor para gestionar un
conjunto de objetos, hacindolos todos hijos de un mismo objeto padre. Los objetos secundarios se
pueden utilizar retreived del padre Transformar componentes (ya que todos los GameObjects tienen
implcito un Transform): -

pblica clase

WaypointManager : MonoBehaviour {

pblica Transformar puntos de recorrido;

void start () {
waypoints = new Transformar [transform.childCount];
int i = 0 ;

para (Transform t en transformar) {


waypoints [i ++] = t;
}
}
}

Tambin puede localizar un objeto secundario especfico por nombre utilizando


el Transform.Find funcin: -

transform.Find ("Gun");

Esto puede ser til cuando un objeto tiene un nio que puede ser aadido y eliminado durante el
juego. Un arma que puede ser recogido y dej es un buen ejemplo de esto.

Bsqueda de objetos por nombre o etiqueta


Siempre es posible localizar GameObjects en cualquier lugar en la jerarqua de la escena, siempre y
cuando usted tiene alguna informacin para identificarlos. Los objetos individuales se pueden recuperar
por nombre mediante elGameObject.Find funcin: -

Jugador GameObject;

vaco Inicio () {
jugador = GameObject.Find ( "MainHeroCharacter" );
}

Un objeto o una coleccin de objetos tambin se pueden localizar por su etiqueta utilizando
los GameObject.FindWithTag yGameObject.FindGameObjectsWithTag funciones: -

Jugador GameObject;
GameObject [] enemigos;

vaco Inicio () {

jugador = GameObject.FindWithTag ( "Jugador" );


enemigos = GameObject.FindGameObjectsWithTag ( "Enemigo" );
}

Funciones de eventos
Una secuencia de comandos en la Unidad no es como la idea tradicional de un programa en el que el
cdigo se ejecuta continuamente en un bucle hasta que complete su tarea. En lugar de ello, la Unidad
pasa el control a un guin intermitente llamando a ciertas funciones que se declaran dentro de ella. Una
vez que una funcin ha finalizado la ejecucin, el control pasa de nuevo a la Unidad. Estas funciones se
conocen como funciones de eventos, ya que se activan por la Unidad en respuesta a eventos que ocurren
durante el juego. Unidad utiliza un esquema de nombres para identificar qu funciona para llamar a un
evento en particular. Por ejemplo, usted ya habr visto la funcin Update (llamada antes de que ocurra
una actualizacin del marco) y la funcin de inicio (llamado justo antes de la primera actualizacin del
marco del objeto). Muchas ms funciones de eventos estn disponibles en la Unidad; La lista completa
se puede encontrar en la pgina de referencia de la escritura para la clase MonoBehaviour junto con los
detalles de su uso. Los siguientes son algunos de los eventos ms comunes e importantes.

Actualizar Eventos Regulares


Un juego es un poco como una animacin donde los cuadros de animacin se generan sobre la
marcha. Un concepto clave en la programacin de juegos es la de hacer cambios a la posicin, el estado
y el comportamiento de los objetos en el juego justo antes de se vuelve cada trama. La actualizacin
de la funcin es el lugar principal para este tipo de cdigo en la Unidad.Actualizacin se llama antes de
que se pronuncie la trama y tambin antes se calculan animaciones.

void Update () {
float distancia = velocidad * Time.deltaTime *
Input.GetAxis ( "Horizontal" );
transform.Translate (Vector3.right * velocidad);
}

El motor de fsica tambin actualiza en pasos de tiempo discretos en una manera similar a la prestacin
marco. Una funcin evento separado llamado FixedUpdate se llama justo antes de cada actualizacin de
la fsica. Dado que los cambios fsicos y los cambios de marco no ocurren con la misma frecuencia,
obtendr resultados ms precisos a partir de cdigo de la fsica si se coloca en la funcin FixedUpdate
lugar de actualizacin.

vaco FixedUpdate () {
Fuerza Vector3 = transform.forward * driveForce *
Input.GetAxis ( "vertical" );
rigidbody.AddForce (fuerza);
}

Tambin es til a veces para poder realizar cambios adicionales en un punto despus de la actualizacin
y funciones FixedUpdate haber sido llamado para todos los objetos de la escena y despus de haberse
calculado todas las animaciones.Un ejemplo es cuando una cmara debe permanecer entrenado en un
objeto de destino; el ajuste de la orientacin de la cmara debe ser hecha despus de que el objeto de
destino se ha movido. Otro ejemplo es cuando el cdigo de secuencia de comandos debe anular el efecto
de una animacin (por ejemplo, para que la cabeza del personaje mira hacia un objeto de destino en la
escena). El LateUpdate funcin se puede utilizar para este tipo de situaciones.

vaco LateUpdate () {
Camera.main.transform.LookAt (target.transform);
}

Inicializacin Eventos
A menudo es til poder llamar a cdigo de inicializacin antes de las actualizaciones que se producen
durante el juego. ElStart funcin se llama antes de que el primer fotograma o actualizacin de la fsica en
un objeto. El Awake funcin se llama para cada objeto en la escena en el momento cuando se carga la
escena. Tenga en cuenta que aunque las funciones de inicio y Awake los diversos objetos 'son llamados
en orden arbitrario, toda la Awakes habr terminado antes de que se llama el primer inicio. Esto significa
que el cdigo en una funcin Start puede hacer uso de otras inicializaciones realizadas previamente en la
fase Awake.

Eventos GUI
Unidad cuenta con un sistema para la prestacin de controles GUI sobre la accin principal en la escena
y responder a los clics en estos controles. Este cdigo se maneja de manera algo diferente a la
actualizacin de cuadro normal y por lo que debe ser colocado en el Ongui funcin, que se llamar
peridicamente.

vaco Ongui () {
GUI.Label (labelRect, "Game Over" );
}

Tambin puede detectar eventos de ratn que se producen durante un GameObject tal como aparece en la
escena. Esto se puede utilizar para armas destinada a una audiencia o mostrar informacin sobre el
carcter actualmente bajo el puntero del ratn. Un conjunto de funciones de eventos OnMouseXXX (por
ejemplo, OnMouseOver , OnMouseDown ) est disponible para permitir un script para reaccionar a las
acciones del usuario con el ratn. Por ejemplo, si se pulsa el botn del ratn mientras el puntero est
sobre un objeto en particular, entonces una funcin OnMouseDown en el guin de ese objeto ser
llamado si es que existe.

Eventos Fsica
El motor de fsica informar colisiones contra un objeto llamando a funciones de eventos en el guin de
ese objeto. LosOnCollisionEnter , OnCollisionStay y OnCollisionExit funciones sern llamados como se
hace el contacto, celebrada y roto. Los
correspondientes OnTriggerEnter , OnTriggerStay y OnTriggerExit funciones sern llamados cuando
colisionador del objeto se configura como un disparador (es decir, un colisionador que simplemente
detecta cuando algo entra en ella en lugar de reaccionar fsicamente). Estas funciones pueden ser
llamados varias veces en sucesin si se detecta ms de un contacto durante la actualizacin de la fsica y

por lo que un parmetro se pasa a la funcin de dar detalles de la colisin (posicin, la identidad del
objeto entrante, etc).

anular OnCollisionEnter (otherObj: Colisin) {


si (otherObj.tag == "Arrow" ) {
ApplyDamage ( 10 );
}
}

Creando y destruyendo GameObjects.


Algunos juegos mantienen un nmero constante de objetos en escena, pero es muy comn
para personajes, tesoros y otros objetos ser creados y eliminados a la hora de jugar
(gameplay). En Unity, un GameObject puede ser creado usando la funcinInstantiate la cual
crea una nueva copia de un objeto existente:-

public GameObject enemy;

void Start() {
for (int i = 0; i < 5; i++) {
Instantiate(enemy);
}
}

Observe que el objeto del cual la copia es realizada no requiere estar presente en la escena.
Es ms comn usar un prefab arrastrado a una variable pblica desde el Project panel (panel
del Proyecto) en el editor. Tambin, crear instancias de un GameObject copiar todos los
Componentes presentes en el original.
Tambin hay una funcin Destroy que permite destruir un objeto despus que la actualizacin
de frame ha terminado u opcionalmente despus de un retardo de tiempo corto:-

void OnCollisionEnter(otherObj: Collision) {


if (otherObj == "Missile") {
Destroy(gameObject,.5f);
}
}

Observe que la funcin Destroy puede destruir componentes individuales sin afectar el
GameObject en s. Un error comn es escribir algo como:-

Destroy(this);

lo cual realmente solo destruir el componente del script que le llama en vez de destruir el
GameObject al cual el script est atado.

Coroutines

Cuando usted llama a una funcin, esta se ejecuta en su totalidad antes de retornar. Esto
significa efectivamente que cualquier accin tomando lugar en una funcin debe suceder en
una sola actualizacin de frame (cuadro); un llamado a una funcin no puede ser usado para
contener una animacin procedimental o una secuencia de eventos en el tiempo. Como un
ejemplo, considere la tarea de reducir gradualmente el valor alfa (alpha) de un objeto
(opacidad) hasta que se convierta completamente invisible.

void Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
}
}

Tal como est, la funcin Fade (Desvanecer) no tendr el efecto que usted espera. Para que
el desvanecimiento sea visible, el alfa debe ser reducido sobre una secuencia de frames
(cuadros) para mostrar los valores intermedios siendo renderizados. Sin embargo, la funcin
se ejecutar en su totalidad en una sola actualizacin de cuadro. Los valores intermedios
nunca se vern y el objeto desaparecer instantneamente.
Es posible manejar situaciones como estas agregando cdigo a la funcin Update que ejecuta
el desvanecer en una base cuadro-a-cuadro (frame-by-frame). Sin embargo, es usualmente
mas conveniente usar una coroutine (corrutina) para este tipo de tarea.

Una coroutine (corrutina) es como una funcin que tiene la habilidad de pausar su ejecucin y
retornar el control a Unity para luego continuar donde dej en el siguiente frame. En C#, una
coroutine es declarada as:-

IEnumerator Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return null;
}
}

Es es esencialmente una funcin declarada con un tipo de retorno de IEnumerator y con una
instruccin de retorno yield (yield return) incluida en algn lugar de su cuerpo. La linea de
retorno yield es el punto en el cual la ejecucin se pausar y reanudar en el siguiente frame
(cuadro). Para establecer una coroutine en ejecucin, usted necesita usar la
funcinStartCoroutine

void Update() {
if (Input.GetKeyDown("f")) {

StartCoroutine("Fade");
}
}

En UnityScript, las cosas son un poco mas simples. Cualquier funcin que incluya una
sentencia yield se entiende que es una coroutine y el tipo de retorno IEnumerator no requiere
ser declarado explicitamente:-

function Fade() {
for (var f = 1.0; f >= 0; f -= 0.1) {
var c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield;
}
}

Adems, una coroutine puede ser iniciada en UnityScript llamandola como si fuese una
funcin normal:-

function Update() {
if (Input.GetKeyDown("f")) {
Fade();
}
}

Notar que el contador en el ciclo en la funcin Fade mantiene su valor correcto sobre el
tiempo de vida de la coroutine. De hecho, cualquier variable o parametro ser preservado
correctamente entre los yields.
Por defecto, una coroutine es reanudada en el frame despus de que haga yield, pero tambin
es posible introducir un tiempo de retardo usando WaitForSeconds:-

IEnumerator Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;

yield return new WaitForSeconds(.1f);


}
}

en UnityScript

function Fade() {
for (var f = 1.0; f >= 0; f -= 0.1) {
var c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield WaitForSeconds(0.1);
}
}

Esto puede ser usado como una forma de propagar un efecto sobre un periodo de tiempo pero
tambin es una til optimizacin. Muchas tareas en un juego necesitan ser llevadas a cabo
peridicamente y la forma mas obvia de hacer esto es incluirles en la funcin Update. Sin

embargo, esta funcin usualmente ser llamada muchas veces por segundo. Cuando una
tarea no requiere ser repetida tan frecuentemente, le puede poner en una coroutine para
obtener una actualizacin regularmente pero no en cada frame. Un ejemplo de esto puede ser
una alarma que alerta al usuario si un enemigo est cerca. El cdigo podra verse algo como
esto:-

function ProximityCheck() {
for (int i = 0; i < enemies.Length; i++) {
if (Vector3.Distance(transform.position,
enemies[i].transform.position) < dangerDistance) {
return true;
}
}

return false;
}

Si hay muchos enemigos, entonces llamar esta funcin cada cuadro podra introducir una
sobrecarga significativa. Sin embargo, podra usar una coroutine para llamarle cada dcima de
segundo:-

IEnumerator DoCheck() {

for(;;) {
ProximityCheck;
yield return new WaitForSeconds(.1f);
}
}

Esto reducir en gran cantidad el nmero de comprobaciones llevados a cabo sin ningn
efecto notable en la experiencia de juego.

Carpetas especiales y secuencias de comandos de compilacin Orden


En su mayor parte, se puede elegir cualquier nombre que desee para las carpetas del
proyecto, pero la Unidad se reserva algunos nombres para indicar que el contenido tiene un
propsito especial. Algunas de estas carpetas tienen un efecto en el orden de compilacin
guin. Esencialmente, hay cuatro fases separadas de compilacin guin y la fase donde se
compilar un script est determinada por su carpeta principal.
Esto es importante en los casos en que un script debe hacer referencia a las clases definidas
en otros scripts. La regla bsica es que cualquier cosa que se compila en una fase tras el
actual no se puede hacer referencia. Cualquier cosa que se compila en la actual fase o una
fase anterior est totalmente disponible.
Otra situacin se produce cuando un script escrito en una lengua debe hacer referencia a una
clase definida en otro idioma (por ejemplo, un archivo UnityScript que declara variables de una
clase definida en un script C #). La regla aqu es que la clase que se hace referencia debe
haber sido compilado en una anterior fase.
Las fases de compilacin son los siguientes: -

Fase 1: secuencias de comandos de tiempo de ejecucin de las carpetas llamados Activos


Standard , Pro Standard Los activos y Plugins .
Fase 2: Editor de scripts en carpetas llamados Activos estndar / Editor , Pro Standard Los
activos / Editor y Plugins / Editor .
Fase 3: Todos los dems scripts que no se encuentran dentro de una carpeta llamada Editor .
Fase 4: Todos los scripts restantes (es decir, los que estn dentro de una carpeta
llamada Editor ).
Adems, cualquier secuencia de comandos dentro de una carpeta
llamada WebPlayerTemplates en el nivel superior de la carpeta Assets no se compilar en
absoluto. Este comportamiento es ligeramente diferente de los otros nombres de carpeta
especial que tambin trabajan dentro de subcarpetas (por ejemplo, scripts / obras Editor como
una carpeta de scripts editor pero scripts / WebPlayerTemplates no impide compilacin).
Un ejemplo comn es que un archivo UnityScript necesita hacer referencia a una clase
definida en un archivo de C #. Esto se puede conseguir colocando el archivo # C dentro de
una carpeta Plugins y el archivo UnityScript en una carpeta que no sea especial. Si no lo hace,
obtendr un error que indica la clase de C # no se puede encontrar.

Namespaces
Dado que los proyectos se hacen ms grandes y el nmero de secuencias de comandos
aumenta, la probabilidad de tener enfrentamientos entre los nombres de clases de la escritura
se hace cada vez mayor. Esto es especialmente cierto cuando varios programadores estn
trabajando en diferentes aspectos del juego por separado y finalmente combinar sus
esfuerzos en un proyecto. Por ejemplo, un programador puede escribir el cdigo para
controlar al personaje principal del reproductor, mientras que otro escribe el cdigo
equivalente para el enemigo. Ambos programadores pueden optar por llamar a su clase
principal de la escritura del controlador , pero esto causar un choque cuando se combinan
sus proyectos.
En cierta medida, este problema se puede evitar mediante la adopcin de una convencin de
nombres o por cambiar el nombre de las clases cada vez que se descubre un choque (por
ejemplo, las clases anteriores se podra dar nombres
comoPlayerController y EnemyController ). Sin embargo, esto es problemtico cuando hay
varias clases con chocando nombres o cuando las variables se declaran utilizando esos
nombres - cada mencin del nombre de la clase de edad deben ser sustituidos por el cdigo
para compilar.

El lenguaje C # ofrece una caracterstica llamada espacios de nombres que resuelve este
problema de una manera robusta.Un espacio de nombres es simplemente una coleccin de
clases que se refiere al uso de un prefijo elegido en el nombre de la clase. En el siguiente
ejemplo, las clases Controller1 y Controller2 son miembros de un espacio de nombres
llamado Enemigo : -

namespace Enemy {
public class Controller1 : MonoBehaviour {
...
}
public class Controller2 : MonoBehaviour {
...
}
}
En el cdigo, estas clases se denominan Enemy.Controller1 y Enemy.Controller2 ,
respectivamente. Esto es mejor que cambiar el nombre de las clases en la medida en la
declaracin de espacio de nombres se puede corchetes alrededor de declaraciones de clases
existentes (es decir, no es necesario cambiar los nombres de todas las clases en forma
individual).Adems, puede utilizar varias secciones de espacios de nombres entre corchetes
alrededor de las clases donde quiera que ocurran, incluso si esas clases estn en diferentes
archivos de origen.
Usted puede evitar tener que escribir el prefijo de espacio de nombres en varias ocasiones por
la adicin de un uso de la directiva en la parte superior del archivo.

using Enemy;

Esta lnea indica que cuando los nombres de clase Controller1 y Controller2 se encuentran,
deben tomarse en el sentido deEnemy.Controller1 y Enemy.Controller2 , respectivamente. Si
el guin tambin tiene que hacer referencia a las clases con el mismo nombre de un espacio
de nombres diferentes (uno llamado jugador , dicen), el prefijo todava se puede utilizar. Si dos
espacios de nombres que contienen nombres de las clases en pugna se importan con el uso
de directivas al mismo tiempo, el compilador informar de un error.

Atributos

Attributes son marcadores que pueden ser colocados sobre una clase, propiedad o funcin en
un script indicando un comportamiento especial. Por ejemplo, el
atributo HideInInspector puede ser agregado sobre una declaracin de propiedad para
prevenir que esta propiedad sea mostrada en el inspector, incluso si es pblica. En JavaScript,
el nombre de un atributo comienza con un signo @, mientras que en C# y Boo, est
contenido entre corchetes:-

// JS

@HideInInspector
var strength: float;

// C#

[HideInInspector]
public float strength;

Unity provee un nmero de atributos que son listados en la referencia de script (seleccione la
seccin Editor or Runtime Attributes (Editor Atributos en tiempo de ejecucin) desde el men
emergente en la barra lateral). Hay tambin atributos definidos en las libreras .NET que
pueden en ocasiones ser tiles en el cdigo de Unity.
Nota: el atributo ThreadStatic definido en la librera .NET no debe ser usado ya que ocasiona
un fallo del software (crash) si es agregado a un script de Unity.

Ejecucin de rdenes de Funciones


de eventos
En la Unidad de secuencias de comandos, hay una serie de funciones de eventos que se
ejecutan en un orden predeterminado que se ejecuta un script. Esta orden de ejecucin se
describe a continuacin:

Editor

Reset: Restablecer se llama para inicializar las propiedades de la secuencia de


comandos cuando se une primero al objeto y tambin cuando el restablecimiento se utiliza
comandos.

Primera carga Escena


Estas funciones las llaman cuando una escena comienza (una vez para cada objeto en la
escena).

Awake: Esta funcin siempre se llama antes de cualquier funcin Start y tambin justo
despus se instancia una casa prefabricada. (Si un GameObject estar activa durante la
puesta en marcha despierto No se conoce hasta que se hace activa, o una funcin en

cualquier secuencia de comandos que se le atribuye se llama.)


OnEnable: (slo llamada si el objeto est activo): Esta funcin se llama justo despus
el objeto est habilitada. Esto sucede cuando se crea una instancia de MonoBehaviour, como
cuando se carga un nivel o una GameObject con el componente de secuencia de comandos
se crea una instancia.
Tenga en cuenta que para los objetos aadidos a la escena, las funciones despierto y
OnEnable para todos los scripts sern llamados antes de Inicio, Actualidad, etc son llamados
para ninguno de ellos. Naturalmente, esto no se puede hacer cumplir cuando un objeto se
instancia durante el juego.

Antes de la primera actualizacin del marco

Start: Start se llama antes de la primera actualizacin del marco slo si est habilitada
la instancia guin.
Para los objetos aadidos a la escena, la funcin Start se pidi a todos los scripts antes de
Update, etc son llamados para ninguno de ellos. Naturalmente, esto no se puede hacer
cumplir cuando un objeto se instancia durante el juego.

En entre los marcos

OnApplicationPause: Esto se llama en el final de la trama donde se detecta la pausa,


de manera efectiva entre las actualizaciones de cuadro normal. Una trama adicional ser
emitido despus OnApplicationPause est llamado a permitir que el juego para mostrar
grficos que indican el estado de pausa.

Actualizar Orden
Cuando usted est manteniendo un seguimiento de la lgica del juego y de las interacciones,
las animaciones, posiciones de cmara, etc., hay algunos eventos diferentes que puede
utilizar. El patrn comn es llevar a cabo la mayora de las tareas dentro de la actualizacin
de la funcin, pero tambin hay otras funciones que puede utilizar.

FixedUpdate: FixedUpdate a menudo se llama con ms frecuencia que la


actualizacin . Puede ser llamado varias veces por trama, si la velocidad de fotogramas es
baja y no puede ser llamado entre los marcos en absoluto si la velocidad de fotograma es
alta. Todos los clculos de la fsica y las actualizaciones se producen inmediatamente
despus FixedUpdate .Al aplicar los clculos de movimiento dentro FixedUpdate , no es
necesario multiplicar los valores por Time.deltaTime . Esto es porque FixedUpdate se llama en

un temporizador fiable, independiente de la velocidad de fotogramas.


Update: actualizacin se llama una vez por cuadro. Es la funcin principal caballo de

batalla para actualizaciones de marco.


LateUpdate: LateUpdate se llama una vez por trama, despus de la actualizacin ha
terminado. Todos los clculos que se realizan en la actualizacin se habr completado
cuando LateUpdate comienza. Un uso comn de LateUpdate sera una cmara en tercera
persona siguiente. Si usted hace su personaje se mueva y gire dentro de actualizacin , puede
realizar todos los movimientos de la cmara y los clculos de rotacin en LateUpdate . Esto
asegurar que el personaje se ha movido por completo antes de la cmara sigue su posicin.

Rendering

OnPreCull: Llamado antes de la cmara entresaca la escena. Eliminacin selectiva


determina qu objetos son visibles a la cmara. OnPreCull se llama justo antes de sacrificio se

lleva a cabo.
OnBecameVisible / OnBecameInvisible: Se le llama cuando un objeto se hace

visible / invisible a cualquier cmara.


OnWillRenderObject: Llamado una vez para cada cmara si el objeto es visible.

OnPreRender: Llamado antes de que la cmara comience la representacin de la


escena.
OnRenderObject: Llamado despus de todo renderizado escena regular est
hecho. Puede utilizar la clase GL o Graphics.DrawMeshNow dibujar geometra costumbre en

este punto.
OnPostRender: Llamado despus de un cmara termine de dibujar la escena.

OnRenderImage (Pro): Llamado despus de renderizado escena es completa para


permitir postprocesado de la imagen de la pantalla.
Ongui: Llamado varias veces por trama en respuesta a eventos GUI. El diseo y
volver a pintar los eventos se procesan en primer lugar, seguido de un diseo y evento de

teclado / ratn para cada evento de entrada.


OnDrawGizmos usados para dibujar Gizmos en la vista de escena para fines de
visualizacin.

Corrutinas
Actualizaciones co-rutina normales se ejecutan despus de la funcin de actualizacin
devoluciones. Una co-rutina es una funcin que puede suspender su ejecucin (rendimiento)
hasta que termine el YieldInstruction dadas. Los diferentes usos de corrutinas:

di la co-rutina continuar despus de todas las funciones de actualizacin han sido

llamados en el siguiente fotograma.


WaitForSeconds rendimiento Continuar despus de un tiempo especificado,

despus de todas las funciones de actualizacin han sido llamados para el marco
rendimiento WaitForFixedUpdate Continuar despus de todo FixedUpdate se ha

pedido a todos los guiones


di WWW Continuar despus de una descarga WWW ha completado.

ceder StartCoroutine Cadenas la co-rutina, y esperar a la co-rutina MyFunc para


completar primero.

Cuando se destruye el objeto

OnDestroy: Esta funcin es llamada despus de todas las actualizaciones de marco


para el ltimo fotograma de la existencia del objeto (el objeto fuese destruido en respuesta a
Object.Destroy o en el cierre de una escena).

Cuando Dejar
Estas funciones llaman a ellas todos los objetos activos en la escena,:

OnApplicationQuit: Esta funcin se llama en todos los objetos del juego antes de
salir de la aplicacin. En el editor se llama cuando el usuario deja de modo de

reproduccin. En el reproductor web que se llama cuando la vista web est cerrado.
OnDisable: Esta funcin se llama cuando el comportamiento se vuelve discapacitado
o inactivo.

Guin del ciclo de vida Organigrama


El siguiente diagrama resume el orden y la repeticin de las funciones de eventos durante la
vida de un script.

Entender la Gestin Automtica de Memoria


Cuando un objeto, cadena o array es creado, la memoria requerida para almacenarlo se
asigna desde un pool central llamada la pila. Cuando el tem ya no est ms en uso, la
memoria que una vez ocupaba puede ser recuperada y usada para otras cosas ms. En el
pasado, era responsabilidad del programador el asignar y liberar estos bloques de memoria de
la pila en forma explcita usando las llamadas de funcin apropiadas. Hoy en da, los sistemas
en tiempo de ejecucin como el motor Mono de Unity gestionan la memoria automticamente.
La gestin automtica de memoria requiere menos esfuerzo de escritura de cdigo que
asigne/libera explcitamente, y reduce enormemente la posibilidad de una fuga de memoria
(situacin en donde la memoria es asignada, pero nunca es liberada despus).

Tipos de valor y tipos de referencia


Cuando una funcin es llamada, los valores de sus parmetros son copiados a un rea de la
memoria que es reservada para este llamado en especfico. Los tipos de datos que ocupan
slo unos pocos bytes pueden ser copiados en forma muy rpida y fcil. Sin embargo, es
comn que los objetos, cadenas y arrays sean muy grandes, y sera muy ineficiente si estos
tipos de datos fueran copiados con regularidad. Afortunadamente, esto no es necesario; el
verdadero espacio de almacenamiento para un tem grande es asignado desde la pila y un
pequeo valor de apuntador es usado para recordar su ubicacin. A partir de entonces, slo
el apuntador necesita ser copiado durante el paso de parmetros. Siempre que el sistema en
tiempo de ejecucin pueda localizar el tem identificado por el apuntador, una copia sencilla de
los datos puede ser usada tan a menudo como sea necesario.
Los tipos que son almacenados directamente y copiados durante el paso de parmetros son
llamados tipos de valor (value types). Entre estos estn los integers, floats, booleans y los
tipos de estructuras de Unity (p.ej. Color y Vector3). Los tipos que son asignados en la pila y
luego accesados por medio de un puntero son llamados tipos de referencia (reference types),
dado que el valor almacenado en la variable slo se refiere a los datos reales. Ejemplos de
tipos de referencia son los objetos, las cadenas y los arrays.

Asignacin y Recoleccin de Basura


El gestor de memoria realiza un seguimiento de las reas de la pila que se sepa que no estn
siendo usadas. Cuando un nuevo bloque de memoria es solicitado (digamos, cuando un
objeto es instanciado), el gestor escoge un rea no usada a la que se le asigna el bloque y
luego remueve la asignacin de memoria en el espacio no usado conocido. Solicitudes
posteriores son manejadas del mismo modo hasta que no hayan suficientes reas libres y
grandes para asignar el tamao de bloque solicitado. Es altamente improbable en este punto
que toda la memoria asignada de la pila est todava en uso. Un tem por referencia en la pila

nicamente puede ser accedido en la medida que todava hayan variables por referencia que
puedan localizarlo. Si todas las referencias a un bloque de memoria se han ido (es decir, las
variables por referencia han sido reasignadas, o hay variables locales que estn fuera de
alcance) entonces la memoria que ocupan puede ser reasignada en forma segura.
Para determinar cules bloques de la pila no estn ms en uso, el gestor de memoria busca a
travs de todas las variables por referencia activas y marca los bloques que stas estn
sealando como bloques vivos. Al final de la bsqueda, cualquier espacio entre los bloques
vivos es considerado como vaco por el gestor de memoria y puede ser usado para
posteriores asignaciones. Por motivos obvios, el proceso de localizar y liberar memoria no
usada es conocido como recoleccin de basura (o abreviadamente, GC por Garbage
Collection).

Optimizacin
La recoleccin de basura es automtica e invisible para el programador; pero detrs de
escena, el proceso de recoleccin requiere en realidad de un tiempo de CPU significativo.
Cuando se usa correctamente, la gestin automtica de memoria por lo general igualar o
superar a la asignacin manual en trminos de rendimiento global. Sin embargo, es
importante que el programador evite errores que accionen el recolector ms frecuentemente
de lo que es necesario, a fin de evitar interrupciones en la ejecucin.
Hay algunos algoritmos famosos que son verdaderas pesadillas para el recolector, aunque
parezcan inocentes a primera vista. Un ejemplo clsico es la concatenacin repetida de
cadenas:-

function ConcatExample(intArray: int[]) {


var line = intArray[0].ToString();

for (i = 1; i < intArray.Length; i++) {


line += ", " + intArray[i].ToString();
}

return line;
}

El detalle clave aqu es que los nuevos pedazos no estn siendo agregados uno por uno a la
cadena en el mismo sitio en que est. Lo que realmente ocurre es que cada vez que se repite
el ciclo, el contenido previo de la variable line se marca como muerto, y una nueva cadena
completa es asignada para que contenga el pedazo original ms la nueva parte al final. Dado
que la cadena se vuelve ms larga a medida que el valor de i se incrementa, la suma del
espacio en la pila (tambin conocido como espacio de almacenamiento dinmico) que est
siendo consumido tambin se incrementa, por lo que fcilmente son empleados cientos de
bytes de espacio libre en la pila cada vez que esta funcin es invocada. Si necesitas
concatenar juntas muchas cadenas, una opcin mucho mejor es la
clase System.Text.StringBuilder de la librera de Mono.
Sin embargo, incluso la concatenacin repetida no causar muchos problemas si no es
llamada con frecuencia, y en Unity esto usualmente implica la actualizacin de frames. Algo
como:-

var scoreBoard: GUIText;


var score: int;

function Update() {

var scoreText: String = "Score: " + score.ToString();


scoreBoard.text = scoreText;
}

asignar nuevas cadenas cada vez que Update sea invocado, y generar una filtracin
constante de basura nueva. Gran parte de esto puede ser evitado actualizando el texto slo
cuando el puntaje cambie:-

var scoreBoard: GUIText;


var scoreText: String;
var score: int;
var oldScore: int;

function Update() {
if (score != oldScore) {
scoreText = "Score: " + score.ToString();
scoreBoard.text = scoreText;

oldScore = score;
}
}

Otro problema potencial ocurre cuando una funcin devuelva un valor de array:-

function RandomList(numElements: int) {


var result = new float[numElements];

for (i = 0; i < numElements; i++) {


result[i] = Random.value;
}

return result;
}

Este tipo de funcin es muy elegante y conveniente cuando se crea un nuevo array que es
ocupado con valores. No obstante, si es llamado repetidamente entonces va a ser asignado
un nuevo espacio en la memoria en cada ocasin. Dado que los arrays pueden ser muy
grandes, el espacio libre en la pila puede quedar utilizado rpidamente, resultando en
frecuentes recolecciones de basura. Una forma de evitar este problema es hacer uso del
hecho que un array es un tipo de referencia. Un array pasado a una funcin en forma de un
parmetro puede ser modificado dentro de esta funcin, y el resultado permanecer despus
que la funcin retorne y concluya. Una funcin como la de arriba con frecuencia puede ser
reemplazado con algo como:-

function RandomList(arrayToFill: float[]) {


for (i = 0; i < arrayToFill.Length; i++) {
arrayToFill[i] = Random.value;
}
}

Lo que esto hace es slo reemplazar el contenido existente del array con valores nuevos.
Aunque esto requiere que la asignacin inicial del array sea hecho en el cdigo que invoca a
la funcin (que no pareciera ser tan elegante), esta funcin no generar basura nueva cuando
sea ejecutada.

Solicitar una Recoleccin


Como fue mencionado arriba, es mejor evitar asignaciones tanto como sea posible. Sin
embargo, dado que no pueden ser completamente eliminadas, hay dos estrategias principales
que puedes usar para minimizar su intrusin en la jugabilidad:-

Mantener la pila pequea con recolecciones frecuentes


Esta estrategia es usualmente mejor para juegos que tengan periodos largos de juego en
donde la velocidad de cuadros sea la preocupacin principal. Un juego de este tipo
tpicamente asigna bloques pequeos con frecuencia, pero estos bloques slo estarn en uso
brevemente. El tamao tpico de la pila al usar esta estrategia en iOS es alrededor de los
200KB y la recoleccin de basura tomar unos 5ms en un iPhone 3G. Si la pila se incrementa
a 1MB, la recoleccin tomar unos 7ms. Por tanto, puede ser ventajoso en ocasiones solicitar
una recoleccin de basura a un intervalo de frames regular. Esto por lo general hace que las
recolecciones ocurran ms frecuente de lo que estrictamente necesario, pero sern
procesadas ms rpido y con un efecto mnimo sobre la jugabilidad:-

if (Time.frameCount % 30 == 0)
{
System.GC.Collect]();
}

Sin embargo, debes usar esta tcnica con precaucin y verificar las estadsticas del profiler
para asegurarte que realmente se est reduciendo el tiempo de recoleccin para tu juego.

Dejar grande la pila con recolecciones lentas y poco


frecuentes
Esta estrategia funciona mejor en juegos donde las asignaciones (y por tanto, las
recolecciones) sean relativamente poco frecuentes y puedan ser manejadas cuando hayan
pausas en el ritmo del juego. Es til que la pila sea tan grande como sea posible, pero sin
llegarlo a ser demasiado como para que tu app sea cancelada por el sistema operativo debido
a que est agotando la memoria del sistema. Sin embargo, el sistema en tiempo de ejecucin
de Mono evita en lo posible que el tamao de la pila se expanda. Puedes expandir la pila en
forma manual, pre-asignando un espacio de reserva durante el arranque (es decir, puedes
instanciar un objeto intil que es asignado meramente para efectos del gestor de memoria):-

function Start() {
var tmp = new System.Object[1024];

// make allocations in smaller blocks to avoid them to be


treated in a special way, which is designed for large blocks
for (var i : int = 0; i < 1024; i++)
tmp[i] = new byte[1024];

// release reference
tmp = null;
}

Una pila suficientemente grande no deber quedar completamente llena al estar realizando
una recoleccin durante las pausas en el ritmo del juego. Cuando una pausa ocurre, puedes
solicitar una recoleccin de forma explcita:-

System.GC.Collect();

Una vez ms, debes tener cuidado al usar esta estrategia, y pon atencin a las estadsticas
del profiles en lugar de slo asumir que est teniendo el efecto deseado.

Pools de Objetos Reutilizables


Hay muchos casos donde puedes evitar la produccin de basura con slo reducir el nmero
de objetos que son creados y destruidos. Hay ciertos tipos de objetos en los juegos, tales
como proyectiles, que pueden ser encontrados una y otra vez aunque slo un pequeo
nmero estar siempre en el juego en ese instante. En casos como este, a menudo es posible
reutilizar los objetos en vez de destruir los viejos y reemplazarlos con nuevos.

Ms informacin
La gestin de memoria es un tema sutil y complejo al cual se le ha dedicado una gran
cantidad de esfuerzo acadmico. Si ests interesado en aprender ms sobre esto, la
pgina memorymanagement.org es un excelente recurso que agrupa muchas publicaciones y
artculos en lnea. Ms informacin sobre pooling de objetos puede ser encontrada en esta
pgina de Wikipedia y tambin en Sourcemaking.com.

Plataforma Compilacin Dependiente

Unidad incluye una caracterstica llamada "Plataforma Compilacin Dependiente". Esto


consiste en algunas directivas de preprocesador que le permiten particionar sus scripts para
compilar y ejecutar una seccin de cdigo exclusivo para una de las plataformas soportadas.
Adems, puede ejecutar el cdigo en el Editor, para que pueda compilar el cdigo
especficamente para su mvil / consola y probarlo en el Editor!

Plataforma Define
La plataforma define que la Unidad apoya para sus guiones son:

Propiedad:

Funcin:

UNITY_EDITOR

Definir guiones para llamar la Unidad Editor de su cdigo del


juego.

UNITY_EDITOR_WIN

Plataforma para definir cdigo editor en Windows.

UNITY_EDITOR_OSX

Plataforma para definir cdigo editor en Mac OSX.

UNITY_STANDALONE_OSX

Plataforma definir para compilar / ejecutar cdigo


especficamente para Mac OS (Esto incluye universal, PPC y
arquitecturas Intel).

UNITY_DASHBOARD_WIDGE

Plataforma definir al crear cdigo para widgets para el

Dashboard de Mac OS.

UNITY_STANDALONE_WIN

Utilice esta opcin cuando desee compilar / ejecutar cdigo


para Windows aplicaciones independientes.

UNITY_STANDALONE_LINUX

Utilice esta opcin cuando desee compilar / ejecutar cdigo


para Linux aplicaciones independientes.

UNITY_STANDALONE

Utilice esta opcin para compilar / ejecutar cdigo para


cualquier plataforma independiente (Mac, Windows o Linux).

Propiedad:

Funcin:

UNITY_WEBPLAYER

Plataforma para definir el contenido reproductor web (esto


incluye Windows y Mac ejecutables jugador Web).

UNITY_WII

Plataforma definir para compilar / ejecutar cdigo para la


consola Wii.

UNITY_IPHONE

Plataforma definir para compilar / ejecutar cdigo para la


plataforma iPhone.

UNITY_ANDROID

Plataforma definir para la plataforma Android.

UNITY_PS3

Plataforma definir para el funcionamiento de PlayStation 3


Cdigo.

UNITY_XBOX360

Plataforma definir para la ejecucin de cdigo de Xbox 360.

UNITY_FLASH

Plataforma definir al compilar cdigo para Adobe Flash.

UNITY_BLACKBERRY

Plataforma definir para un dispositivo BlackBerry10.

UNITY_WP8

Plataforma definir para Windows Phone 8.

UNITY_METRO

Plataforma definir para Windows Store Apps


(adems NETFX_CORE se define cuando se compila
archivos de C # .NET contra Core).

UNITY_WINRT

Equivalente a UNITY_WP8 | UNITY_METRO

Tambin usted puede compilar el cdigo de forma selectiva en funcin de la versin del motor
que se est trabajando. Actualmente los tipos soportados los son:

UNITY_2_6

Plataforma para definir la versin principal de la Unidad 2.6.

UNITY_2_6_1

Plataforma para definir versin especfica 2.6.1.

UNITY_3_0

Plataforma para definir la versin principal de la Unidad 3.0.

UNITY_3_0_0

Plataforma para definir versin especfica 3.0.0.

UNITY_3_1

Plataforma para definir la versin principal de la Unidad 3.1.

UNITY_3_2

Plataforma para definir la versin principal de la Unidad 3.2.

UNITY_3_3

Plataforma para definir la versin principal de la Unidad 3.3.

UNITY_3_4

Plataforma para definir la versin principal de la Unidad 3.4.

UNITY_3_5

Plataforma para definir la versin principal de la Unidad 3.5.

UNITY_4_0

Plataforma para definir la versin principal de la Unidad 4.0.

UNITY_4_0_1

Plataforma para definir versin especfica 4.0.1.

UNITY_4_1

Plataforma para definir la versin principal de la Unidad 4.1.

UNITY_4_2

Plataforma para definir la versin principal de la Unidad 4.2.

UNITY_4_3

Plataforma para definir la versin principal de la Unidad 4.3.

UNITY_4_5

Plataforma para definir la versin principal de la Unidad 4.5.

Nota: Para las versiones 2.6.0 No hay plataforma define ya que esta caracterstica se
introdujo por primera vez en esa versin.

Prueba de cdigo precompilado.


Vamos a mostrar un pequeo ejemplo de cmo utilizar el cdigo precompilado. Esto
simplemente va a imprimir un mensaje que depende de la plataforma que ha seleccionado
para construir su destino.
En primer lugar, seleccione la plataforma que desea probar su cdigo contra haciendo clic
en Archivo -> Configuracin de creacin . Esto traer la ventana de configuracin de
generacin para seleccionar la plataforma de destino.

Const
ruir ventana Configuracin con el WebPlayer Seleccionado como Plataforma de
destino.

Seleccione la plataforma que desea probar su cdigo precompilado en contra y pulse


el interruptor Editor botn para decirle la Unidad de la plataforma que est apuntando.
Crear una secuencia de comandos y copiar / pegar este cdigo: -

// JS
function Awake() {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif

#if UNITY_IPHONE
Debug.Log("Iphone");
#endif

#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif

#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}

// C#
using UnityEngine;
using System.Collections;

public class PlatformDefines : MonoBehaviour {


void Start () {

#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif

#if UNITY_IPHONE
Debug.Log("Iphone");
#endif

#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif

#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif

}
}

// Boo
import UnityEngine

class PlatformDefines (MonoBehaviour):

def Start ():


ifdef UNITY_EDITOR:
Debug.Log("Unity Editor")

ifdef UNITY_IPHONE:
Debug.Log("IPhone")

ifdef UNITY_STANDALONE_OSX:
Debug.Log("Stand Alone OSX")

ifdef not UNITY_IPHONE:


Debug.Log("not an iPhone")

Luego, dependiendo de la plataforma que ha seleccionado, uno de los mensajes sern


impresos en la consola de la Unidad cuando usted presiona el juego.
Tenga en cuenta que en C # puede utilizar un CONDICIONAL atributo que es un menor de
forma ms limpia y propenso a errores de despojar a cabo funciones,
consulte http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90 ) .aspx .
Adems de la base #if directiva de compilador, tambin puede utilizar una prueba de mltiples
vas en C # y JavaScript: -

#if UNITY_EDITOR
Debug.Log("Unity Editor");

#elif UNITY_IPHONE
Debug.Log("Unity iPhone");

#else
Debug.Log("Any other platform");

#endif

Sin embargo, Boo actualmente slo admite el ifdef Directiva.

Plataforma personalizada Define


Tambin es posible aadir a la seleccin integrada de define mediante el suministro de su
cuenta. En Otros ajustes de panel de los Ajustes del reproductor , ver la Scripting Definir
Smbolos de texto.

Aqu, puede introducir los nombres de los smbolos que desea definir para que plataforma en
particular, separados por punto y coma. Estos smbolos se pueden utilizar como las
condiciones para #if directivas iguales a las incorporadas.

Global personalizada Define

Puede definir sus propias directivas de preprocesador para controlar qu cdigo se incluye al
compilar. Para ello se debe agregar un archivo de texto con las directrices adicionales para la
"Activos /" carpeta. El nombre del archivo depende del idioma que est utilizando, y la
extensin es .rsp:

C#

<Ruta de proyecto> /Assets/smcs.rsp

C # - Scripts Editor

<Ruta de proyecto> /Assets/gmcs.rsp

UnityScript

<Ruta de proyecto> /Assets/us.rsp

Abucheo

<Ruta de proyecto> /Assets/boo.rsp

A modo de ejemplo, si incluye la lnea nica " -definir: UNITY_DEBUG "en


su smcs.rsp archivo el definir UNITY_DEBUG existir como un global de definir para los scripts
de C #, con excepcin de los scripts Editor.
Cada vez que haga cambios a .rsp archivos que tendr que recompilar para que sean
efectivos. Usted puede hacer esto mediante la actualizacin o reimportacin de un nico guin
(.js, .cs o .boo) archivo.
Si desea modificar slo define globales, debe utilizar Scripting Definir
Smbolos en Configuracin del reproductor , ya que esto cubrir todos los compiladores. Si
usted elige los archivos .RSP lugar, usted tendr que proporcionar un archivo para cada
compilador utiliza la Unidad, y que no se sabe cuando se utiliza uno u otro compilador.
El uso de los archivos de .RSP se describe en la seccin de ayuda de la CML aplicacin que
se incluye en la carpeta de instalacin Editor. Puede obtener ms informacin ejecutando
" SMC -help ". Adems, tenga en cuenta el archivo .rsp debe coincidir con el compilador se
invoca. Por ejemplo, cuando la orientacin del reproductor web, las SMC se utiliza con
smcs.rsp; cuando la orientacin de los reproductores de sobremesa,GMC se utiliza con
gmcs.rsp; cuando la orientacin MS compilador, csc se utiliza con csc.rsp; etctera.

Funciones genricas

Algunas funciones en la referencia de la escritura (por ejemplo, las diversas funciones


getComponent) se enumeran con una variante que tiene una letra T o un nombre de tipo entre
parntesis angulares despus del nombre de la funcin: -

funcin

funcname <. T > () : T ;

Estos se conocen como funciones genricas. La importancia que tienen para scripting es que
se llega a especificar los tipos de parmetros y / o el tipo de retorno cuando se llama a la
funcin. En JavaScript, esto se puede utilizar para moverse por las limitaciones de tipado
dinmico: -

// El tipo se infiere correctamente ya que se define en la


llamada a la funcin.
var obj = getComponent. < Rigidbody > ();

En C #, se puede ahorrar una gran cantidad de pulsaciones de teclado y yesos: -

Rigidbody rb = go.GetComponent < Rigidbody > ();

// ... En comparacin con: -

Rb Rigidbody = (Rigidbody) go.GetComponent (typeof (Rigidbody));

Cualquier funcin que tiene una variante genrica que aparece en su pgina de referencia
guin permitir esta sintaxis llamado especial.

Serializacin Guin
La serializacin de "cosas" es la esencia misma de la Unidad. Muchos de nuestros rasgos
conforman ontop del sistema de serializacin:

Ventana Inspector. La ventana de inspeccin no habla con el C # api de averiguar lo que


los valores de las propiedades de lo que est inspeccionando es. Solicita al objeto a serializar en
s, y luego muestra los datos serializados.

Prefabricados. Internamente, una casa prefabricada es el flujo de datos en serie de uno (o


ms) objetos y componentes del juego. Un ejemplo prefabricada es una lista de modificaciones que
deben hacerse en los datos serializados para esta instancia. El concepto prefabricado en realidad
slo existe en el momento de editor. Las modificaciones prefabricadas quedan al horno en una
corriente de serializacin normal cuando la unidad realiza una construccin, y cuando eso se
instanciado, los gameobjects instanciados no tienen idea de que eran una prefabricada cuando
vivan en el editor.

Instanciacin. Cuando llame Instantiate () a cada una prefabricada, o una


GameObject que vive en el lugar, o en cualquier otra cosa para esa materia (todo lo que se deriva
de UnityEngine.Object puede ser serializado), que serializar el objeto, a continuacin, crear un
nuevo objeto , y luego "Deserialize" los datos en el nuevo objeto. (Nosotros entonces corremos el
mismo cdigo de serializacin de nuevo en una variante diferente, donde la utilizamos para
informar que otros UnityEngine.Objects se estn referenciados. entonces comprobamos para
todos los que se hace referencia UnityEngine.Objects , si forman parte de los datos que
se crea una instancia () . Si la referencia est apuntando a algo "externo" (como una

textura) mantenemos esa referencia como es, si est apuntando a algo "interno" (como un
GameObject nio), que parcheamos la referencia a la copia correspondiente).

Ahorro. Si abre un .unity archivo de escena con un editor de texto, y ha configurado la


unidad de "forzar la serializacin de texto", corremos el serializador con un backend yaml.

Cargando. Puede no parecer sorprendente, pero la carga compatible es un sistema que se


construye en la parte superior de la serializacin tambin. En-editor yaml carga utiliza el sistema de
serializacin, sino tambin la carga de tiempo de ejecucin de escenas, los activos y assetbundles
utiliza el sistema de serializacin.

Recarga caliente de cdigo de editor. Cuando se cambia un script editor, que serializar
todas las ventanas (que se derivan deUnityEngine.Object !). entonces nos destruimos todas
las ventanas. descargamos el viejo cdigo C #, cargamos el nuevo cdigo C #, recreamos las
ventanas, y luego nos deserializar los flujos de datos de las ventanas de nuevo en las nuevas
ventanas.

Resource.GarbageCollectSharedAssets () . Este es nuestro recolector de basura


nativo. Es una cosa diferente que el recolector de basura c #.Es lo que nos encontramos despus
de cargar una escena, para averiguar qu cosas de la escena anterior ya no son referenciados,
para que podamos descargarlos. El recolector de basura nativa corre el serializador en una
variacin en los que lo utilizan para tener objetos informan todas las referencias a
externos UnityEngine.Objects . Esto es lo que hace que las texturas que fueron utilizados por
scene1, quedan descargadas al cargar scene2.

El sistema de serializacin est escrito en C ++. Lo usamos para todos nuestros tipos de
objetos internos. (Texturas, AnimationClip, cmara, etc). La serializacin ocurre
al UnityEngine.Object nivel. Cada UnityEngine.Object siempre se serializa como un
todo. Pueden contener referencias a otras UnityEngine.Objects , y esas referencias
obtener serializado correctamente.
Ahora usted dira que nada de esto muy mucho que las preocupaciones, no eres ms que feliz
de que funciona y quieren seguir con realidad la creacin de algn contenido.
En caso de que se referir a usted es que usamos esta misma serializador para
serializar MonoBehaviour componentes, que estn respaldados por los scripts. Debido a los
requisitos de rendimiento muy alto que el serializador tiene, no en todos los casos se
comportan exactamente igual que lo ac # desarrollador podra esperar de un serializador. En
esta parte de la documentacin que vamos a describir cmo funciona el serializador, y algunas
de las mejores prcticas sobre cmo hacer mejor uso de ella.

Cmo es un campo de mi escritura tiene que ser con el fin


de ser serializado?

ser pblica , o tiene [SerializeField] atributo

no ser esttica

no ser const

no sea de slo lectura

la FieldType necesita ser de un tipo que se puede serializar.

Qu fieldtypes podemos serializar?

personalizados clases no abstractas con [Serializable] atributo.

estructuras personalizadas con [Serializable] atributo. (Aadido en Unity 4.5)

referencias a los objetos que se derivan de UnityEngine.Object

tipos de datos primitivos ( int , float , doble , bool , cuerdas , etc.)

matriz de un FieldType podemos serializar

List <T> de un FieldType podemos serializar

Cules son esas situaciones en las que el serializador se comporta de manera diferente
de lo que yo esperaba?

Clases personalizadas comportan como estructuras


[Serializable]
class Animal
{
public string name;
}

class MyScript : MonoBehaviour


{

public Animal[] animals;


}

Si rellena la matriz animales con tres referencias a un objeto nico animal, en el


serializationStream, se encuentran 3 objetos. cuando se deserializa, ahora hay tres objetos
diferentes. Si usted necesita para serializar un objeto grfico complejo con referencias, no se
puede confiar en serializador de Unity haciendo que todo automgicamente para usted, y
tener que hacer un trabajo para conseguir que el grfico de objeto serializado a ti mismo. Vea
el siguiente ejemplo sobre cmo serializar cosas Unidad no serializa por s mismo.
Tenga en cuenta que esto slo es cierto para clases personalizadas, ya que son serializado
"en lnea", porque sus datos se convierte en parte de la serializationdata completa para el
MonoBehaviour se utilizan en. Cuando usted tiene los campos que tienen una referencia a
algo que es unUnityEngine. Objeto clase derivada, como un myCamera Cmara
pblico , los datos de esa cmara no estn en lnea en serie, y una referencia real a la
cmara UnityEngine.Object es serializada.

No hay soporte para nulo para clases personalizadas


Examen sorpresa. Cuntas asignaciones se hacen al deserializar un MonoBehaviour que
utiliza este script:

class Test : MonoBehaviour


{
public Trouble t;
}

[Serializable]

class Trouble
{
public Trouble t1;
public Trouble t2;
public Trouble t3;
}

No sera extrao esperar 1 asignacin. La del objeto de prueba. Tampoco sera extrao
esperar 2 asignaciones. Uno para el objeto de la prueba, una para un objeto Trouble. La
respuesta correcta es 729. El serializador no admite nulos. Si se serializa un objeto y un
campo es nulo, slo una instancia de un nuevo objeto de ese tipo, y que
serializar. Obviamente, esto podra conducir a un ciclo infinito, as que tenemos un lmite de
profundidad relativamente mgico de 7 niveles. En ese momento dejamos de serializacin de
campos que tienen tipos de encargo clases / estructuras y las listas y matrices.
Dado que muchos de nuestros subsistemas construyen en la parte superior del sistema de
serializacin, esta inesperadamente grande serializationStream para el monobehaviour prueba
har que todos estos subsistemas para llevar a cabo ms lentamente de lo necesario. Cuando
investigamos los problemas de rendimiento en proyectos de clientes, casi siempre nos
encontramos este problema. Hemos aadido una advertencia para esta situacin en la Unidad
4.5.

No hay soporte para el polimorfismo


si usted tiene un pblico de los animales [] animales y se pone en una instancia
de un perro, un gato y una jirafa, despus de la serializacin, tendr tres instancias de los
Animales.
Una manera de hacer frente a esta limitacin es darse cuenta de que slo se aplica a las
"clases personalizadas", que obtienen en lnea en serie.mencin de
otros UnityEngine.Objects obtener serializados como referencias reales, y para aquellos

polimorfismo Cmo funciona realmente.Seras un ScriptableObject clase derivada u


otra MonoBehaviour clase derivada, y la referencia que. La desventaja de esto es que usted
necesita para almacenar esa monobehaviour u objeto de secuencias de comandos en alguna
parte, y no se puede serializar en lnea muy bien.
La razn de estas limitaciones es que uno de los fundamentos bsicos del sistema de
serializacin es que el diseo del flujo de datos de un objeto se conoce de antemano, y
depende de los tipos de los campos de la clase, en lugar de lo que pasa a ser almacenado en
el interior de los campos.

Quiero serializar algo que serializador de Unity no soporta. Qu debo hacer?


En muchos casos el mejor enfoque es utilizar devoluciones de llamada de
serializacin. Permiten que se le notifique antes de que el serializador lee los datos de sus
campos y despus de que se hace escribiendo para ellos. Usted puede usar esto para tener
una representacin diferente de sus datos difciles de serialize en tiempo de ejecucin que
cuando realmente serializar. Usted tendra que utilizar stos para transformar sus datos en
algo Unidad entiende justo antes de la unidad quiere serializarlo, y lo utiliza para transformar
la forma de serie de nuevo en la forma que les gusta tener sus datos en tiempo de ejecucin
despus de la unidad ha escrito los datos a sus campos.
Digamos que usted desea tener una estructura de datos de rbol. Si deja que la Unidad
serializar directamente la estructura de datos, el "no hay soporte para null" limitacin causara
su flujo de datos a ser muy grande, lo que lleva a degratations rendimiento en muchos
sistemas:

using UnityEngine;
using System.Collections.Generic;
using System;

public class VerySlowBehaviourDoNotDoThis : MonoBehaviour


{

[Serializable]
public class Node
{
public string interestingValue = "value";

//The field below is what makes the serialization data


become huge because
//it introduces a 'class cycle'.
public List<Node> children = new List<Node>();
}

//this gets serialized


public Node root = new Node();

void OnGUI()
{
Display (root);
}

void Display(Node node)


{
GUILayout.Label ("Value: ");
node.interestingValue =
GUILayout.TextField(node.interestingValue,
GUILayout.Width(200));

GUILayout.BeginHorizontal ();
GUILayout.Space (20);
GUILayout.BeginVertical ();

foreach (var child in node.children)


Display (child);
if (GUILayout.Button ("Add child"))
node.children.Add (new Node ());

GUILayout.EndVertical ();
GUILayout.EndHorizontal ();

}
}

En su lugar, le dices a la Unidad no serializar el rbol directamente, y haces un campo


separado para almacenar el rbol en un formato serializado, adecuado para serializador
de la unidad:
:

using UnityEngine;
using System.Collections.Generic;
using System;

public class BehaviourWithTree : MonoBehaviour,


ISerializationCallbackReceiver
{
//node class that is used at runtime
public class Node
{
public string interestingValue = "value";
public List<Node> children = new List<Node>();
}

//node class that we will use for serialization


[Serializable]
public struct SerializableNode
{
public string interestingValue;
public int childCount;
public int indexOfFirstChild;
}

//the root of what we use at runtime. not serialized.


Node root = new Node();

//the field we give unity to serialize.


public List<SerializableNode> serializedNodes;

public void OnBeforeSerialize()


{

//unity is about to read the serializedNodes field's


contents. lets make sure
//we write out the correct data into that field "just in
time".
serializedNodes.Clear();
AddNodeToSerializedNodes(root);
}

void AddNodeToSerializedNodes(Node n)
{
var serializedNode = new SerializableNode () {
interestingValue = n.interestingValue,
childCount = n.children.Count,
indexOfFirstChild = serializedNodes.Count+1
};
serializedNodes.Add (serializedNode);
foreach (var child in n.children)
AddNodeToSerializedNodes (child);
}

public void OnAfterDeserialize()


{
//Unity has just written new data into the
serializedNodes field.

values.

//let's populate our actual runtime data with those new

if (serializedNodes.Count > 0)
root = ReadNodeFromSerializedNodes (0);
else
root = new Node ();
}

Node ReadNodeFromSerializedNodes(int index)


{
var serializedNode = serializedNodes [index];
var children = new List<Node> ();
for(int i=0; i!= serializedNode.childCount; i++)

children.Add(ReadNodeFromSerializedNodes(serializedNode.indexOfF
irstChild + i));

return new Node() {


interestingValue = serializedNode.interestingValue,
children = children
};
}

void OnGUI()
{
Display (root);
}

void Display(Node node)


{
GUILayout.Label ("Value: ");

node.interestingValue =
GUILayout.TextField(node.interestingValue,
GUILayout.Width(200));

GUILayout.BeginHorizontal ();
GUILayout.Space (20);
GUILayout.BeginVertical ();

foreach (var child in node.children)


Display (child);
if (GUILayout.Button ("Add child"))
node.children.Add (new Node ());

GUILayout.EndVertical ();
GUILayout.EndHorizontal ();
}
}

Ten en cuenta que el serializador, incluyendo estas devoluciones de llamada procedentes


del serializador generalmente no sucede en el hilo principal, por lo que est muy limitado
en lo que puede hacer en cuanto a la invocacin de la API de la Unidad. Usted sin

embargo a las transformaciones de los datos necesarios pueden hacer llegar sus datos a
partir de un formato no-unidad serializador-amigable a una unidad-serializador-friendlyformato.

UnityEvents
UnityEvents son una forma de permitir devolucin de llamada impulsada por los usuarios que
se mantuvo desde el tiempo de edicin de tiempo de ejecucin sin necesidad de
programacin adicional y la configuracin de la escritura.
UnityEvents son tiles para una serie de cosas:

Contenido impulsado devoluciones de llamada

Sistemas de desacople

Callbacks Persistentes

Eventos de llamada preconfigurados

UnityEvents se pueden agregar a cualquier MonoBehavior y se ejecutan de cdigo como un


delegado .net estndar. Cuando se aade un UnityEvent a un MonoBehaviour aparece en el
inspector y devoluciones de llamada persistentes se puede aadir.
Utilizando UnityEvents

Para configurar una devolucin de llamada en el editor hay algunos pasos a seguir:
1.

Seleccione el icono + para aadir una ranura para una devolucin de llamada

2.

Seleccione el UnityEngine.Object desea recibir la devolucin de llamada (Puede utilizar el


selector de objetos para esto)

3.

Seleccione la funcin que desea llamar

4.

Usted puede agregar ms de una devolucin de llamada para el evento

Al configurar un UnityEvent en el inspector de que hay dos tipos de llamadas a funciones que
son compatibles:

Esttico

Dinmica

Llamadas estticas son llamadas preconfigurados, con valores preconfigurados que se


establecen en la interfaz de usuario. Esto significa que cuando se invoca la devolucin de
llamada, la funcin objetivo se invoca con el argumento de que se ha entrado en la interfaz de
usuario.
Llamadas dinmicas se invocan utilizando un argumento que se enva desde el cdigo, y esto
est ligado al tipo de UnityEvent que se est invocando. La interfaz de usuario filtra las

devoluciones de llamada y slo se muestran las llamadas dinmicas que son vlidos para el
UnityEvent.
UnityEvents genricos

Por defecto, un UnityEvent en un Monobehaviour une dinmicamente a una funcin void. Esto
no tiene por qu ser el caso como invocacin dinmica de UnityEvents soporta la unin a
funciones con hasta 4 argumentos. Para ello es necesario definir una clase personalizada
UnityEvent que soporta mltiples argumentos. Esto es bastante fcil de hacer:

[Serializable]

pblica clase

StringEvent : UnityEvent <string> {}

Mediante la adicin de una instancia de esta clase a su vez de la base UnityEvent que
permitir la devolucin de llamada para unirse de forma dinmica a las funciones de cadena.
Esto puede ser invocada por llamar a la funcin de invocacin con una 'cadena' como
argumento.
UnityEvents pueden definirse con hasta 4 argumentos en su definicin genrica.

Herramientas de Scripting
Esta seccin cubre las herramientas en el Editor de Unity o proporcionadas con Unity que le
ayudarn a desarrollar sus scripts.

Consola
Haciendo doble click en un error en la barra de estado o eligiendo Window->Console se
mostrar la Console.

Consola
en el editor.
La Consola muestra mensajes, advertencias, errores o salidas de depuracin del juego.
Puedes definir el envo de tus propios mensajes a la consola
usando Debug.Log(), Debug.LogWarning, o Debug.LogError(). Puedes hacer doble click en
cualquier mensaje para ir al script que est causando el mensaje. Adems de esto tambin
tienes varias opciones en la barra de herramientas de la consola.

Los controles
de la barra de herramientas en la Consola permiten filtrar las salidas de tu depuracin.

Presionando Clear se borrarn todos los mensajes que actualmente estn en la Consola.

Cuando la opcin Collapse est habilitada, los mensajes idnticos solo se mostrarn una
vez.

Cuando la opcin Clear on play est habilitada, todos los mensajes sern removidos de la
consola cada vez que entres en el modo de juego.

Cuando la opcin Error Pause est habilitada, Debug.LogError() causar una pausa en el
juego, pero Debug.Log() no la causar.

Presionando Open Player Log abrir el Player Log en un editor de texto (o usando la
aplicacin de Consola en Mac si est establecida como aplicacin por defecto para archivos .log).

Presionando Open Editor Log abrir el Editor Log en un editor de texto (o usando la
aplicacin de Consola en Mac si est establecida como aplicacin por defecto para archivos .log).

MonoDevelop
MonoDevelop es el entorno de desarrollo integrado (IDE) que se suministra con la unidad. Un
IDE combina el funcionamiento familiar de un editor de texto con caractersticas adicionales
para la depuracin y otras tareas de gestin de proyectos. El editor de texto no se cubrir

aqu, ya que es bastante intuitivo, pero la integracin del editor y depurador con Unity se
describen a continuacin.

Configuracin de MonoDevelop
MonoDevelop se instala por defecto con Unity, aunque existe la opcin de excluirla de la
instalacin en Windows. Debe comprobar que MonoDevelop se establece como el editor de
script externo en el Preferencias (men: Unity> Preferencias y seleccione el panel
Herramientas externa). Con esta opcin activada, Unidad lanzar MonoDevelop y utilizarlo
como el editor por defecto para todos los archivos de script.

Configuracin del Depurador


Para habilitar la depuracin del nivel de fuente de MonoDevelop (ver detalles ms abajo) debe
comprobar en primer lugar que la Colocacin Editoropcin est activada en las Preferencias
de la herramienta externa panel. Entonces, usted debe sincronizar el proyecto Unity con el
proyecto MonoDevelop (men: Activos> Sinc MonoDevelop Proyecto). Adems, asegrese de
que la versin de desarrollo y depuracin de scripts opciones estn activadas en la
configuracin de generacin de la plataforma de destino (men: Archivo> Configuracin de
creacin). Si usted est construyendo una WebPlayer entonces usted debe comprobar,
adems, que el ajuste del canal versin de desarrollo est habilitado en el men contextual del
jugador en el navegador (clic derecho en Windows o cmd-clic en Mac OSX).

Habilitar la depuracin en el
WebPlayer
Justo antes de comenzar una sesin de depuracin, seleccione Ejecutar> Asociar al proceso
en el men en MonoDevelop y luego seleccione la aplicacin Unity de la lista de procesos que
aparece. Con estos pasos completados, ya est listo para ser la depuracin de secuencias de
comandos de Unity.

Depuracin Nivel Fuente


Los archivos de cdigo fuente abiertos actualmente se muestran como pestaas en
MonoDevelop y pueden ser editados all con las caractersticas de un editor de texto

estndar. Sin embargo, tambin hay un gris barra de punto de interrupcin a la izquierda del
panel editor. Al hacer clic en esta barra se sumar el llamado punto de interrupcin marcador
junto a la lnea de cdigo.

Brea
kpoint que se aade al cdigo en la lnea 16
Aadiendo un punto de ruptura a una lnea instruye a la Unidad para detener la ejecucin del
script justo antes de que llegue esa lnea durante el modo de reproduccin. Cuando el script
se "congela" como esto, puede utilizar el depurador para determinar exactamente lo que el
guin est haciendo.

La
ejecucin flecha indica una pausa en el punto de ruptura
Informacin sobre el estado de ejecucin se muestra en las pestaas en la parte inferior de la
ventana MonoDevelop cuando la ejecucin se detuvo en un punto de interrupcin. Tal vez el
ms importante de ellos es el lugareos ficha.

Tab
mostrando valores de las variables
Esto muestra los valores de las variables locales en la funcin que se est ejecutando
actualmente. (Una variable pseudo-local llamado "esto" est disponible automticamente en
todas las funciones sin ser definido explcitamente, sino que es una referencia a la instancia
del script actual y lo que todas las variables definidas en el script se puede acceder a travs
de "esto".) Puede utilizar puntos de corte en combinacin con el lugareosficha para obtener
un efecto similar a agregar impresin declaraciones de su cdigo - se puede interrogar a los
valores de las variables en cualquier momento que desee. Sin embargo, tambin puede editar
los valores de las variables en el lugareos ficha. Esto puede ser til cuando usted encuentra
una variable mal configurado y que le gustara ver si el problema desaparece cuando el valor
se establece como debe ser.
Una caracterstica til adicional de MonoDevelop es ejecucin paso a paso . Cuando la
ejecucin se detuvo en un punto de interrupcin, una barra de herramientas de depuracin
estar disponible en la parte superior de la ventana MonoDevelop: -

Herramientas MonoDevelop pisar


Los cuatro primeros botones se conocen como Continuar , Paso a paso por , paso en y Step
Out y tambin se puede acceder como comandos en el men Ejecutar (el botn ms a la
derecha, Separar , se puede utilizar si desea finalizar la sesin de
depuracin). Continuar hojas de vida ejecucin hasta que se encontr con el siguiente punto
de parada. Paso a paso por y paso en tanto ejecutar una lnea de cdigo a la vez. La
diferencia entre los dos es que Step Over ejecuta cualquier llamadas a funciones dentro de la
lnea a la vez, mientras que Step In permite la ejecucin paso a paso para continuar en la
funcin. Puesto que es comn utilizar Paso En accidentalmente en una funcin que se sabe
que es correcta, Step Out contina la ejecucin hasta el final de la funcin actual y luego se
detiene de nuevo en el cdigo que originalmente llam.

Una descripcin detallada de las tcnicas de depuracin de nivel de fuente no es apropiado en


este caso, pero hay varios libros y recursos web que ofrecen la sabidura sobre el
tema. Adems, un poco de experimentacin le ayudar a tener una idea de la potencia de la
tcnica y la forma en que se puede utilizar para rastrear a los tipos ms comunes de errores.

Profiler (Pro)
La Unidad Profiler ayuda a optimizar su juego. En ella se informa de cunto tiempo se dedica
en las distintas reas de su juego. Por ejemplo, puede reportar el porcentaje de tiempo
dedicado a la prestacin, la animacin o en su lgica del juego.
Usted puede jugar a tu juego en el Editor de perfiles en, y registrar los datos de
rendimiento. La ventana de perfiles a continuacin, muestra los datos en una lnea de tiempo,
as que usted puede ver los cuadros o las reas que Spike (toman ms tiempo) que otros. Al
hacer clic en cualquier parte de la lnea de tiempo, la seccin inferior de la ventana de perfiles
mostrar informacin detallada para el marco seleccionado.
Tenga en cuenta que el perfil tiene que instrumento el cdigo. Esta instrumentacin tiene un
pequeo impacto en el rendimiento de su juego.Tpicamente esta sobrecarga es lo
suficientemente pequea para no afectar la tasa de fotogramas juego. Cuando el uso de
perfiles es tpico de considerar slo la proporcin (o porcentaje) de tiempo invertido en
determinadas zonas. Tambin, para mejorar el enfoque de rendimiento en esas partes del
juego que consumen la mayor parte del tiempo. Comparacin de perfiles de los resultados
antes y despus de los cambios de cdigo y determinar las mejoras que se pueden medir. A
veces los cambios realizados para mejorar el rendimiento que podra tener un efecto negativo
sobre la velocidad de cuadro; se debe esperar consecuencias inesperadas de la optimizacin
del cdigo.

Vase tambin

Optimizacin del rendimiento de grficos pgina.

Webplayer
Para perfiles WebPlayer, siga estos pasos:
1.

Compruebe la versin de desarrollo casilla en el dilogo configuracin de generacin de la


Unidad y tambin abrir la ventana de perfiles antes de comenzar la construccin.

2.

Cuando el juego se ejecuta en el WebPlayer, asegrese de que el Canal de lanzamiento se


establece en el Desarrollo . Alt + clic derecho sobre el reproductor web para abrir el men de
seleccin de canal de liberacin.

3.

Seleccione OSXWebPlayer (YourComputerName) o WindowsWebPlayer


(YourComputerName) en su caso de de la ventana Profiler Profiler Activo men desplegable.

iOS
Perfiles remoto se puede habilitar en dispositivos iOS siguiendo estos pasos:
1.

Conecte el dispositivo iOS a tu red WiFi (red WiFi local / adhoc es utilizado por perfilador
para enviar datos de perfiles de dispositivo para el Editor de la Unidad).

2.

Marque la casilla "Autoconnect Profiler" en el dilogo de configuracin de generacin de la


Unidad.

3.

Conecte el dispositivo a su Mac a travs de cable y pulsa "Construir y Ejecutar" en la


Unidad Editor.

4.

Cuando la aplicacin se lanza el dispositivo de ventana de perfiles abiertos en la Unidad


Editor (Ventana-> Profiler).

Si est utilizando un servidor de seguridad, es necesario asegurarse de que los puertos desde
54.998 hasta 55.511 estn abiertos en las reglas de salida del firewall - estos son los puertos
utilizados por la Unidad para el perfil remoto.
Nota: A veces Unidad Editor podra no autoconectarse al dispositivo. En tales casos, la
conexin de perfiles podra iniciarse desde Profiler ventanaactiva Profiler men desplegable
seleccione el dispositivo apropiado.

Androide
Perfiles remoto se puede activar en los dispositivos Android a travs de dos caminos
diferentes: WiFi o ADB .
Para perfiles de Wi-Fi, siga estos pasos:
1.

Asegrese de desactivar datos mviles en su dispositivo Android.

2.

Conecte su dispositivo Android a una red WiFi.

3.

Marque la casilla "Autoconnect Profiler" en el dilogo de configuracin de generacin de la


Unidad.

4.

Conecte el dispositivo a su Mac / PC a travs del cable y pulsa "Construir y Ejecutar" en la


Unidad Editor.

5.

Cuando la aplicacin se inicia en el dispositivo, abra la ventana de perfiles en la Unidad


Editor (Ventana-> Profiler)

6.

Si el Editor de la Unidad no autoconectarse al dispositivo, seleccione el dispositivo


apropiado de la Ventana Profiler Profiler

activa el men desplegable. Nota: El dispositivo

Android y el ordenador principal (que se ejecuta el Editor de la Unidad) debe tanto estar en la
misma subredpara la deteccin de dispositivos a trabajar.

Para perfiles ADB, siga estos pasos:

Conecte el dispositivo a su Mac / PC a travs del cable y asegrese BAD reconoce el


dispositivo (es decir, se nota en dispositivos adb lista).

Marque la casilla "Construir Desarrollo" en el dilogo de configuracin de generacin de la


Unidad, y pulsa "Build & Run".

Cuando la aplicacin se inicia en el dispositivo, abra la ventana de perfiles en la Unidad


Editor (Ventana-> Profiler)
Seleccione el AndroidProfiler (ADB@127.0.0.1: 54.999) del Profiler Ventana Profiler

activa el men desplegable. Nota: El editor de Unity crear automticamente un tnel adb para su
aplicacin al pulsar "Build & Run". Si desea perfilar otra aplicacin o reiniciar el servidor adb es
necesario configurar este tnel manualmente. Para ello, abra un smbolo ventana Terminal / CMD y
entrar ADB adelante tcp: 54999 localabstract: identificador del paquete
Unityinsert aqu

Nota: La entrada en el men desplegable slo es visible cuando el objetivo seleccionado es


Android.
Si est utilizando un servidor de seguridad, es necesario asegurarse de que los puertos desde
54.998 hasta 55.511 estn abiertos en las reglas de salida del firewall - estos son los puertos
utilizados por la Unidad para el perfil remoto.

Archivos de registro
Puede haber ocasiones durante el desarrollo cuando se necesita para obtener informacin de
los registros de la WebPlayer que se ha construido, su reproductor independiente, el
dispositivo de destino o el editor. Por lo general, usted necesita ver a estos archivos cuando
usted ha experimentado un problema y usted tiene que saber exactamente dnde se produjo
el problema.
En Mac los registros Webplayer, jugador y editor se puede acceder de manera uniforme a
travs de la norma Console.app utilidad.
En Windows los registros Webplayer y editor se colocan en carpetas que no se muestran en el
Explorador de Windows por defecto. Vea abajo.

Editor
El registro de editor puede ser llevado a travs del Abra el Editor de registro botn en la
ventana de la consola de la Unidad.

Mac OS X

~ / Library / Logs / Unidad / Editor.log

Windows XP

C: \ Documents and Settings \ nombre de usuario \


Configuracin local \ data_ \ Unidad \ Editor \ Editor.log

Windows

C: \ Users \ nombre de usuario \ AppData \ Local \ Unidad \

Vista / 7

Editor \ Editor.log

En Windows, el archivo de registro Editor se almacena en la carpeta de datos de aplicacin


local: % LOCALAPPDATA% \ Unidad \ Editor \ Editor.log, donde LOCALAPPDATA se define
por CSIDL_LOCAL_APPDATA .
En Mac todos los registros se puede acceder de manera uniforme a travs de la
norma Console.app utilidad.

Webplayer

Mac OS X

~ / Library / Logs / Unidad / WebPlayer.log

Windows XP

C: \ Documents and Settings \ nombre de usuario \


Configuracin local \ Temp \ UnityWebPlayer \ log \
log_UNIQUEID.txt

Windows Vista /

C: \ Users \ nombre de usuario \ AppData \ Local \ Temp

\ UnityWebPlayer \ log \ log_UNIQUEID.txt

Windows Vista /

C: \ Users \ nombre de usuario \ AppData \ Local \ Temp

7 + IE7 + UAC

\ Low \ UnityWebPlayer \ log \ log_UNIQUEID.txt

En Windows el registro WebPlayer se almacena en una carpeta temporal: % TEMP% \


UnityWebPlayer \ log \ log_UNIQUEID.txt, donde TEMP se define por GetTempPath .

Jugador

Mac OS

~ / Library / Logs / Unidad / Player.log

Ventanas

_EXECNAME_Data_ \ Output_log.txt

Linux

~ / .config / Unity3D / NombreCompaa / ProductName /


Player.log

En Windows, EXECNAME_Data es una carpeta junto al ejecutable con su juego.


Tenga en cuenta que en tiendas propias de Windows y Linux la ubicacin del archivo de
registro se puede cambiar (o iniciar sesin suprimida.) Ver la lnea de comandos de la pgina
para ms detalles.

iOS
El registro de dispositivo se puede acceder en XCode travs de la consola GDB o la Consola
Organizador. Este ltimo es til para obtener CrashLogs cuando su aplicacin no se ejecuta a
travs del depurador XCode.
Por favor, vea la depuracin de aplicaciones en la Gua de iOS Desarrollo. Tambin
nuestra Solucin de problemas y Bugreporting guas pueden ser tiles para usted.

Androide
El registro de dispositivo se puede ver a travs de la consola Logcat . Utilice el adb aplicacin
que se encuentra en Android directorio / plataforma de herramientas de SDK con un
trailing Logcat parmetro:
$ Logcat adb
Otra forma de inspeccionar el LogCat es usar el Dalvik Debug Monitor Server (DDMS) . DDMS
se puede iniciar desde Eclipse o desde el interior de los Android SDK / herramientas . DDMS
tambin proporciona un nmero de otras herramientas de depuracin relacionados.

Zarzamora
El Blackberry, el registro est disponible en la configuracin del reproductor (Men: Edicin>
Ajustes del proyecto> Reproductor ). Selecciona la pestaa plataforma Blackberry y entre los
ajustes de publicacin, usted encontrar una Obtn Entrar botn. Al hacer clic en este botn
obtendr el ltimo registro del dispositivo y mostrarlo usando el editor de texto por defecto del
sistema.
Tenga en cuenta que el registro slo registra los detalles para el proyecto Unity ms
recientemente funcionar, por lo que tendr que guardar copias de los registros de usted mismo
si desea realizar un seguimiento de los detalles sobre varias carreras.

Acceso a los archivos de registro en Windows


En Windows los archivos de registro se almacenan en lugares que estn ocultos por
defecto. En Windows XP, puede hacer que las carpetas ocultas visibles en el Explorador de
Windows utilizando el Herramientas-> Opciones de carpeta ... -> Ver (tab) .
En Windows Vista / 7 puede hacer que la carpeta AppData visible en el Explorador de
Windows utilizando Opciones Herramientas-> carpeta ... -> Ver (tab) . El men Herramientas
est oculto por defecto, pero se puede visualizar pulsando la tecla Alt una vez.

EventSystem
El EventSystem es una forma de enviar eventos a los objetos de la aplicacin basada en la entrada, ya
sea el teclado, el ratn, el tacto, o entrada personalizada. El EventSystem consta de unos pocos
componentes que trabajan juntos para enviar eventos.

Visin de conjunto
Cuando se agrega un componente EventSystem a un GameObject te dars cuenta de que no tiene mucha
funcionalidad expuesta, esto se debe a la propia EventSystem est diseado como un gestor y facilitador
de la comunicacin entre los mdulos EventSystem.
Las funciones principales de la EventSystem son los siguientes:

Gestione la que se considera seleccionado GameObject


Gestione que InputModule est en uso
Administrar Raycasting (si es necesario)
Actualizacin de todos InputModules segn sea necesario

Mdulos de entradas
Un mdulo de entrada es donde la lgica principal de cmo desea que el EventSystem comportarse
vidas, que se utilizan para

Entrada de Manejo
La gestin de estado de evento
Envo de eventos a objetos de la escena.
Slo una InputModule puede ser activo en el EventSystem a la vez, y deben ser componentes en la
misma GameObject como el componente EventSystem.
Si desea escribir un mdulo de entrada personalizado, se recomienda que usted enve eventos apoyados
por componentes de interfaz de usuario existente en la Unidad, pero tambin son capaces de extender y
escribir sus propios eventos que se detallan en la documentacin del sistema de mensajera.

Raycasters
Raycasters se utilizan para el envo de averiguar lo que el puntero est sobre, es comn para
InputModules para utilizar las Raycasters configurados en la escena para calcular lo que el dispositivo de
sealizacin ha terminado.
Hay 3 Raycasters siempre que la marca de forma predeterminada:

GraphicRaycaster - Se utiliza para los elementos de la interfaz de usuario


2DPhysicsRaycaster - Se utiliza para los elementos de fsica 2D
3DPhysicsRaycaster - Se utiliza para los elementos de fsica 3D
Si usted tiene un raycaster 3d / 2d configurado en su escena es fcilmente posible tener elementos de
interfaz de usuario que no reciben mensajes del InputModule. Simplemente conecte un script que
implementa una de las interfaces de eventos.

Sistema de mensajera
El nuevo sistema de interfaz de usuario utiliza un sistema de mensajera diseado para
sustituir SendMessage. El sistema es pura C # y tiene por objeto abordar algunos de los
problemas actuales con SendMessage. El sistema funciona mediante interfaces
personalizadas que se pueden implementar en un MonoBehaviour para indicar que el
componente es capaz de recibir una devolucin de llamada desde el sistema de
mensajera.Cuando se realiza la llamada se especifica un GameObject objetivo; la
convocatoria se publicar en todos los componentes de la GameObject que implementan la
interfaz especificado que el llamado es a ser emitida en su contra. El sistema de mensajera
permite que los datos de usuario personalizadas que se pasan, as como en qu medida a
travs de la jerarqua GameObject el evento debe propagar; es decir en caso de que slo hay
que ejecutar para el GameObject especificado, o debe tambin ejecutar en los nios y los
padres. Adems de esto, el marco de mensajera proporciona funciones de ayuda para buscar
y encontrar GameObjects que implementan una interfaz de mensajera dado.
El sistema de mensajera es genrico y diseado para el uso no slo por el sistema de interfaz
de usuario, sino tambin por cdigo de juego general. Es relativamente trivial para aadir

eventos de mensajera personalizada y que funcionar con el mismo marco que el sistema
utiliza la interfaz de usuario para todo el manejo de eventos.

Cmo definir un mensaje personalizado?


Si desea definir un mensaje personalizado que es relativamente sencillo. En el espacio de
nombres UnityEngine.EventSystems hay una interfaz de base llamada
'IEventSystemHandler'. Cualquier cosa que se extiende desde esto puede ser considerado
como un objetivo para la recepcin de eventos a travs del sistema de mensajera.

public interface ICustomMessageTarget : IEventSystemHandler


{
// functions that can be called via the messaging system
void Message1();
void Message2();
}

Una vez que esta interfaz se define entonces puede ser implementado por un
MonoBehaviour. Cuando se implementa que define las funciones que se ejecutarn si el
mensaje dado se emiti en contra de esta MonoBehaviours GameObject..

public class CustomMessageTarget : MonoBehaviour,


ICustomMessageTarget
{
public void Message1()

{
Debug.Log ("Message 1 received");
}

public void Message2()


{
Debug.Log ("Message 2 received");
}
}

Ahora que existe un script que puede recibir el mensaje que tenemos que emitir el
mensaje. Normalmente esto sera en respuesta a algn evento de acoplamiento flexible que
se produce. Por ejemplo, en el sistema de interfaz de usuario que emitimos eventos para
cosas tales como PointerEnter y PointerExit, as como una variedad de otras cosas que
pueden suceder en respuesta a la entrada del usuario en la aplicacin.
Para enviar un mensaje existe una clase auxiliar esttica para hacer esto. Como argumentos
que requiere un objeto de destino para el mensaje, algunos datos especficos del usuario, y un
funtor que asigna a la funcin especfica en la interfaz de mensaje que desea orientar la
campaa.

ExecuteEvents.Execute<ICustomMessageTarget>(target, null,
(x,y)=>x.Message1());

Este cdigo se ejecutar la funcin Message1 en cualquiera de los componentes en el


objetivo GameObject que implementan la interfaz ICustomMessageTarget. La
documentacin de secuencias de comandos para la clase ExecuteEvents abarca otras
formas de las funciones de ejecutar, como ejecutor en nios o en los padres.
InputModules
Un mdulo de entrada es donde la lgica principal de un sistema de eventos se puede
configurar y personalizar. Fuera de la caja hay dos InputModules previstos, uno diseado para
Independiente, y uno diseado para la entrada tctil. Cada mdulo recibe y distribuye eventos
como era de esperar en la configuracin dada.
Los mdulos de entrada son donde la "lgica de negocio" de la EventSystem tenga
lugar. Cuando el EventSystem est activado se ve en lo que InputModules se adjuntan y pasa
actualizacin manipulacin para el mdulo especfico.
Los mdulos de entrada estn diseados para ser ampliado o modificado basado en los
sistemas de entrada que desea apoyar. Su objetivo es mapear hardware de entrada especfico
(como el tacto, joystick, ratn, controlador de movimiento) en los eventos que se envan a
travs del sistema de mensajera.
El construido en mdulos de entrada estn diseados para soportar configuraciones de juego
comunes, tales como la entrada tctil, entrada del controlador, la entrada de teclado y ratn de
entrada. Envan una variedad de eventos a los controles en la aplicacin, si implementa las
interfaces especficas en sus MonoBehaviours. Todos los componentes de interfaz de usuario
implementan las interfaces que tienen sentido para el componente dado.

Eventos compatibles
El EventSystem apoya una serie de eventos, y se puede personalizar an ms en
InputModules escritos de usuario personalizadas usuario.
Los eventos que son apoyadas por la StandaloneInputModule y TouchInputModule son
proporcionados por la interfaz y se pueden implementar en un MonoBehaviour implementando
la interfaz. Si usted tiene un EventSystem vlido configurado los eventos sern llamados en el
momento correcto.

IPointerEnterHandler - OnPointerEnter - Se llama cuando un puntero entra en el objeto

IPointerExitHandler - OnPointerExit - Se llama cuando un puntero sale del objeto

IPointerDownHandler - OnPointerDown - Se llama cuando se presiona un puntero sobre el


objeto

IPointerUpHandler - OnPointerUp - Se llama cuando se libera un puntero (llamado en el


original la pieza inyectada)

IPointerClickHandler - OnPointerClick - Se llama cuando se presiona un puntero y puesto


en libertad en el mismo objeto

IInitializePotentialDragHandler - OnInitializePotentialDrag - Llamado cuando se encuentra


un destino de arrastre, se puede utilizar para inicializar valores

IBeginDragHandler - OnBeginDrag - Llamado en el objeto de arrastrar al arrastrar est por


comenzar

IDragHandler - ondrag - Llamado en el objeto arrastre cuando un lastre est sucediendo

IEndDragHandler - OnEndDrag - Llamado en el objeto arrastre cuando un lastre para


acabados

IDropHandler - OnDrop - Llamado en el objeto donde termina un lastre

IScrollHandler - OnScroll - Llamado cuando una se desplaza la rueda del ratn

IUpdateSelectedHandler - OnUpdateSelected - Llamado del objeto seleccionado cada tic

ISelectHandler - onSelect - Se llama cuando el objeto se convierte en el objeto


seleccionado

IDeselectHandler - OnDeselect - Llamado en el objeto seleccionado queda deseleccionado

IMoveHandler - OnMove - Se llama cuando se produce un evento de movimiento


(izquierda, derecha, arriba, abajo, ect)

ISubmitHandler - OnSubmit - Se llama cuando se presiona el botn de envo

ICancelHandler - OnCancel - Se llama cuando se presiona el botn de cancelacin

Raycasters
El EventSystem necesita un mtodo para detectar donde los eventos de entrada de corriente
deben ser enviados a, y esto es proporcionado por los Raycasters. Dada una posicin espacio
en la pantalla van a cobrar todos los objetivos potenciales, averiguar si estn bajo la posicin
dada, y luego devolver el objeto que est ms cerca de la pantalla. Hay unos cuantos tipos de
Raycasters que se proporcionan:

GraphicRaycaster - Se utiliza para los elementos de la interfaz de usuario, vive en una lona
y bsquedas dentro del lienzo

Physics2DRaycaster - Se utiliza para los elementos de fsica 2D

PhysicsRaycaster - Se utiliza para los elementos de fsica 3D

Cuando un raycaster est presente y activado en la escena que ser utilizado por el
EventSystem cada vez que se emite una consulta de un InputModule.
Si varios Raycasters se utilizan entonces todos tendrn fundicin suceda a ellos ya los
resultados se ordenan en funcin de la distancia a los elementos.

Evento Administrador del sistema

Este subsistema se encarga de controlar todos los dems elementos que conforman el
concurso completo. Coordina InputModule que est activo actualmente, que GameObject est
actualmente considerado 'seleccionado', y una serie de otros conceptos EventSystem de alto
nivel.
Cada "actualizacin" del EventSystem recibe la llamada y se ve a travs de l de
InputModules y se da cuenta de que es el InputModule que se debe utilizar para esta
garrapata y luego los delegados del procesamiento de los mdulos.

Propiedades

Property:

Function:

Script

Raycaster Grfico
El raycaster grfico se utiliza para raycast contra un lienzo. El raycaster mira a todos los
grficos en el lienzo y determina si alguno de ellos se han visto afectados.
El raycaster grfico se puede configurar para ignorar caras ocultas de grficos, as como ser
bloqueada por objetos 2D o 3D que existen en frente de ella. Una prioridad manual tambin se
puede aplicar si desea que el procesamiento de este elemento que se vio obligado a la parte
delantera o trasera de la Raycasting.

Propiedades

Property:

Function:

Script

Fsica 2D raycaster
Los raycasts raycaster 2D 2D contra objetos en la escena. Esto permite que los mensajes
sean enviados a los objetos 2D fsica que implementan interfaces de eventos.

Propiedades

Propiedad:

Funcin:

Script

Fsica raycaster
Los raycasts raycaster contra objetos 3D en la escena. Esto permite que los mensajes sean
enviados a los objetos de la fsica 3D que implementan interfaces de eventos.

Propiedades

Propiedad:

Funcin:

Script

Mdulo de entrada independiente


El mdulo est diseado para funcionar como se puede esperar de un controlador / ratn que
funcione. Eventos para pulsar un botn, arrastre y similares son enviados en respuesta a la
entrada.
El mdulo enva eventos de puntero a componentes como dispositivo de ratn / entrada se
mueve alrededor, y utiliza el configurado en los Raycasters escena para calcular qu elemento
actualmente est sealado por un dispositivo de puntero dado.
El mdulo enva mover eventos y enviar / cancelar eventos en respuesta a la entrada de un
seguimiento a travs del gestor de entrada, esto funciona tanto para el teclado y el controlador
de entrada. El eje y las claves de orugas se pueden configurar en el inspector del mdulo.

Propiedades
Propiedad:
script

Funcin:

Propiedad:

Funcin:

Detalles
El Modulo EE.UU.:

Vertical / Horizontal eje para el teclado y el controlador de navegacin

Presentar / botn Cancelar para enviar presentar y cancelar eventos

Tiene un tiempo de espera entre los eventos slo para permitir que un nmero mximo de
eventos de un segundo.

El flujo para el mdulo es el siguiente

Enva un evento Mover al objeto seleccionado si se introduce un eje vlido desde el gestor
de entrada

Enviar el enviar o cancelar eventos al objeto seleccionado si se pulsa un botn de envo o


cancelar

Procesar entrada del Ratn


Si se trata de una nueva prensa
Enviar evento PointerEnter (enviado a cada objeto en la jerarqua que

puede manejarlo)

Enviar evento PointerPress

Almacenar en cach el manejador de arrastrar (primer elemento de la


jerarqua que puede manejarlo)

Enviar evento beginDrag al manejador de arrastre

Ajuste el objeto "Presionado" como Seleccionado en el sistema de eventos

Si esta es una prensa continua

Movment del Proceso

Enviar DragEvent al manejador de arrastre en cach

Manejar eventos PointerEnter y PointerExit si toque mueve entre objetos

Si esta es una versin

Enviar evento PointerUp al objeto que recibi el PointerPress

Si el objeto libracin actual es el mismo que el objeto PointerPress enviar


un evento PointerClick

Enva un evento gota si haba un controlador en cach arrastre

Enva un evento EndDrag a teh manejador de arrastrar en cach

Eventos de rueda de desplazamiento Proceso

Toque mdulo de entrada


Este mdulo est diseado para trabajar con dispositivos tctiles. Enva eventos de puntero
para tocar y arrastrar en respuesta a la entrada del usuario. El mdulo soporta multitouch.
El mdulo utiliza los Raycasters escena configurado para calcular qu elemento est siendo
tocado en la actualidad ms. Un raycast se emite para cada toque actual.

Propiedades
Propiedad:

Funcin:

Script

Detalles
El flujo para el mdulo es la siguiente:

Para cada evento tctil


Si se trata de una nueva prensa
Enviar evento PointerEnter (enviado a cada objeto en la jerarqua que

puede manejarlo)

Enviar evento PointerPress

Almacenar en cach el manejador de arrastrar (primer elemento de la


jerarqua que puede manejarlo)

Enviar evento beginDrag al manejador de arrastre

Ajuste el objeto "Presionado" como Seleccionado en el sistema de eventos

Si esta es una prensa continua

Movment del Proceso

Enviar DragEvent al manejador de arrastre en cach

Manejar eventos PointerEnter y PointerExit si toque mueve entre objetos

Si esta es una versin

Enviar evento PointerUp al objeto que recibi el PointerPress

Si el objeto libracin actual es el mismo que el objeto PointerPress enviar


un evento PointerClick

Enva un evento gota si haba un controlador en cach arrastre

Enva un evento EndDrag a teh manejador de arrastrar en cach

You might also like