Vii 10 Unityscript

También podría gustarte

Está en la página 1de 29

VIDEOJUEGOS 2

Scripting con C# en Unity


V2 Scripting con C# en Unity

Puntos a tratar
Scripting con C#
Eventos de entrada
Patrones en Unity
Gestin de eventos
Invocacin con retardo
Corrutinas
Adaptacin a dispositivos mviles

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 2


V2 Scripting con C# en Unity

Creacin de scripts
Se crean como assets de tipo script

Podemos editarlos con la herramienta integrada MonoDevelop

La herramienta a utilizar se puede configurar en Preferences >


External Tools

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 3


V2 Scripting con C# en Unity

Aadir un script a un objeto


Una vez creado un script, podemos aadirlo como componente a
un Game Object

Tras esto, lo veremos en la lista de componentes del Game Object

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 4


V2 Scripting con C# en Unity

Estructura de un script
La estructura bsica de un script C# de Unity es
public class EsferaScript : MonoBehaviour
{
void Start () {
Todos los scripts heredan
}
de MonoBehaviour
void Update () {

}
}

Start() nos permite inicializar el nodo


Awake() se ejecuta justo antes (til para dependencias)
Update() actualiza el nodo (su frecuencia depende del framerate)
LateUpdate() se ejecuta justo despus (para dependencias)

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 5


V2 Scripting con C# en Unity

Ciclo del juego


El elemento principal de la arquitectura del motor es el ciclo del
juego
Dibuja los objetos de la escena actual
Actualiza los objetos de la escena actual
En Unity actualizamos
cada objeto en Update()
Slo se dibujar y se actualizar la escena actualmente activa

Delta time
Nos indica el tiempo transcurrido desde la iteracin anterior
Lo utilizaremos para actualizar la escena adecuadamente
posicion = posicion + velocidad * Time.deltaTime; Accedemos con
Time.deltaTime

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 6


V2 Scripting con C# en Unity

Acceso a las propiedades el objeto


Desde el cdigo del script se accede a propiedades del Game
Object al que pertenece
Podemos acceder a los componentes con GetComponent()
Si el objeto no dispone del componente correspondiente, este
mtodo devolver null

Transform Transformacin del nodo en la escena


Renderer Permite cambiar el material del objeto
AudioSource Acceso al componente Audio Source
Camera Permite configurar la cmara
Light Permite configurar una fuente de luz Inicializa el nodo
en una posicin
void Start () {
GetComponent<Transform>().position = new Vector3(0,0,5);
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 7


V2 Scripting con C# en Unity

Interfaz del script


Podemos definir variables globales en el script

public Vector3 posicionInicial;

void Start () {
GetComponent<Transform>().position = posicionInicial;
}

Estas variables aparecen como parmetros en el entorno


Hacen el script reutilizable

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 8


V2 Scripting con C# en Unity

Polimorfismo en Unity
Si creamos una variable cuyo tipo corresponde a un componente,
podremos asignar a ella cualquier Game Object que incorpore
dicho componente

Por ejemplo, creamos una variable pblica target de tipo Transform

public Transform target;

Podremos asignar a ella cualquier Game Object con un componente


Transform

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 9


V2 Scripting con C# en Unity

Acceso a los componentes


Nuestros propios scripts sern considerados tambin
componentes, al igual que los que incorpora el motor
Podemos acceder a ellos con GetComponent(TipoComponente)
Transform t; OtroScript s;
t = GetComponent<Transform>(); s = GetComponent<OtroScript>();

Equivalente a utilizar la variable Nuestros scripts son


implcita transform considerados componentes
Atributos @script
Permiten definir cmo se utilizar el script en el entorno
[RequireComponent(typeof(OtroScript))] Obliga a aadir OtroScript al objeto

[AddComponentMenu("Controladores/Cubo")]

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 10


V2 Scripting con C# en Unity

Buscar objetos
Los objetos tienen nombre y etiqueta
Propiedades name y tag

Podemos realizar bsquedas de objetos


Bsqueda por nombre
GameObject techo = GameObject.Find("Techo");

Bsqueda por etiqueta

GameObject enemigo = GameObject.FindWithTag("Enemigo");

GameObject [] enemigos = GameObject.FindGameObjectsWithTag("Enemigo");


foreach(GameObject enemigo in enemigos) {

}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 11


V2 Scripting con C# en Unity

Creacin y destruccin de objetos


Podemos instanciar un nuevo objeto
Se instancia mediante la clonacin del objeto proporcionado
til para la creacin de proyectiles
proyectil podra ser una
Proyectil clone = Instantiate(proyectil) as Proyectil; variable pblica a la que
Proyectil clone = Instantiate(proyectil, posicion,
hemos asignado un prefab
Quaternion.identity) as Proyectil; desde el entorno

Destruccin de objetos
El objeto se destruye y se elimina de la escena
Destroy(gameObject);

Destroy(proyectil, 5);
Destruye transcurridos
los segundos indicados
Destroy(this);

Puede aplicarte a cualquier tipo de objetos (Game Objects,


componentes, etc)

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 12


V2 Scripting con C# en Unity

Eventos de entrada (I)


El objeto Input nos permite acceder a la
entrada
Est preparado para entrada en dispositivos
mviles
En Input Manager definimos controles virtuales
Se accede mediante Edit > Project Settings >
Input
Cada control tiene una tecla por defecto
El usuario podr configurarlo

if(Input.GetButton("Fire1")) {
// Disparar!
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 13


V2 Scripting con C# en Unity

Eventos de entrada (II)


Podemos leer un eje y actualizar la posicin del personaje
void Update () {
float delta = Input.GetAxis("Horizontal") * Time.deltaTime;
GetComponent<Transform>().Translate(new Vector3(0,delta,0));
}

Posicin del ratn


Input.mousePosition

Botones del ratn


Input.GetMouseButton(0 | 1 | 2)

Teclado
Input.GetKey(KeyCode.LeftArrow)

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 14


V2 Scripting con C# en Unity

Controlador de la escena
Cada estado se representa mediante una escena en Unity
Una prctica habitual consiste en tener un script controlador

El controlador se encarga de
Coordinar distintos elementos de la escena
Gestionar marcadores y otros datos del juego
Gestionar el estado dentro de la escena

Posibles objetos en los que definir este controlador general son


Un game object vaco especfico para l
La cmara principal de la escena

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 15


V2 Scripting con C# en Unity

Comunicacin entre componentes


Ser necesario comunicar controlador y objetos de la escena
El controlador puede tener variables que apunten a los objetos
Comunicacin controlador objeto
Basta con que el controlador llame a un mtodo del objeto
Comunicacin objeto controlador
El objeto no debera necesitar una variable apuntando al controlador
Utilizaremos callbacks
Mover()

Player
MonedaEncontrada()
Game
Controller
PublicarMonedas()
Marcador

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 16


V2 Scripting con C# en Unity

Callbacks y patrn delegado


Para implementar callbacks en C# utilizamos patrn delegado
Un componente delega en otro para realizar una determinada tarea
El segundo componente no es conocido a priori por el primero

Al definir un delegado creamos un nuevo tipo de datos


El tipo de datos representa un tipo de funcin
Podemos declarar una variable de ese tipo, y asignarle una funcin
public delegate void MonedaRecogida(int valor);
public MonedaRecogida onMonedaRecogida; Player

player.onMonedaRecogida = IncrementaMonedas;

void IncrementaMonedas(int valor) { Controller


monedas += valor;
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 17


V2 Scripting con C# en Unity

Gestin de estado con delegados


Normalmente segn el estado cambia la forma de actualizar
Conviene evitar el uso de bloques switch
Es ms limpio utilizar un delegado
public delegate void ActualizaEscena();
public ActualizaEscena actualizaEscena;

void Start () {
actualizaEscena = ActualizaEscenaPatrulla;
}
void Update () {
if(actualizaEscena != null) {
actualizaEscena();
}
}
void ActualizaEscenaPatrulla () {
ActualizaPosicionRuta();
if(LocalizaPlayer()) { actualizaEscena = ActualizaEscenaPersecucion;
}
void ActualizaEscenaPersecucion () {
PersiguePlayer();
if(!LocalizaPlayer()) { actualizaEscena = ActualizaEscenaPatrulla;
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 18


V2 Scripting con C# en Unity

Sistema de eventos
Una variable de tipo evento nos permite tener varios delegados
til para enviar mensajes a todos los objetos interesados
Crea una estructura menos acoplada
Cualquier objeto puede registrarse como oyente del evento

public class EventManager : MonoBehaviour { void OnEnable() {


EventManager.OnGameOver += Detener;
public delegate void GameOver(); }
public static event GameOver OnGameOver;
void OnDisable() {
public static void SetGameOver() { EventManager.OnGameOver -= Detener;
if(OnGameOver != null) { }
OnGameOver();
} void Detener() {
}
} }

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 19


V2 Scripting con C# en Unity

Patrn singleton
Podemos implementar el patrn singleton con variables estticas

public class SocialManager : MonoBehaviour {


public static SocialManager manager;

void Awake () {
if(manager == null) { Hace que el objeto
DontDestroyOnLoad(gameObject); se mantenga al
manager = this;
} else if(manager != this) {
cambiar de escena
Destroy(gameObject);
}
}
}

Utilizar DontDestroyOnLoad() es til para


Datos globales del juego (estadsticas y datos de la partida)
Elementos de transicin entre escenas

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 20


V2 Scripting con C# en Unity

Invocacin con retardo


Podemos programar la ejecucin de un mtodo con retardo
Invoke("DisparaProyectil",2);

Podemos hacer que se ejecute de forma cclica


InvokeRepeating("DisparaProyectil", 2, 2);

Podemos comprobar si hay programada una ejecucin


if(IsInvoking("DisparaProyectil")) { }

Cancelar todas las ejecuciones pendientes en la clase


CancelInvoke();

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 21


V2 Scripting con C# en Unity

Corrutinas
Las corrutinas nos permiten ejecutar cdigo durante varios ciclos
Debemos indicar en qu momento esperamos al siguiente ciclo
IEnumerator DisparaProyectilCoroutine() {
while(true) {
DisparaProyectil(); Seguir
yield return new WaitForSeconds(2.0f); ejecutndose
} dentro de 2
}
segundos

Lanzamos la corrutina con


StartCoroutine(DisparaProyectilCoroutine());

StartCoroutine("DisparaProyectilCoroutine");

Podemos detenerla con


StopAllCoroutines();

StopCoroutine("DisparaProyectilCoroutine");

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 22


V2 Scripting con C# en Unity

Otras opciones de bloqueo de corrutinas


Podemos hacer que continue en el siguiente ciclo
IEnumerator MueveCoroutine() {
float tiempo = 0;
while(tiempo < 1) {
GetComponent<Transform>().position = Vector3.Lerp(posicionInicial,
target.position, tiempo);
tiempo += Time.deltaTime;
yield return null;
}
GetComponent<Transform>().position = target.position;
}

Tambin podemos bloquear hasta que termine otra corrutina


yield return MueveCoroutine();

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 23


V2 Scripting con C# en Unity

Dispositivos mviles
Unity permite desplegar el juego en
plataformas mviles

Deberemos adaptar la interfaz a estos


dispositivos

Detectamos el tipo de dispositivo utilizado

if (Application.platform == RuntimePlatform.Android ||
Application.platform == RuntimePlatform.IPhonePlayer ||
Application.platform == RuntimePlatform.BB10Player ||
Application.platform == RuntimePlatform.WP8Player) {
// Activar controles tctiles
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 24


V2 Scripting con C# en Unity

Entrada de usuario en mviles


Podemos aadir entrada de la pantalla tctil y acelermetro

Input.acceleration Aceleracin en (x,y,z)

Input.touches Lista de contactos en la pantalla

Podemos recorrer la lista de contactos


Comprobar su estado
Leer sus coordenadas
foreach (Touch touch in Input.touches) {
if (touch.phase != TouchPhase.Began) {
Vector2 pos = touch.position;
}
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 25


V2 Scripting con C# en Unity

Controles en pantalla
Importamos el paquete Standard Assets (Mobile)
Aadimos el prefab Dual Joysticks a la escena
Se trata de objetos GUITexture vinculados a un script (tipo Joystick)
Definiremos una variable de entrada Joystick en el script de
nuestro personaje
Joystick moveJoystick;

Vinculamos uno de los joysticks con dicha variable

Leemos la entrada de l al actualizar la escena


void Update () {
float delta = moveJoystick.position.y * Time.deltaTime;
GetComponent<Transform>().Translate(new Vector3(0,delta,0));
}

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 26


V2 Scripting con C# en Unity

Desplegar en mvil
Abrimos la pantalla Build Settings
File > Build Settings

Seleccionamos la plataforma y
pulsamos Switch Platform

Aadimos las escenas que


queramos desplegar en el cuadro
superior

Pulsamos Build para generar el


Necesitaremos abrir el proyecto
proyecto en el entorno correspondiente
(Xcode, Eclipse, )

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 27


V2 Scripting con C# en Unity

Unity Remote
La aplicacin Unity Remote nos permite
probar en mviles va streaming de forma
cmoda
Podemos descargarla de forma gratuita en
cualquier plataforma
El mvil deber estar en la misma red que el
ordenador con Unity

Cargamos la aplicacin Unity Remote en el


mvil
Detectar los ordenadores con Unity activo
Seleccionamos el ordenador al que conectar
En ese ordenador pulsamos Play para
reproducir el juego en el mvil

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 28


V2 Scripting con C# en Unity

Preguntas...?

Videojuegos II 2014-2015 Depto. Ciencia de la Computacin e IA Scripting 29

También podría gustarte