UNITY - Tutorial básico Bolitas

Crear objetos, cambiarles el color desde inspector, crear materiales, y darle gravedad al objeto añadiendole el componente "rigidbody"

MENU

Se crea un UI Canvas Panel

En Inspector de Canvas: UI Scale Mode: Scale with screen size para que se adapte a todas las pantallas

En Inspector de Panel se puede cambiar el color de la pantalla (tener en cuenta que el panel tiene un bordecito que se puede quitar expandiendo un poco el panel)

Se puede crear TextMeshPro (para que tenga mas funcionalidades dentro del texto por eso necesita importar cosas). Se puede centrar, cambiar color, etc. 

  • En Rect Transform se puede poner en diferentes lados y que se reescale, tenemos que apretar la tecla alt + el icono que queremos (el del centro por ejemplo)
  • Tecla T para reescalar el texto desde el cuadrado amarillo que lo rodea
  • Tambien podemos quitar el wrapping para que no tenga en cuenta el rectangulo (pero mejor con)
Botón se crea con Button - TextMeshPro
  • Dentro de Text (dentro de Button) se cambia el nombre y su color
  • Dentro del botón en Inspector - Button se pueden cambiar colores de interacción
  • (Botón)En el apartado de Inspector On click() tiene sus funcionalidades añadidas por codigo
Toogle tiene background y checkmark y label (booleano) (antialising)
Dropdown para elegir diferentes opciones (skins, modo de juego, etc)
inputfield para introducir un nombre o algo
scrollbar por ejemplo para reducir el volumen
slider lo mismo que scrollbar con otro estilo (con relleno al mover) volumen
se puede poner una imagen (en source image en el apartado imagen de inspector) se puede poner imagenes, con la tecla R se escala
recomendable poner todo con anchor point (lo de rect transform)
Nueva escena
File -  New Scene
guardar el archivo en escena por ejemplo Nivel 1.

mover la camara para enfocar la escena y dentro de camera - environment podemos cambiar el background type de skybox a solid color y poner un color
en la pestaña projection se puede cambiar de perspectiva a ortografica y se cuadra la camara en size
en un objeto ( que será el jugador) en inspector mesh render - lighting podemos quitar y poner sombra con cast shadows

Creamos una carpeta de Scripts dentro de Assets
create - scripting - c# script y lo renombramos

para asociar un script a un objeto: se arrastra el script al objeto o se arrastra al inspector

en el metodo Start() cuando le demos al play hará esa funcionalidad 

sale un error UnassignedReferenceException porque se le debe asignar la variable a un rigidbody. entonces vamos al componente rigidbody del objeto y se lo asignamos a la variable

este componente era publico
ahora hacemos uno privado, el MeshRenderer (que es el que hace desaparecer la malla si deseleccionas)


le mandamos el mesh renderer que tenemos dentro de nuestro objeto. cuando demos al play va a buscar el componente meshrenderer y lo asignará a la variable y lo desactivamos (por lo que desaparece el objeto).

private void Awake() es parecido al método start pero se inicia antes


https://docs.unity3d.com/es/530/Manual/UnityManual.html 

En Unity, Update() es un método especial que se ejecuta automáticamente en cada frame del juego.
➜ Si tu juego va a 60 FPS, Update() se llama unas 60 veces por segundo.

Se usa sobre todo para cosas que dependen del tiempo real o de la entrada del jugador:
  • Leer teclado o mando (Input.GetAxis, Input.GetKey)
  • Mover objetos
  • Rotaciones
  • Contadores de tiempo
  • Animaciones simples
edit - project setings - input manager hay un monton de teclas asignadas predeterminadas dentro de axis. 

asignar a una variable de tipo float = Input.GetAxis("Horizontal");
tenemos k crear un vector3 y asignar a los ejes su valor

en el objeto dentro del script como la variable speed es publica se puede manejar desde inspector (y se prioriza lo que se ponga aqui para la ejecucion)



En Edit - project setting - player  - other settings - active input handling lo he cambiado a both 



con esto ya funciona que se mueva con el teclado eligiendo la velocidad (que volvera a ser 5 al cerrar)
AÑADIR que se coma bolitas
Se puede hacer de varias maneras, en este caso usaremos tags.
Dentro del objeto en inspector en la zona de tags creamos uno nuevo.
Cuando la bola de jugador colisione con la bola collectible comprobará si tiene el tag de collectible

le añadimos a la esfera rigidbody

en el codigo de jugador si escribes "onCollisionEnter" ya sale toda la estructura
    private void OnCollisionEnter(Collision collision){}
Es un método de Unity que se ejecuta automáticamente cuando el objeto que tiene este script choca físicamente con otro objeto.

Aquí estás comprobando:
  • El objeto con el que chocaste
  • Si tiene el tag llamado "Collectible"
CompareTag es la forma correcta (y más eficiente) de comprobar tags en Unity.

Elimina el objeto con el que chocaste con Destroy 
PREFABS
Creamos una carpeta en Assets llamada Prefabs 
un prefab es como una plantilla con el que puedes usar modelos repetidos dentro de un juego


al meter el collectible en prefab (arrastrandolo se pone azul) y si lo eliminamos podremos salvarlo de ahi. 
se puede duplicar el objeto con control c + v y seguira siendo un prefab

dentro de rigidbody podemos poner un constraint donde queramos, por ejemplo en y para que no pueda subir en ese eje (aveces al rebotar se sube un poco la pelota) pero entonces tampoco podrá caer al vacio. 
Añadir contador
Se puede añadir UI - Text (TextMeshPro)
ponemos dos textos



Creamos un objeto vacio que lo unico que va a tener es un script  
lo llamamos GameManager y lo ponemos en posicion 0 0 0 

Asi se mantiene el orden. Vamos a crear un script k se llamara GameManager (cuando se crea con este nombre se pone auto con un engranaje de dibujo y lo asignamos al objeto gamemanager arrastrandolo.

Metemos todos los collectibles dentro de GameManager. porque lo que haremos es contar los colectibles que nos quedan dentro de game manager.


abrimos variable TMP_Text y el collectibleNumber


lo hemos metido en update asi que va a ejecutarse todo el rato. Para que lo haga debemos a añadir el texto como variable:

de esta manera sale a cada frame asi que no nos sirve (borramos)

para que sume solo cuando haya una collision:
  • al jugador le ponemos el tag player
tambien creamos otro script llamado Collectible
se arrastra el script al collectible base, y dentro de él se aplica a todos en overrides

Un override sirve para redefinir (sobrescribir) un método que viene de una clase padre.


entonces el script ya se aplica a todos

borramos el método onCollisionEnter de jugador.css y lo pegamos en Collectible.css y cambiamos que compruebe el tag de player. 


en Collectible añadimos que busque un objeto de tipo GameManager y llamamos a AddCollectible()



Duplicamos los textos y les añadimos nombre "Totales"
En GameManager.cs:

lo que hace es guardar los elementos que tiene como hijo y los pone en el texto
vamos a GameManager

Ahora comprobaremos cuando no queden collectables para poder "pasar de nivel". En el GameManager.cs: 

 Cuando sea menor o igual a 0 pondrá Win en la consola.
KillZone por si se sale la bola del plano.
añadimos un nuevo script y especificamos que si colisionamos con player, y pilla la escena que está actualmente cargada
  • GetActiveScene() ➜ obtiene la escena actual
  • buildIndex ➜ el número de esa escena en el Build Settings
  • LoadScene(...) ➜ carga esa escena
Tendremos que ir a File - Build Profile y allí añadir el nivel1 (dentro de scenes) en SceneList se puede arrastrar

luego añadimos el script a nuestra Killzone (objeto) y ya funcionará
luego duplicamos el nivel, cambiamos las bolas y 

en el codigo en GameManegement importamos la libreria de UnityEngine.SceneManagement; y añadimos:


como llamamos al build, tenemos que poner el nivel 2 alli 

el buildIndex es lo que la derecha 
Para hacer que te siga un bichito necesitamos una IA. 
Iremos a Window - Package Manager (hay assets de todo tipo funcionalidades que se pueden instalar)
Unity Registry y buscar AI Navigation (sale instalada ya)

creamos una esfera enemiga, le añadimos material y le añadimos el componente Nav Mesh Agent
tenemos que indicarle la area y que no se coma las bolas etc.

añadimos un nuevo objeto empty, lo llamamos NavMeshSurface y le añadimos un componente que se llame igual. 

añadimos en la KillZone un component NavMeshModifier y lo ponemo en Mode Remove

Si volvemos a NevMeshSurface y clickamos en el modificar en "bake" se vera por donde podrá pasar. Como nuestra bola Jugador va a moverse: eliminamos al jugador, volvemos a hacer "Bake" y hacemos control Z para recuperar al jugador. (truqui)

creamos otro script que se llame enemigo y se lo asignamos a enemigo 
abrimos variable navMeshAgent para poder ponerle un destination que será nuestro jugador

El NavMeshAgent se encarga de:
  • Mover al enemigo
  • Evitar obstáculos
  • Seguir caminos del NavMesh
La variable Transform se usará para saber dónde está el jugador
  • Busca en la escena un objeto que tenga el script Jugador
  • Obtiene su transform
  • Lo guarda para usarlo luego
El Transform es un componente que todos los GameObjects tienen en Unity.
Sirve para decir dónde está, cómo está girado y qué tamaño tiene un objeto en la escena.



A cada frame irá a por el jugador con destination y copiamos y pegamos del KillZone lo que hace al colisionar (reiniciar el juego)

Se podrá modificar la velocidad del enemigo dentro del objeto Enemigo en el NevMeshAgent. 

se puede copiar y pegar en la segunda escena, pero se tendra que volver a hacer el bake de NevMeshSurface. En "KillZone" tambien se tendra que poner NevMesh Modifier (como componente) y ponerlo en modo remove object. se puede añadir mas de un enemigo

file - new scene - basic built in
añadimos un texto y ya se crea el canvas. En el canvas lo primero es poner Scale with Screen Size para que se escale segun la pantalla

se puede añadir un panel poniendolo primero para que salga al fondo

para meter una imagen creamos una nueva carpeta en assets la llamamos images y podemos arrastrar la imagen que queramos poner. Dentro de la imagen tenemos que cambiar Texture Type a Sprite (2D and UI). 

añadimos unan rawImage (dentro de UI) y en texture seleccionamos la imagen. Para que se ponga en toda la pantalla con el tamaño actual lo hacemos desde los anchor (abajo a la izquierda). 

creamos el menu, lo guardamos con un nombre (MainMenu) y lo añadimos en build.

creamos un script MainMenu abrimos el script y

los botones deben ser publicos


se puede asignar al canvas o a un objeto vacio (en este caos canvas)

En el boton de play hay una parte que pone OnClick, añadimos (con el +) y tenemos que meter el objeto que tiene asignado el script (en este caso canvas) y alli seleccionamos la funcion play()del script que como es publico sale. 

para la pantalla de victoria nueva escena - basic
añadimos lo que sea y lo metemos  a buildsettings

haremos un script para que despues de 2secs vuelva al menu principal Mainmenu




se asigna al canvas

PARA LA ESTELA
Arrastramos el jugador a la carpeta Prefab
click derecho en jugador (en jerarquia) y añadir effects - trail

se puede hacer difuminado y modificar el tamaño y tiempo

se puede jugar con texture mode
para añadirselo al prefab tenemos que ir a overrides  y darle a aplicar a todo (en jugador)
iriamos al nivel2 y meteriamos el prefab (borrando el jugador anterior)
AUDIOS
creamos una carpeta nueva en assets llamada audio

vamos a hacer un prefab de gamemanager (por ej. cogiendolo del nivel1. para hacerlo le quitamos los collectibles que contiene antes para que no salgan en el prefab y una vez puesto en prefab ya podemos volver a ponerlos (no hacer override pk los collectible en cada lvl son distintos)

abrimos el GameManager de prefav y añadimos componente audio source (permite meter un audio y podemos cambiar el volumen etc)

seleccionamos el audio en Audio Generator y deseleccionamos el "Play On Awake"


En el script de AudioSource añadir variable
    public AudioSource audioSorce;

y en la funcion Addcollectible añadir el ruido
        audioSorce.Play();

ahora en el GameManager inspector arrastramos el componente audio Source en la variable que ha salido en el script Audio Sorce:

y añadir tambien las otras variables (textCollectiblesNumber y Totales)
sino saldrá este error:

MUSIC MANAGER

vamos a MainMenu
Creamos un objeto Empty con el nombre MusicManager y un script con el mismo nombre
se lo asignamos el script al objeto

lo que hace es instanciar la musica y que no se borre al pasar de pantalla

por otro lado al MusicManager le añadimos el componente audio source 
como queremos que se inicie al empezar el videojuego dejamos seleccionado el Play On Awake y seleccionamos tb el loop 

ponemos el audio en audioclip y reducimos el volumen para que se oiga de fondo

para hacer el ejecutable vamos a File - Build Settings
en scene list comprobar escenas
en windows hay una pestaña de player settings se podria poner nombre del juego, company, se podria poner icono del ejecutable, version 

en resolution and presentation se puede cambiar si se inicia en pantalla completa o en ventana

apretamos en build y creamos una carpeta build para guardar el ejecutable alli
(a la siguiente vez tardara menos pk ya tendra ciertas cosas hechas carpetas etc)

Es importante que si se pasa el ejecutable sea con la carpeta de build entera, no solo el ejecutable