SlideShare una empresa de Scribd logo
Creación de juegos móviles 
multiplataforma en Unity 
Miguel Ángel Taramón Gómez
Sobre mi 
 Ingeniero Técnico 
de Informática de 
Sistemas por la 
Universidad 
Politécnica de 
Madrid 
 Ganador concurso 
internacional 
Wiideojuegos 2010 
 Socio fundador de 
Cupra Studios en 
2011 
 Profesor del Máster 
en Diseño y 
Desarrollo de 
Videojuegos 
PlayStation First 
desde 2012 
miguelangel@cuprastudios.com 
@miguelitoCupra
Índice del Workshop 
Introducción a Unity 
Conceptos & workflow 
Scripting básico 
Prototipo de videojuego
Capítulo 1 
Introducción a 
Unity
¿Qué es Unity? 
Motor de juegos 
Sistema creado para ayudar a hacer 
videojuegos de una forma rápida y sencilla. 
Editor visual 
Permite ver cambios en tiempo real. Muy 
interactivo. 
Arquitectura basada en componentes 
Permite ser modular y extensible.
¿Qué puede hacer Unity por 
ti?
¿Qué aspecto tiene?
Multiplataforma
Recursos: Compatibilidad
Script programming 
Lógica del juego basada en la plataforma 
Open Source .NET, Mono 
Lenguajes: C# y JavaScript 
Fácil de usar 
Visual scripting 
Sistema de eventos 
Co-rutinas
Juegos hechos con Unity 
Bad Piggies 
Temple Run 2 
CSR Racing 
Dead Trigger 2 
Murasaki baby 
Monument 
Valley 
République 
The Room 
Oddworld: Abe’s 
Oddysee New 
‘n’ Tasty!
¿Cómo conseguir Unity? 
Unity 
Gratuito. 
Funcionalidades 
básicas de gráficos, 
audio, físicas, 
animación, redes, etc. 
Unity Pro 
1500$ 
Funcionalidades avanzadas 
de gráficos, audio, 
animación, IA, iluminación, 
etc. 
Descarga de http://unity3d.com
Capítulo 2 
Conceptos & Workflow
Arquitectura
Interfaz del editor
Recursos
Escenas 
Los juegos en Unity están divididos en 
Escenas 
Las Escenas son espacios vacíos… 
…que podemos llenar de GameObjets
Escenas 
Permite crear escenarios de una forma visual y muy 
rápida. 
Controles: 
Botón izq del ratón para seleccionar objetos. 
Botón central del ratón, desplazar la cámara. 
Botón dcho/Alt + Botón izq, orbitar la cámara. 
Rueda ratón/Alt + Botón dcho, zoom de la cámara. 
“F”: Centrar el objeto seleccionado 
“W”: Herramienta de traslación 
“E”: Herramienta de giro 
“R”: Herramienta de escalado 
“Z”: Conmutador de pivote del objeto 
“X”: Conmutador de coordenadas (locales/globales)
GameObjects 
Todo lo que hay dentro de una escena son 
GameObjects 
Los GameObjects nacen vacíos y no 
hacen nada…
GameObjects 
…pero podemos añadir Componentes a 
ellos para que puedan hacer cualquier 
cosa!
Componentes 
Cada Componente añade una pieza de 
funcionalidad al GameObject 
La combinación de estos Componentes 
definen al propio GameObject 
¡Vamos a ver algunos 
ejemplos!
Componentes: Transform 
Transform 
¿Dónde? 
¿Orientación? 
¿Tamaño?
Componentes: Renderer 
Renderer 
¿Qué tengo que pintar? (Mesh Filter) 
¿Cómo lo pinto? (Mesh Renderer)
Componentes: Physics 
Physics 
¿Objeto sólido? (Collider) 
¿Se mueve? (Rigidbody)
Componentes: Scripts 
Scripts 
Añaden un comportamiento personalizado al 
GameObject
Otros Componentes 
Light 
Camera 
TextMesh 
AudioSource y AudioListener 
ParticleSystem 
… y muchos más
Crear GameObjects 
¿Cómo crear un GameObject? 
Desde el menú superior, podemos crear uno 
vacío (y añadirle componentes manualmente), 
o bien escoger alguno de los GameObjects 
que ofrece Unity por defecto
Prefabs 
Estos objetos pre-fabricados 
nos permiten guardar en el 
proyecto diferentes tipos de 
“GameObjects”, 
configurados como nosotros 
queramos, facilitándonos la 
reutilización de los mismos 
de forma que podemos 
instanciarlos en tiempo de 
juego o de edición o 
modificar todas la instancias 
de una sola vez.
Unity Packages 
Conjunto de assets que 
normalmente están 
relacionados y tienen una 
dependencia entre si. 
Podemos tanto importar 
como exportar estos 
recursos.
Workflow 
Flujo de trabajo 
Preparar 
la escena 
Configurar 
Componentes y 
Gameobjects 
Pulsar 
Play 
Ver 
resultado 
Generar 
Build 
Inicio del 
proyecto
Capítulo 3 
Scripting básico
Scripts: Introducción 
El flujo de ejecución de los scripts esta 
guiado por el motor, de forma que para 
seguir ese flujo de ejecución debemos 
heredar de MonoBehaviour (una clase 
interna de Unity que será la encargada de 
llamar a los métodos en el orden preciso, 
actualizar, dar acceso al GameObject al 
que esta añadido el componente de script, 
etc)
La clase MonoBehaviour 
La clase MonoBehaviour nos proporciona 
una serie de accesos a otros componentes 
estándar (en realidad es gracias a 
Component) del “GameObject” en el que 
estamos que son accesibles como simples 
miembros de clase: transform 
rigidbody 
camera 
Light 
Animation 
renderer 
audio 
guiText 
collider 
particleEmitter 
gameObject 
tag 
name
Métodos MonoBehaviour 
void Awake(): Este método es llamado en el 
mismo momento en el que se cargue la 
instancia del script. Este método será llamado 
solamente una vez. 
Hay que tener en cuenta que el orden de 
llamadas del Awake() es aleatorio por lo que 
no podemos confiar en que se haga al 
Awake() de otro componente antes o después 
del nuestro ya que varía.
Métodos MonoBehaviour 
void Start(): Será llamado solamente una vez, se 
llamará cuando el objeto sea activado y justo antes 
de llamar a cualquier Update(). Las acciones que 
haríamos en el constructor, debemos hacerlas en 
este método. 
void Update(): Este método es llamado 
continuamente por el motor. Muy útil para actualizar 
el estado del “GameObject”. 
void LateUpdate(): Este método es llamado 
continuamente por el motor y se llama siempre 
después de todas las llamadas a los Update() de 
todos los componentes y “GameObjects”.
Métodos MonoBehaviour 
void FixedUpdate(): Este método es igual que el Update(), 
pero a diferencia del propio Update() en el cual el tiempo entre 
llamadas puede ser variable, aquí nos aseguramos que vamos 
a tener un numero determinado de llamadas por segundo 
(configurable desde Edit >> Project Settings >> Time). Este 
método es usado para el manejo de Físicas.
Crear un script 
Para crear un script desde 
Unity lo hacemos a través 
del menú Create >> C# 
Script desde la pestaña de 
“Project” (o a través del 
menú Assets >> Create >> 
C# Script).
Ejemplo 
Para ver como va 
exactamente el orden 
de llamadas vamos a 
implementar un 
ejemplo muy simple 
que nos demuestre el 
flujo de estos 
métodos.
Otros métodos 
MonoBehaviour 
MonoBehaviour también nos proporciona llamadas a 
métodos cuando se produce algún evento de juego 
como por ejemplo: 
void OnEnable(): Es llamado cuando el “GameObject” 
se activa. 
void OnDisable(): Es llamado cuando el “GameObject” 
se desactiva.
Modificar un GameObject 
Con estos accesos a los componentes y con estas 
llamadas a métodos podemos modificar nuestro 
“GameObject”.
Búsqueda de GameObjects y 
Componentes 
Como hemos visto antes, tenemos una forma fácil de 
acceder a muchos componentes del “GameObject” en 
el que nos encontramos, pero necesitamos una forma 
de buscar otros componentes, para ello utilizaremos la 
familia de funciones GetComponent y 
GetComponentInChildren.
Ejemplo 
Basándonos en el ejemplo anterior en el que rotábamos 
nuestro “GameObject”, supongamos que queremos 
rotar también otro objeto de la misma escena (por 
ejemplo uno llamado “ElOtroObjeto”). Podríamos hacer 
una búsqueda por su nombre y rotarlo.
Variables en los Scripts 
Como hemos visto en el ejemplo anterior hemos 
accedido a otro “GameObject” desde el nuestro en el 
que estamos y hemos cambiado sus propiedades, pero 
para ello hacíamos una búsqueda en el Update(), que 
es muy ineficiente. 
Para hacer esto más simple, lo ideal seria poder decirle 
a Unity desde nuestro script cual es el otro 
“GameObject” de forma que tuviésemos una referencia 
a este y no tuviéramos que hacer una búsqueda. Para 
ello podemos utilizar una propiedad muy importante de 
Unity: las clases que definen sus campos como 
públicos, por defecto son exportadas al editor.
Ejemplo 
De esta forma nuestro Update() quedaría así:
Variables 
Además de exponer los campos de la clase, Unity es 
capaz de tomar los valores de inicialización de los 
mismos como valores por defecto para el script.
Variables 
Cabe destacar que los campos que no sean públicos 
pueden ser sacados al editor igualmente utilizando para 
ello el atributo de campo [SerializeField]. 
Del mismo modo podemos hacer que una variable 
publica no sea expuesta en el editor indicando 
explícitamente el atributo [System.NonSerialized].
Variables 
Otra facilidad que nos aporta Unity es que podemos 
convertir nuestras estructuras de datos en serializables 
si contienen datos de tipos que Unity es capaz de 
serializar. Para ello tenemos que definir nuestra 
estructura con el atributo [System.Serializable].
Instanciación de Objetos 
Como ya sabemos, los objetos en Unity se meten a 
través del editor y se colocan en la escena gracias a 
este, pero en ocasiones es interesante poder crear 
objetos en tiempo de ejecución del juego, por ejemplo 
cada vez que disparemos un arma sería interesante 
poder crear un objeto que sea el proyectil, o cualquier 
cosa que se nos pueda ocurrir.
Instanciación de Objetos 
Para poder crear objetos desde código tenemos acceso 
a una serie de métodos estáticos ofrecidos por la clase 
UnityEngine.Object
Destrucción de Objetos 
Hay que tener mucho cuidado al crear objetos, porque 
a diferencia de los objetos creados desde el editor, los 
objetos creados por nosotros en tiempo de ejecución 
NO SERÁN DESTRUIDOS POR UNITY y debemos 
hacernos responsables de los mismos, para ello 
tenemos una serie de métodos que nos permiten la 
destrucción de objetos.
Comunicación entre Objetos 
Ya sabemos como acceder a los “GameObjects”, como 
buscarlos, como crearlos y destruirlos dinámicamente 
pero ¿Cómo podemos hacer que los “GameObjects” o 
los componentes de un “GameObject” se comuniquen 
entre si? … ¡¡Mensajes!!
Capítulo 4 
Prototipo de juego
Rolling Ball 
¡Estoy listo para arrancar mi primer Proyecto! 
Rolling ball, portable a dispositivos móviles 
Mecánica de juego simple 
Para poner en práctica y trabajar con conceptos como 
GameObjects, Componentes, Prefabs, físicas y Scripting. 
¡Vamos allá!
Preparando el juego 
Abrir Unity 
Nuevo proyecto 
Establecer el Layout del Editor en 2 by 3 
Desplazar la vista Project bajo la vista Hierarchy 
File > SaveScene, guardarla como Scenes/Level01
Preparando el juego 
Crear un plano 
Renombrarlo a “Ground” 
Colocarlo en (0, 0, 0) 
Establecer su escala en (2, 1, 2) 
Crear una esfera 
Renombrarla a Player 
Colocarla en (0, 0.5, 0)
Preparando el juego 
Crear una luz direccional 
Renombrarla a Main Light 
Establecer su rotación a (30, 60, 0) 
Habilitar sombras (Soft Shadows) 
Configurar como Very High resolution 
Crear otra luz direccional 
Renombrarla a Fill Light 
Establecer rotación a (-30, -60, 0) 
Poner tono azulado claro 
Establecer su intensidad a 0.1
Preparando el juego 
Crear un GameObject vacío (GameObject > Create 
Empty) 
Renombrar a Lighting 
Reset de su transform 
Emparentar como hijos las dos luces creadas 
anteriormente
Preparando el juego 
Achievement unlocked! 
Fin del nivel 1
Moviendo al Player 
Añadir Rigidbody al Player (Component > Physics > 
Rigidbody) 
Crear una carpeta en Assets, llamarla Scripts 
Crear un Script C# en esa carpeta, llamado 
PlayerController 
Añadirlo al Player (como componente) 
Abrirlo (doble click) 
Acceso directo a la API (Ctrl + ‘ sobre la palabra)
Moviendo al Player 
Pulsar Play!
Moviendo al Player 
Muy lento! 
Crear variable para acelerar el movimiento
Moviendo al Player 
Cool! 
Fin del nivel 2
Moviendo la cámara 
Colocar la cámara en la posición (0, 10, -10) 
Establecer su rotación en (45, 0, 0) 
Emparentar como hijo del Player 
Mover al Player en el editor 
Pulsar Play 
Desemparentar para solucionar lo visualizado 
Crear un Script C# llamado CameraController y añadirlo 
a la Cámara
Moviendo la cámara 
Enganchar el GameObject Player a la variable del 
Script
Moviendo la cámara 
Awesome! 
Fin del nivel 3
Creando Items 
Crear un GameObject vacío en (0, 0, 0) y renombrarlo a 
Walls 
Crear un cubo y renombrarlo a West Wall 
Emparentarlo como hijo de “Walls” 
Establecer su escala a (0.5, 2, 20.5) 
Establecer su posicion a (-10, 0, 0) 
Duplicar el GameObjet y renombrarlo a East Wall 
Modificar su posición a (10, 0, 0) 
Duplicar y renombrar a North Wall 
Modificar su escala a (20.5, 2, 0.5) 
Modificar su posición a (0, 0, 10) 
Duplicar y renombrar a South Wall 
Modificar su posición a (0, 0, -10)
Creando Items 
Crear un Cubo y renombrarlo a “PickUp” 
Modificar su posición a (0, 0.5, 0) 
Modificar su escala a (0.5, 0.5, 0.5) 
Modificar su rotación a (45, 45, 45) 
Crear un Script C# llamado Rotator y añadirlo al objeto
Creando Items 
Otra forma de girar el item: Con animaciones 
Añadir el componente animation 
Mostrar la ventana de animación (Window > Animation) 
Crear un nuevo Clip de animación 
Llamarlo ItemRotation.anim 
Crear una curva de animación para la propiedad 
transform>rotation 
Establecer la rotación en y a 405 en el segundo 5 
En la animación, marcar Wrap Mode = Loop 
Enganchar la animación al componente Animation del objeto 
PickUp 
Pulsar Play, alternando componentes (Script y Animation) 
Importante: Animaciones prevalecen sobre el código
Creando Items 
Crear una carpeta en los Assets llamada Prefabs 
Arrastrar el GameObject PickUp a ella para crear un 
prefab 
Crear un GameObject vacío (0, 0, 0) llamado PickUps 
Emparentar el PickUp al objeto PickUps 
Duplicarlo 11 veces y colocar todos ellos en forma de 
anillo 
Pulsar Play
Creando Items 
OMG it’s the 
Fin del nivel 4
Recogiendo Items 
Editar el Script PlayerController
Recogiendo Items 
Crear un tag llamado “PickUp” en el editor 
Asignar el tag al prefab PickUp 
Marcar el prefab PickUp como trigger 
Pulsar Play 
(Optimización) 
Añadir el componente Rigidbody al prefab 
Marcar isKinematic 
Pulsar Play
Recogiendo Items 
Impressive 
Fin del nivel 5
Mostrando texto (UI) 
Editar el Script PlayerController 
Añadir una variable pública de tipo entero llamada 
“count” 
Añadir el método Start() e inicializar la variable 
Incrementar la variable cada vez que se recoge un item 
(en el método OnTriggerEnter) 
Pulsar Play
Mostrando texto (UI) 
Crear un GameObject vacío llamado Display Text en (0, 
0, 0) 
Crear un GUIText llamado Count Text (0, 1, 0) 
Emparentar como hijo de “Display Text” 
Modificar su Offset (10, -10) 
Editar el Script PlayerController 
Añadir una variable pública de tipo GUIText llamada 
“countText” 
Añadir las líneas de código adecuadas
Mostrando texto (UI) 
Asignar el GameObject Count Text a la variable 
Pulsar Play
Mostrando texto (UI) 
Crear un GUIText y renombrarlo a Win Text (0.5, 0.75, 
0) 
Anchor = upper center 
Font Size = 50 
Añadir una variable pública de tipo GUIText llamada 
“winText” 
Añadir las líneas de código adecuadas para mostrar el 
texto cuando se recojan todos los objetos
Mostrando texto (UI) 
Asignar el GameObject Win Text a la variable 
Pulsar Play
Mostrando texto (UI) 
Sweet! 
Fin del nivel 6
Publicando el juego 
File > Build Settings 
Cambiar la plataforma a WebPlayer (Switch Platform) 
Añadir la escena a la ventana (Add Current) 
Build 
Guardar en una nueva carpeta llamada 
CodeMotionUnityGame 
Se generan dos archivos 
.unity3d (el binario del juego) 
.html (página de ejemplo para embeber el juego en un marco) 
Abrir el .html
Publicando el juego 
Nice work kid! 
Fin del nivel 7
Versión para móviles 
Desplazamiento del player mediante acelerómetros 
Modificar Input en base a la plataforma
Versión para móviles 
Implementar el botón “Back” de Android para salir del 
juego 
Instalar y configurar la SDK de Android 
http://docs.unity3d.com/Manual/android-sdksetup.html
Versión para móviles 
File > Build Settings 
Cambiar la plataforma a Android (Switch Platform) 
Player Settings: 
Product Company 
Product Name 
Orientación: Auto Rotation (Habilitar Landscape) 
Build 
Se genera un archivo .apk 
Conectar el dispositivo Android al ordenador por USB 
Copiar el archivo .apk e instalar 
Ejecutar
Versión para móviles 
Challenge completed! 
Final del 
juego!
¿Cuestiones o dudas? 
Miguel Ángel Taramón 
Gómez 
miguelangel@cuprastudios.com 
@miguelitoCupra
¡¡Gracias!! 
Miguel Ángel Taramón 
Gómez 
miguelangel@cuprastudios.com 
@miguelitoCupra

Más contenido relacionado

PDF
Game Economy Balancing Workshop
PDF
Game design doc template
PPTX
LAFS Game Design 1 - Dramatic Elements
PDF
Game Programming 03 - Git Flow
PDF
Working with Formal Elements
PDF
Paradigmas de Linguagens de Programação - Escopo estático/dinâmico
PPTX
Level Design
PPTX
Conceito de processos
Game Economy Balancing Workshop
Game design doc template
LAFS Game Design 1 - Dramatic Elements
Game Programming 03 - Git Flow
Working with Formal Elements
Paradigmas de Linguagens de Programação - Escopo estático/dinâmico
Level Design
Conceito de processos

La actualidad más candente (20)

PDF
[Unity3D] Cat RPG game
PPT
Aula 04 arquitetura de computadores
PDF
02 - Emergence and Progression
PPTX
Level design for games
PDF
Criando um App com App Inventor 2
PDF
The Structure of Games
PDF
Aula 6 - Design e Processo de Design de Interfaces de Usuário
PDF
Introdução básica aos Navegadores de Internet
PPT
게임 기획과 Oop
PDF
Introduction to Game Design
PDF
Game Design fundamentals
PDF
Style & Design Principles 03 - Component-Based Entity Systems
PDF
Tema 1 introduccion a la programacion en visual basic
PPTX
Course Presentation: Games design
PDF
게임제작개론 : #0 과목소개
PDF
The Principles of Game Design
PPTX
Game Architecture and Programming
PPT
Introduction to Unity3D Game Engine
PDF
Game Design Fundamentals
PDF
Aula 5 sistemas operacionais
[Unity3D] Cat RPG game
Aula 04 arquitetura de computadores
02 - Emergence and Progression
Level design for games
Criando um App com App Inventor 2
The Structure of Games
Aula 6 - Design e Processo de Design de Interfaces de Usuário
Introdução básica aos Navegadores de Internet
게임 기획과 Oop
Introduction to Game Design
Game Design fundamentals
Style & Design Principles 03 - Component-Based Entity Systems
Tema 1 introduccion a la programacion en visual basic
Course Presentation: Games design
게임제작개론 : #0 과목소개
The Principles of Game Design
Game Architecture and Programming
Introduction to Unity3D Game Engine
Game Design Fundamentals
Aula 5 sistemas operacionais
Publicidad

Destacado (20)

PPTX
Creación de videojuegos con unity
PDF
Taller Unity
PDF
Diseño y Desarrollo de Videojuegos
PPTX
Slash friday: Unity 3D - Pasando nuestra primera pantalla
PPT
APLICACIÓN DE FACEBOOK
PDF
Taller unity3d
PPTX
Diseño y creación de videojuegos
PPT
Desarrollo de videojuegos
PPS
Tipos de inteligencia multiples
PDF
Como instalar una aplicacion en mi facebook page o fanpage
PDF
Desarrollo De Aplicaciones Para Facebook
PDF
desarrollo de videojuegos
PPT
Desarrollo de aplicacion facebook con php - Basico
ODP
Hardware & Software
ODP
Presentacion Hardware y Software
PDF
Desarrollo videojuegos
ODP
Presentación desarrollo de videojuegos
Creación de videojuegos con unity
Taller Unity
Diseño y Desarrollo de Videojuegos
Slash friday: Unity 3D - Pasando nuestra primera pantalla
APLICACIÓN DE FACEBOOK
Taller unity3d
Diseño y creación de videojuegos
Desarrollo de videojuegos
Tipos de inteligencia multiples
Como instalar una aplicacion en mi facebook page o fanpage
Desarrollo De Aplicaciones Para Facebook
desarrollo de videojuegos
Desarrollo de aplicacion facebook con php - Basico
Hardware & Software
Presentacion Hardware y Software
Desarrollo videojuegos
Presentación desarrollo de videojuegos
Publicidad

Similar a Codemotion 2014 - Introducción a Unity (20)

PDF
Manual y temario unity
DOCX
Que es action scrip 3
DOCX
Que es action scrip 3
PPTX
Marcela montoya
PPTX
Marcela montoya
PPTX
Actionscript3.0 juan camilo 11 02
PPTX
Actionscript3.0 juan camilo 11 02
PPTX
Actionscript3.0 juan camilo 11 02
DOCX
Que es action scrip 3
PPTX
Angie tovar (1)
PPTX
2trabajo
PPTX
Action script 3
PPTX
Action script 3
PPTX
Actionscrip linakrdona n2
PPTX
Francy velandia
PPTX
Introducción a action script 3
DOCX
PPTX
Action script 3
PPTX
ActionScript 3.0 GERMAN MIELES11-2
PPTX
Intro UNITY.pptx
Manual y temario unity
Que es action scrip 3
Que es action scrip 3
Marcela montoya
Marcela montoya
Actionscript3.0 juan camilo 11 02
Actionscript3.0 juan camilo 11 02
Actionscript3.0 juan camilo 11 02
Que es action scrip 3
Angie tovar (1)
2trabajo
Action script 3
Action script 3
Actionscrip linakrdona n2
Francy velandia
Introducción a action script 3
Action script 3
ActionScript 3.0 GERMAN MIELES11-2
Intro UNITY.pptx

Último (15)

PPTX
CONSOLIDADO DE AFECTACIONES POR LLUVIAS MAYO JUNIO 2025 BARINAS ACTUALIZADO.pptx
PDF
Tratado Arias-Roosevelt de la República de Panamá
DOCX
ACTIV. DE AP. 30 DE JUNIO 2025 PLANIFIC PROYECTO.docx
PPTX
Conceptos Basicos de construccion concreto
PDF
LA TIC en la vida cotidiana y en la sociedad.pdf
PPTX
Curso Protección Auditiva Trabajo (1).pptx
DOCX
SESIÓN DE CLASE ACTIV. DE AP. 30 DE JUNIO 2025 PLANIFIC PROYECTO.docx
PPTX
Cierra ciclos en tu vida cristiana con Jesús
PDF
La castidad nos hace libres para amar (Jovenes).pdf
PPT
USO_Y_MANTENIMIENTO_DE_EPP PARA EL TRABAJADOR.ppt
PPTX
Casa de Boyacá informe de actividades 2024
DOCX
SESIÓN DE CLASE ACTIV. AP 27 DE JUNIO PLANTAS PARA LA TOS.docx
PPTX
Proyectos de Inversión y sus requerimientos
DOCX
646686699-SESION-Nº-7-SE-COMUNICA-ORALMENTE-EN-SU-LENGUA-MATERNA.docx
PPTX
La-Problematica-de-la-Pobreza-a-Nivel-Mundial-Un-Desafio-Urgente.pptx
CONSOLIDADO DE AFECTACIONES POR LLUVIAS MAYO JUNIO 2025 BARINAS ACTUALIZADO.pptx
Tratado Arias-Roosevelt de la República de Panamá
ACTIV. DE AP. 30 DE JUNIO 2025 PLANIFIC PROYECTO.docx
Conceptos Basicos de construccion concreto
LA TIC en la vida cotidiana y en la sociedad.pdf
Curso Protección Auditiva Trabajo (1).pptx
SESIÓN DE CLASE ACTIV. DE AP. 30 DE JUNIO 2025 PLANIFIC PROYECTO.docx
Cierra ciclos en tu vida cristiana con Jesús
La castidad nos hace libres para amar (Jovenes).pdf
USO_Y_MANTENIMIENTO_DE_EPP PARA EL TRABAJADOR.ppt
Casa de Boyacá informe de actividades 2024
SESIÓN DE CLASE ACTIV. AP 27 DE JUNIO PLANTAS PARA LA TOS.docx
Proyectos de Inversión y sus requerimientos
646686699-SESION-Nº-7-SE-COMUNICA-ORALMENTE-EN-SU-LENGUA-MATERNA.docx
La-Problematica-de-la-Pobreza-a-Nivel-Mundial-Un-Desafio-Urgente.pptx

Codemotion 2014 - Introducción a Unity

  • 1. Creación de juegos móviles multiplataforma en Unity Miguel Ángel Taramón Gómez
  • 2. Sobre mi  Ingeniero Técnico de Informática de Sistemas por la Universidad Politécnica de Madrid  Ganador concurso internacional Wiideojuegos 2010  Socio fundador de Cupra Studios en 2011  Profesor del Máster en Diseño y Desarrollo de Videojuegos PlayStation First desde 2012 miguelangel@cuprastudios.com @miguelitoCupra
  • 3. Índice del Workshop Introducción a Unity Conceptos & workflow Scripting básico Prototipo de videojuego
  • 5. ¿Qué es Unity? Motor de juegos Sistema creado para ayudar a hacer videojuegos de una forma rápida y sencilla. Editor visual Permite ver cambios en tiempo real. Muy interactivo. Arquitectura basada en componentes Permite ser modular y extensible.
  • 6. ¿Qué puede hacer Unity por ti?
  • 10. Script programming Lógica del juego basada en la plataforma Open Source .NET, Mono Lenguajes: C# y JavaScript Fácil de usar Visual scripting Sistema de eventos Co-rutinas
  • 11. Juegos hechos con Unity Bad Piggies Temple Run 2 CSR Racing Dead Trigger 2 Murasaki baby Monument Valley République The Room Oddworld: Abe’s Oddysee New ‘n’ Tasty!
  • 12. ¿Cómo conseguir Unity? Unity Gratuito. Funcionalidades básicas de gráficos, audio, físicas, animación, redes, etc. Unity Pro 1500$ Funcionalidades avanzadas de gráficos, audio, animación, IA, iluminación, etc. Descarga de http://unity3d.com
  • 13. Capítulo 2 Conceptos & Workflow
  • 17. Escenas Los juegos en Unity están divididos en Escenas Las Escenas son espacios vacíos… …que podemos llenar de GameObjets
  • 18. Escenas Permite crear escenarios de una forma visual y muy rápida. Controles: Botón izq del ratón para seleccionar objetos. Botón central del ratón, desplazar la cámara. Botón dcho/Alt + Botón izq, orbitar la cámara. Rueda ratón/Alt + Botón dcho, zoom de la cámara. “F”: Centrar el objeto seleccionado “W”: Herramienta de traslación “E”: Herramienta de giro “R”: Herramienta de escalado “Z”: Conmutador de pivote del objeto “X”: Conmutador de coordenadas (locales/globales)
  • 19. GameObjects Todo lo que hay dentro de una escena son GameObjects Los GameObjects nacen vacíos y no hacen nada…
  • 20. GameObjects …pero podemos añadir Componentes a ellos para que puedan hacer cualquier cosa!
  • 21. Componentes Cada Componente añade una pieza de funcionalidad al GameObject La combinación de estos Componentes definen al propio GameObject ¡Vamos a ver algunos ejemplos!
  • 22. Componentes: Transform Transform ¿Dónde? ¿Orientación? ¿Tamaño?
  • 23. Componentes: Renderer Renderer ¿Qué tengo que pintar? (Mesh Filter) ¿Cómo lo pinto? (Mesh Renderer)
  • 24. Componentes: Physics Physics ¿Objeto sólido? (Collider) ¿Se mueve? (Rigidbody)
  • 25. Componentes: Scripts Scripts Añaden un comportamiento personalizado al GameObject
  • 26. Otros Componentes Light Camera TextMesh AudioSource y AudioListener ParticleSystem … y muchos más
  • 27. Crear GameObjects ¿Cómo crear un GameObject? Desde el menú superior, podemos crear uno vacío (y añadirle componentes manualmente), o bien escoger alguno de los GameObjects que ofrece Unity por defecto
  • 28. Prefabs Estos objetos pre-fabricados nos permiten guardar en el proyecto diferentes tipos de “GameObjects”, configurados como nosotros queramos, facilitándonos la reutilización de los mismos de forma que podemos instanciarlos en tiempo de juego o de edición o modificar todas la instancias de una sola vez.
  • 29. Unity Packages Conjunto de assets que normalmente están relacionados y tienen una dependencia entre si. Podemos tanto importar como exportar estos recursos.
  • 30. Workflow Flujo de trabajo Preparar la escena Configurar Componentes y Gameobjects Pulsar Play Ver resultado Generar Build Inicio del proyecto
  • 32. Scripts: Introducción El flujo de ejecución de los scripts esta guiado por el motor, de forma que para seguir ese flujo de ejecución debemos heredar de MonoBehaviour (una clase interna de Unity que será la encargada de llamar a los métodos en el orden preciso, actualizar, dar acceso al GameObject al que esta añadido el componente de script, etc)
  • 33. La clase MonoBehaviour La clase MonoBehaviour nos proporciona una serie de accesos a otros componentes estándar (en realidad es gracias a Component) del “GameObject” en el que estamos que son accesibles como simples miembros de clase: transform rigidbody camera Light Animation renderer audio guiText collider particleEmitter gameObject tag name
  • 34. Métodos MonoBehaviour void Awake(): Este método es llamado en el mismo momento en el que se cargue la instancia del script. Este método será llamado solamente una vez. Hay que tener en cuenta que el orden de llamadas del Awake() es aleatorio por lo que no podemos confiar en que se haga al Awake() de otro componente antes o después del nuestro ya que varía.
  • 35. Métodos MonoBehaviour void Start(): Será llamado solamente una vez, se llamará cuando el objeto sea activado y justo antes de llamar a cualquier Update(). Las acciones que haríamos en el constructor, debemos hacerlas en este método. void Update(): Este método es llamado continuamente por el motor. Muy útil para actualizar el estado del “GameObject”. void LateUpdate(): Este método es llamado continuamente por el motor y se llama siempre después de todas las llamadas a los Update() de todos los componentes y “GameObjects”.
  • 36. Métodos MonoBehaviour void FixedUpdate(): Este método es igual que el Update(), pero a diferencia del propio Update() en el cual el tiempo entre llamadas puede ser variable, aquí nos aseguramos que vamos a tener un numero determinado de llamadas por segundo (configurable desde Edit >> Project Settings >> Time). Este método es usado para el manejo de Físicas.
  • 37. Crear un script Para crear un script desde Unity lo hacemos a través del menú Create >> C# Script desde la pestaña de “Project” (o a través del menú Assets >> Create >> C# Script).
  • 38. Ejemplo Para ver como va exactamente el orden de llamadas vamos a implementar un ejemplo muy simple que nos demuestre el flujo de estos métodos.
  • 39. Otros métodos MonoBehaviour MonoBehaviour también nos proporciona llamadas a métodos cuando se produce algún evento de juego como por ejemplo: void OnEnable(): Es llamado cuando el “GameObject” se activa. void OnDisable(): Es llamado cuando el “GameObject” se desactiva.
  • 40. Modificar un GameObject Con estos accesos a los componentes y con estas llamadas a métodos podemos modificar nuestro “GameObject”.
  • 41. Búsqueda de GameObjects y Componentes Como hemos visto antes, tenemos una forma fácil de acceder a muchos componentes del “GameObject” en el que nos encontramos, pero necesitamos una forma de buscar otros componentes, para ello utilizaremos la familia de funciones GetComponent y GetComponentInChildren.
  • 42. Ejemplo Basándonos en el ejemplo anterior en el que rotábamos nuestro “GameObject”, supongamos que queremos rotar también otro objeto de la misma escena (por ejemplo uno llamado “ElOtroObjeto”). Podríamos hacer una búsqueda por su nombre y rotarlo.
  • 43. Variables en los Scripts Como hemos visto en el ejemplo anterior hemos accedido a otro “GameObject” desde el nuestro en el que estamos y hemos cambiado sus propiedades, pero para ello hacíamos una búsqueda en el Update(), que es muy ineficiente. Para hacer esto más simple, lo ideal seria poder decirle a Unity desde nuestro script cual es el otro “GameObject” de forma que tuviésemos una referencia a este y no tuviéramos que hacer una búsqueda. Para ello podemos utilizar una propiedad muy importante de Unity: las clases que definen sus campos como públicos, por defecto son exportadas al editor.
  • 44. Ejemplo De esta forma nuestro Update() quedaría así:
  • 45. Variables Además de exponer los campos de la clase, Unity es capaz de tomar los valores de inicialización de los mismos como valores por defecto para el script.
  • 46. Variables Cabe destacar que los campos que no sean públicos pueden ser sacados al editor igualmente utilizando para ello el atributo de campo [SerializeField]. Del mismo modo podemos hacer que una variable publica no sea expuesta en el editor indicando explícitamente el atributo [System.NonSerialized].
  • 47. Variables Otra facilidad que nos aporta Unity es que podemos convertir nuestras estructuras de datos en serializables si contienen datos de tipos que Unity es capaz de serializar. Para ello tenemos que definir nuestra estructura con el atributo [System.Serializable].
  • 48. Instanciación de Objetos Como ya sabemos, los objetos en Unity se meten a través del editor y se colocan en la escena gracias a este, pero en ocasiones es interesante poder crear objetos en tiempo de ejecución del juego, por ejemplo cada vez que disparemos un arma sería interesante poder crear un objeto que sea el proyectil, o cualquier cosa que se nos pueda ocurrir.
  • 49. Instanciación de Objetos Para poder crear objetos desde código tenemos acceso a una serie de métodos estáticos ofrecidos por la clase UnityEngine.Object
  • 50. Destrucción de Objetos Hay que tener mucho cuidado al crear objetos, porque a diferencia de los objetos creados desde el editor, los objetos creados por nosotros en tiempo de ejecución NO SERÁN DESTRUIDOS POR UNITY y debemos hacernos responsables de los mismos, para ello tenemos una serie de métodos que nos permiten la destrucción de objetos.
  • 51. Comunicación entre Objetos Ya sabemos como acceder a los “GameObjects”, como buscarlos, como crearlos y destruirlos dinámicamente pero ¿Cómo podemos hacer que los “GameObjects” o los componentes de un “GameObject” se comuniquen entre si? … ¡¡Mensajes!!
  • 53. Rolling Ball ¡Estoy listo para arrancar mi primer Proyecto! Rolling ball, portable a dispositivos móviles Mecánica de juego simple Para poner en práctica y trabajar con conceptos como GameObjects, Componentes, Prefabs, físicas y Scripting. ¡Vamos allá!
  • 54. Preparando el juego Abrir Unity Nuevo proyecto Establecer el Layout del Editor en 2 by 3 Desplazar la vista Project bajo la vista Hierarchy File > SaveScene, guardarla como Scenes/Level01
  • 55. Preparando el juego Crear un plano Renombrarlo a “Ground” Colocarlo en (0, 0, 0) Establecer su escala en (2, 1, 2) Crear una esfera Renombrarla a Player Colocarla en (0, 0.5, 0)
  • 56. Preparando el juego Crear una luz direccional Renombrarla a Main Light Establecer su rotación a (30, 60, 0) Habilitar sombras (Soft Shadows) Configurar como Very High resolution Crear otra luz direccional Renombrarla a Fill Light Establecer rotación a (-30, -60, 0) Poner tono azulado claro Establecer su intensidad a 0.1
  • 57. Preparando el juego Crear un GameObject vacío (GameObject > Create Empty) Renombrar a Lighting Reset de su transform Emparentar como hijos las dos luces creadas anteriormente
  • 58. Preparando el juego Achievement unlocked! Fin del nivel 1
  • 59. Moviendo al Player Añadir Rigidbody al Player (Component > Physics > Rigidbody) Crear una carpeta en Assets, llamarla Scripts Crear un Script C# en esa carpeta, llamado PlayerController Añadirlo al Player (como componente) Abrirlo (doble click) Acceso directo a la API (Ctrl + ‘ sobre la palabra)
  • 60. Moviendo al Player Pulsar Play!
  • 61. Moviendo al Player Muy lento! Crear variable para acelerar el movimiento
  • 62. Moviendo al Player Cool! Fin del nivel 2
  • 63. Moviendo la cámara Colocar la cámara en la posición (0, 10, -10) Establecer su rotación en (45, 0, 0) Emparentar como hijo del Player Mover al Player en el editor Pulsar Play Desemparentar para solucionar lo visualizado Crear un Script C# llamado CameraController y añadirlo a la Cámara
  • 64. Moviendo la cámara Enganchar el GameObject Player a la variable del Script
  • 65. Moviendo la cámara Awesome! Fin del nivel 3
  • 66. Creando Items Crear un GameObject vacío en (0, 0, 0) y renombrarlo a Walls Crear un cubo y renombrarlo a West Wall Emparentarlo como hijo de “Walls” Establecer su escala a (0.5, 2, 20.5) Establecer su posicion a (-10, 0, 0) Duplicar el GameObjet y renombrarlo a East Wall Modificar su posición a (10, 0, 0) Duplicar y renombrar a North Wall Modificar su escala a (20.5, 2, 0.5) Modificar su posición a (0, 0, 10) Duplicar y renombrar a South Wall Modificar su posición a (0, 0, -10)
  • 67. Creando Items Crear un Cubo y renombrarlo a “PickUp” Modificar su posición a (0, 0.5, 0) Modificar su escala a (0.5, 0.5, 0.5) Modificar su rotación a (45, 45, 45) Crear un Script C# llamado Rotator y añadirlo al objeto
  • 68. Creando Items Otra forma de girar el item: Con animaciones Añadir el componente animation Mostrar la ventana de animación (Window > Animation) Crear un nuevo Clip de animación Llamarlo ItemRotation.anim Crear una curva de animación para la propiedad transform>rotation Establecer la rotación en y a 405 en el segundo 5 En la animación, marcar Wrap Mode = Loop Enganchar la animación al componente Animation del objeto PickUp Pulsar Play, alternando componentes (Script y Animation) Importante: Animaciones prevalecen sobre el código
  • 69. Creando Items Crear una carpeta en los Assets llamada Prefabs Arrastrar el GameObject PickUp a ella para crear un prefab Crear un GameObject vacío (0, 0, 0) llamado PickUps Emparentar el PickUp al objeto PickUps Duplicarlo 11 veces y colocar todos ellos en forma de anillo Pulsar Play
  • 70. Creando Items OMG it’s the Fin del nivel 4
  • 71. Recogiendo Items Editar el Script PlayerController
  • 72. Recogiendo Items Crear un tag llamado “PickUp” en el editor Asignar el tag al prefab PickUp Marcar el prefab PickUp como trigger Pulsar Play (Optimización) Añadir el componente Rigidbody al prefab Marcar isKinematic Pulsar Play
  • 73. Recogiendo Items Impressive Fin del nivel 5
  • 74. Mostrando texto (UI) Editar el Script PlayerController Añadir una variable pública de tipo entero llamada “count” Añadir el método Start() e inicializar la variable Incrementar la variable cada vez que se recoge un item (en el método OnTriggerEnter) Pulsar Play
  • 75. Mostrando texto (UI) Crear un GameObject vacío llamado Display Text en (0, 0, 0) Crear un GUIText llamado Count Text (0, 1, 0) Emparentar como hijo de “Display Text” Modificar su Offset (10, -10) Editar el Script PlayerController Añadir una variable pública de tipo GUIText llamada “countText” Añadir las líneas de código adecuadas
  • 76. Mostrando texto (UI) Asignar el GameObject Count Text a la variable Pulsar Play
  • 77. Mostrando texto (UI) Crear un GUIText y renombrarlo a Win Text (0.5, 0.75, 0) Anchor = upper center Font Size = 50 Añadir una variable pública de tipo GUIText llamada “winText” Añadir las líneas de código adecuadas para mostrar el texto cuando se recojan todos los objetos
  • 78. Mostrando texto (UI) Asignar el GameObject Win Text a la variable Pulsar Play
  • 79. Mostrando texto (UI) Sweet! Fin del nivel 6
  • 80. Publicando el juego File > Build Settings Cambiar la plataforma a WebPlayer (Switch Platform) Añadir la escena a la ventana (Add Current) Build Guardar en una nueva carpeta llamada CodeMotionUnityGame Se generan dos archivos .unity3d (el binario del juego) .html (página de ejemplo para embeber el juego en un marco) Abrir el .html
  • 81. Publicando el juego Nice work kid! Fin del nivel 7
  • 82. Versión para móviles Desplazamiento del player mediante acelerómetros Modificar Input en base a la plataforma
  • 83. Versión para móviles Implementar el botón “Back” de Android para salir del juego Instalar y configurar la SDK de Android http://docs.unity3d.com/Manual/android-sdksetup.html
  • 84. Versión para móviles File > Build Settings Cambiar la plataforma a Android (Switch Platform) Player Settings: Product Company Product Name Orientación: Auto Rotation (Habilitar Landscape) Build Se genera un archivo .apk Conectar el dispositivo Android al ordenador por USB Copiar el archivo .apk e instalar Ejecutar
  • 85. Versión para móviles Challenge completed! Final del juego!
  • 86. ¿Cuestiones o dudas? Miguel Ángel Taramón Gómez miguelangel@cuprastudios.com @miguelitoCupra
  • 87. ¡¡Gracias!! Miguel Ángel Taramón Gómez miguelangel@cuprastudios.com @miguelitoCupra