Computación Gráficasoftware de videojuegos unityTecnologíaVideojuegos

The Truman Show Videojuego – Android Unity 3D

Introducción

El desarrollo de videojuegos Unity en 3D se ha convertido en una habilidad esencial dentro del campo de la computación gráfica y la programación. Unity, una de las plataformas más populares y versátiles para la creación de videojuegos, ofrece herramientas robustas para diseñar y desarrollar juegos inmersivos y de alta calidad. Esta guía está diseñada para estudiantes y profesionales que deseen incursionar en el mundo del desarrollo de videojuegos Unity en 3D, utilizando herramientas complementarias como Blender y Mixamo para la animación de personajes.

Contenido

Esta guía proporciona un enfoque paso a paso, comenzando con la configuración inicial de Unity, pasando por la creación y animación de personajes, y culminando con la implementación de mecánicas básicas y configuraciones de escena. Además, se incluyen preguntas y actividades para afianzar los conocimientos adquiridos, facilitando un aprendizaje interactivo y aplicado.

Objetivo

El objetivo principal de esta guía es no solo enseñar los aspectos técnicos del desarrollo de videojuegos Unity en 3D, sino también inspirar la creatividad y la innovación en los desarrolladores, alentándolos a explorar nuevas posibilidades y a superar los desafíos que puedan surgir en el proceso de desarrollo. Con esta guía, los lectores estarán equipados con las habilidades necesarias para crear sus propios videojuegos 3D, desde la conceptualización hasta la ejecución final.

  1. Implementación

Paso 1 

Abrimos Unity, le damos click en add Project, luego tenemos que escoger que sea para 3D, le colocamos el nombre al proyecto que le queramos dar y le damos click en donde dice Create Project 

  • Cuando se cargue se verá algo así

Paso 2

Pasaremos hacer una configuración adicional antes de empezar con la construcción del videojuego y es la siguiente nos vamos a la pestaña de File en Unity y le damos click donde dice Build Settings y le damos click donde dice Android y por último le damos click donde dice Switch Platform 

Paso 3

Ahora vamos a la siguiente opción que se llama Player Settings, vamos a donde dice player y vamos a la opción que dice Settings for Android / Active for Handing seleccionamos el Both y le damos click en guardar (apenas lo hagas el mismo unity se reiniciara solito, recuerda guardar siempre)

Paso 4

Ahora una vez se nos haya abierto otra vez el unity vamos nuevamente a Project Settings a la parte de Player y buscamos la opción llamada Allowed Orientation for Auto Rotation y desmarcamos la opción de Portrait y Portrait Upside Down, esto se hace ya que el juego lo haremos adaptado para móvil pues vamos a querer siempre tenerlo en horizontal 

Paso 5 

Vamos a la página llamada cgtrader esta pagina es para poder buscar nuestros personajes que vamos a utilizar el paquete que vamos a utilizar es este, no se tiene en cuenta el unity store ya que los precios de los paquetes son muy elevados por otro lado el más barato cuesta 13 dólares y solo viene 5 personajes en cambio el que se seleccionó viene más de 30 personajes que va a venir perfecto para adaptarlo al juego que vamos hacer

Paso 6 

Descomprimimos la carpeta que se nos descargó con los assets que compramos, para eso creamos una nueva carpeta ya que por el momento solo vamos a seleccionar el personaje principal, se selecciona el c21 ya que es la carpeta que mas completa viene por lo tanto se nos facilita el personaje ya que viene ya con la animación y el modelo incluido 

Paso 7

Ahora lo que vamos hacer es convertir el archivo que tenemos del personaje de dae a fbx para eso se hace mediante la pagina llamada 3D-CONVERT, ya que con esta conversión nos servirá para poderlo exportar en Mixamo

Paso 8

Vamos a Mixamo y subir el character que nosotros convertimos a fbx

Parte 9

Una vez hecho eso lo que haremos será escoger las animaciones que vamos a querer para el personaje, es importante dejar dos opciones, la primera es la parte de la skin es importante dejarla con la opción de With Skin y la otra opción que también es importante es la de Keyframe Reduction tenemos que fijarnos que tenga la de uniform, esto es mas que todo para que se nos descarga la animación con la skin del personaje que subimos a Mixamo

Paso 10

Creación de la carpeta llamada Character dentro de la carpeta llamada Assets 

Paso 11

A esa carpeta seleccionamos todas las texturas que tenemos, seleccionando el personaje que será nuestro personaje principal 

Paso 12

Ahora de la misma manera hacemos con las animaciones que descargamos las seleccionamos y las colocamos en la carpeta anterior

Paso 13

Una vez hecho eso lo que vamos hacer es apartar las animaciones de los modelos que se nos descargo de Mixamo solamente utilizaremos las animaciones de cada modelo y nos quedara algo así 

Paso 14 

Ahora lo que hacemos es que al personaje le vamos a relacionar un Animator, para poderle asociarla un Animator Controller

Paso 15

Configurando el animator y aplicándole configuración sencilla al animator, esto se hace creando un nuevo parámetro llamado Running, este parámetro es bolean, entonces si Running es true pues significa que puede correr por lo tanto hará la animación de correr pero si Running es false quiere decir que no puede correr porque probablemente el personaje esta quieto entonces que haga la animación del idle que fue la que descargamos anteriormente

Paso 16

Ahora lo que vamos hacer es configurar el joystick vamos al Asset Store y nos descargamos este paquete 

Paso 17 

Cuando lo tengamos descargado lo que vamos hacer es darle en el botón que dice import e importamos todo

Paso 18 

Para agregar el joystick es tan fácil y sencillo como agregarlo a un canva y colocar el prefabs que queramos dentro del canvas como hijo 

Paso 19

Configuración del jostick y controlador de Camara, lo que hacemos es que tenemos que meter el joystick que nos descargamos dentro de un canva entonces vamos y hacemos eso

Paso 20

Una vez que tenemos el jostick en el canva procedemos a crear un script para manejar la parte del jostick y procedemos también a configurar la cámara, nuestro caso crearemos un archivo llamado PlayerController donde haremos la configuración del joystick

PlayerController

Script para el archivo de CameraController

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

public class PlayerController : MonoBehaviour
{
   
    [SerializeField] private FixedJoystick joystick;
    [SerializeField] private Animator animator;
    [SerializeField] private float moveSpeed;
    [SerializeField] private float _jumpForce;
    [SerializeField] private Transform _cameraTransform;
    [SerializeField] private bool Grounded;


    private float _maxFallSpeed = 20f;
    private float _currentFallSpeed = 0f;

    private CharacterController _controller;
    private Vector3 _moveDirection = Vector3.zero;
    private float _vertical;
    private float _horizontal;

    private void Start()
    {
        _controller = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {

        _vertical = joystick.Vertical + Input.GetAxis("Vertical");
        _horizontal = joystick.Horizontal;

        Vector3 cameraForward = Vector3.Scale(_cameraTransform.forward, new Vector3(1, 0, 1)).normalized;
        Vector3 moveDirection = _vertical * cameraForward + _horizontal * _cameraTransform.right;

        _moveDirection.x = moveDirection.x * moveSpeed;
        _moveDirection.z = moveDirection.z * moveSpeed;

        if (_controller.isGrounded)
        {
            _currentFallSpeed = 0f;

            if (Input.GetKeyDown(KeyCode.Space)) jump();

                foreach (Touch t in Input.touches) if (t.tapCount == 2) jump();
        } else
        {
            _moveDirection.x *= 0.7f;
            _moveDirection.z *= 0.7f;

            if(_moveDirection.y < -_maxFallSpeed)
            {
                _moveDirection.y = -_maxFallSpeed;
            }
            else
            {
                _currentFallSpeed += Time.deltaTime * 20;
                _moveDirection.y -= _currentFallSpeed* Time.deltaTime;
            }
        }

        if (_horizontal != 0 || _vertical != 0)
        {
            transform.rotation = Quaternion.LookRotation(new Vector3(_moveDirection.x, 0, _moveDirection.z));
        }

        _controller.Move(_moveDirection * Time.deltaTime);

        animate();



    }

    private void animate()
    {
        animator.SetBool("Grounded", _controller.isGrounded);

        if (_controller.isGrounded)
        {
            animator.SetBool("Jump", false);
            if (_horizontal != 0 || _vertical != 0)
            {
                animator.speed = Mathf.Min(Mathf.Max(Mathf.Abs(_vertical), Mathf.Abs(_horizontal)) + 0.1f, 1);
                animator.SetBool("Running", true);
            }
            else
            {
                animator.speed = 1;
                animator.SetBool("Running", false);
            }
        }
    }

    private void jump()
    {
        _currentFallSpeed = 3;
        _moveDirection.y = _jumpForce;
        animator.SetBool("Jump", true);
    }


}

Paso 21

Antes de colocar el script al componente de nuestro muñeco lo que vamos hacer es que vamos a crear un script para la cámara ese script nos va a permitir poder perseguir siempre al muñeco lo que nos servirá para cada vez que se mueva

Imagen del archivo del script de camera controller

CameraController

The Truman Show Videojuego – Android Unity 3D

using System;
using UnityEngine;
public class CameraController : MonoBehaviour
{
    [SerializeField] private Transform _target;
    [SerializeField] private float _distance;
    [SerializeField] private float _height;

    private float _currentRotationAngle;
    private float _currentHeight;
    private Quaternion _currentRotation;
    private float _currentDistance;

    void Update()
    {

        if (Application.platform == RuntimePlatform.Android)
        {
            foreach (Touch t in Input.touches)
            {
                if (t.phase == TouchPhase.Moved && t.position.x > Screen.width / 3)
                {
                    _currentRotationAngle += t.deltaPosition.x * 0.4f;
                    _currentHeight -= t.deltaPosition.y * 0.01f;
                    _currentHeight = Mathf.Min(Mathf.Max(_currentHeight, -1.5f), 1.5f);
                }
            }
        }
        else if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)
        {
            if (Input.GetMouseButton(0) && Input.mousePosition.x > Screen.width / 3)
            {
                _currentRotationAngle += Input.GetAxis("Mouse X") * 6;
                _currentHeight -= Input.GetAxis("Mouse Y") * 0.2f;
                _currentHeight = Mathf.Max(_currentHeight, -1.5f);
                _currentHeight = Mathf.Min(Mathf.Max(_currentHeight, -1.5f), 1.5f);
            }
        }
        //Calculate current rotation angle and height
        _currentRotation = Quaternion.Euler(0, _currentRotationAngle, 0);
        _currentHeight = Mathf.Clamp(_currentHeight, -20, 80);
        Vector3 idealPosition = _currentRotation * Vector3.forward * _distance;
        if (Physics.Raycast(_target.position + new Vector3(0, 0.5f, 0), -idealPosition,
                out RaycastHit hit, _distance) && hit.transform.tag != "Player")
        {
            _currentDistance = Vector3.Distance(_target.position, hit.point);
        }
        else
        {
            _currentDistance = _distance;
        }
        Vector3 targetPosition = _target.position - _currentRotation * Vector3.forward * _currentDistance;
        targetPosition.y = _target.position.y + _height + _currentHeight;

        //Set the camera position and rotation
        transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * 20f);
        transform.LookAt(_target.position + Vector3.up * 1.5f);
    }
}
  • Este archivo se tiene que agregar al componente llamado Main Camera, cuando se agrega al objeto de acuerdo al código toca agregarle la distancia y la altura y aparte tambien tenemos que pasarle un target en nuestro caso le pasamos el target de nuestro personaje principal llamado Main Character Body
Main Camera Game Object

Paso 22

Antes de seguir dándole mas funcionalidades al personaje lo que hacemos es que vamos a crear un  animator para el personaje esto nos va a servir para colocar animaciones tales como: Correr, Saltar y Caer, para esto utilizamos parámetros bolean, a su vez para algunas condiciones se le quito el (Has Exit Time).

Hay que recordar que para cada estado se tiene que colocar la animación que se sacó de mixamo

Animación correr

Flujo de animator completo para el personaje

esto básicamente funciona de la siguiente manera tenemos ya básicamente 3 parámetros dichos parámetros son bolean, dentro del animator lo que se hace es que se crea un nuevo estado y a ese estado se le agregan las animaciones que habíamos descargado anteriormente de Mixamo

Explicación de la funcionalidad del Animator Controller

  • Idle -> Running: La transición se realiza cuando el parámetro Running es true. Si Running es true, el estado cambia a Running y se reproduce la animación correspondiente.
  • Running -> Idle: La transición se realiza cuando el parámetro Running es false. Si Running es false, el estado cambia a Idle y se reproduce la animación correspondiente.
  • Running -> Jump: La transición se realiza cuando el parámetro Jump es true. Si Jump es true, el estado cambia a Jump y se reproduce la animación correspondiente para saltar.
  • Running -> Falling: Para realizar esta transición, se deben considerar dos parámetros: Grounded y Jump. La transición se produce si ambos parámetros, Grounded y Jump, son false. Si ambos son false, el estado cambia a Falling y se reproduce la animación correspondiente para caer.
  • Jumping -> Running: Para realizar esta transición, se deben considerar dos parámetros: Grounded y Jump. La transición se produce si ambos parámetros, Grounded y Jump, son true. Si ambos son true, el estado cambia a Running y se reproduce la animación correspondiente.
  • Jumping -> Idle: Para realizar esta transición, se deben considerar dos parámetros: Running y Grounded. La transición se produce si el parámetro Running es false y el parámetro Grounded es true. Si Running es false y Grounded es true, el estado cambia a Idle y se reproduce la animación correspondiente.
  • Jumping -> Falling: La transición se realiza cuando el parámetro Grounded es false. Si Grounded es false, el estado cambia a Falling y se reproduce la animación correspondiente para caer.

Paso 23

Ahora sí viene lo divertido tenemos que quitar la parte de rigibody no lo utilizamos ya que a veces nos da dolores de cabeza y aparecen comportamientos extraños por ello se decidió mejor trabajarlo con un componente llamado Character Controller, con esto se puede sustituir la fisica del rigibody ese componente se le agrega al gameObject del personaje

Paso 24 

Ya teniendo la funcionalidad mínima del personaje y de ver que si estaba funcionando como se esperaba se procede agregar el mapa, el mapa se sacó de asset store uno llamado Slavic Medieval Environment, se toma esto mas que todo por tema de velocidad si nos ponemos a crear un Terrain desde cero podemos estar hasta horas haciendo ese terreno, aparte de eso esa librería o package esta gratis

Paso 25

Una vez se descarga del Aseet Store lo que hacemos es que la importamos desde nuestro Package Manager e importamos todo

Una vez lo importamos lo que hacemos es ir a nuestros Asset al nombre de la carpeta que se nos importo, prácticamente ahi de todo tenemos, texturas, también tenemos ya prefabs configurados, es una ayuda muy grande contar con este tipo de ayudas si lo hubiéramos hecho nosotros solos nos hubiera tomado mucho más tiempo

Paso 26

Creamos todo el ambiente del mapa del videojuego y ajustamos el personaje y la cámara 

lo que hicimos es que acomodamos el mapa teniendo en cuenta para donde giraba el muñeco ya que si cambiaba de rotación se nos modifica el script que habíamos realizado anteriormente para el seguimiento de la cámara al jugador

Paso 27

Creación de prefabs para el tema de los items que queremos que el muñeco recoja, en primer lugar creamos el prefab llamado Energy Core, este prefab nos simulara que es una zanahoria

Paso 28 

Para el prefab se tiene que crear una animación una para que gire y aparte de eso se le agrega  un Halo

aparte del halo se le hace una configuración al particle system, dicho particle system se le cambia a cono

Paso 29 

Se crea dentro del GameObject llamado Energy Core un nuevo gameObject llamado camera esto lo hacemos para hacer la simulación de la camara cuando el personaje absorbe una zanahoria, a dicho gameObject tambien se le asigna un Animator 

Paso 30 

Se hace la importación de otra animación de mixamo, esta animación lo que hace es celebrar cada vez que el personaje absorba un EnergyCore, tanto el VictoryModel, el camera, y el particle System se desmarcan esto se hace ya que lo queremos ocultar con un script haremos la activación de esos GameObject, hay que recordar que la idea de cada componente que vemos que es re utilizable lo volvemos un prefab eso se hace para después utilizarlo con las mismas animaciones en otra escena (toca tener cuidado de cómo editan el prefab ya que si lo hacen  en un prefab que está compartiendo con otro en otra escena entonces se modificarán los dos lados si el prefab va a estar diferente es mejor hacer control + D para hacer un duplicado a ese prefab)

Paso 31

Agregando la escena del Main Menu – en nuestro caso la llamamos Inicio 

esto se hace gracias a un canva que agregamos en la escena y lo combinamos con el Panel a su vez dentro del Panel lo que hacemos es agregar botones tal cual como se ve en la imagen dicho botones nos servirán para poder comunicarnos con otra escena

Paso 32 

Creación de la escena de créditos

se hace de la misma manera la única diferencia es que nosotros mismo creamos todo la parte del background donde se nombra la universidad, los autores que lo hicieron mas el trabajo para quien iba dirigido

Paso 33 

Creación de la escena final

se hace lo mismo que en las escenas anteriores, el script es el mismo simplemente se agrega un nuevo archivo de script y se hace el código que ya se ha venido mostrando anteriormente debe volvernos a la escena que necesitamos

Paso 34

Agregar las fichas de ajedrez en prefab esto se va hacer para poder reutilizar en el nivel 2, con esto vamos a poder utilizar las animaciones que se tienen para dichas fichas, esto se coloca en las carpetas de prefabs, creamos una nueva carpeta llamada ChessPiecker y ahí agregamos las fichas que necesitamos con sus respectivas animaciones 

Paso 35 

Vamos a empezar a construir el nivel 2 para esto se crea una nueva escena en el cual la vamos a llamar escena 2, pero antes de eso lo que vamos a necesitar es ir a la asset store y descargar el paquete llamado LowpolyBrickHouses, este nos va a servir también para la creación del mapa del segundo nivel

Paso 36 

Una vez realizado eso lo que vamos a hacer es ir nuevamente al Package Manager y vamos a importar el paquete que estamos agregando anteriormente una vez eso, dentro de asset se nos va a crear una nueva carpeta llamada BrokenVector y ahí es donde estará los paquetes que vamos a necesitar para agregar a nuestro nuevo mundo del nivel 2 (esto si lo pueden hacer al gusto de cada uno es solo de los paquetes descargados colocarlos como uno quiera y ya)

Paso 37

Como ya se ha venido explicando anteriormente en la carpeta de prefabs ya tenemos varias cosas entonces lo que se va hacer ahora es que se va a colocar los mismos paquetes que se tenía para el nivel 1 la única diferencia es que si quiere pasar de nivel lo que tiene que hacer es comer 8 panes si come 8 panes si podrá pasar de nivel

Paso 38 

Una vez finalizado la colocacion de los objetos que queremos para que se ha divertido el nivel, lo que vamos hacer es que vamos a ir a la carpeta de los scripts y vamos abrir el script que se llama Control 

Paso 39

Una vez abierto el archivo de Control lo que vamos hacer es que dentro del método de void Start vamos a colocar una nueva variable que en nuestro caso se llamará bread y se inicia liza en 0, después vamos a crear un nuevo método llamado AddBread que nos contendrá la lógica para sumando los panes absorbidos, y que después de 8 entonces me mande a otra escena 

Código del script de la función de AddBread()

public static void AddBread()
{
    c.bread++;

    c.breadUI.text = c.bread + "";

    if(c.bread == 8)
    {
        // Obtener el índice de la escena actual
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;

        // Calcular el índice de la siguiente escena
        int nextSceneIndex = currentSceneIndex + 1;

        // Verificar si la siguiente escena existe en los build settings
        if (nextSceneIndex < SceneManager.sceneCountInBuildSettings)
        {
            // Cargar la siguiente escena
            SceneManager.LoadScene(nextSceneIndex);
        }
        else
        {
            Debug.Log("No hay más escenas para cargar.");
        }
    }

}

Paso 40

Una vez agregado esta funcion en el script de Control lo que vamos a hacer es que vamos a crear un nuevo archivo de script llamado Bread, dicho archivo de script lo que va hacer es que nos va a servir para recoger los panes validar que sean 8 y darle animacion al pan y por ultimo lo que hara es destruir el game object 

Código del script del archivo de Bread

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

public class Bread : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    private void OnTriggerEnter(Collider c)
    {
        if (c.CompareTag("Player"))
        {
            Control.AddBread();
            Animate.PotatoIn();
            Destroy(this.gameObject);
        }
        
    }
}

Paso 41

Como se hizo en el nivel anterior y es que se va a crear el script de Bread a cada componente del pan, esto para que funcione la parte del codigo que se agregó anteriormente

Paso 42

También como en el nivel anterior lo que vamos hacer es agregar al componente el script llamado Player Controller esto para que funcione la parte de la cámara, del joystick, la velocidad y salto 

Paso 43

Creamos una nueva escena que diga Nivel 3, donde vamos a crear nuestro último nivel

Paso 44

Vamos nuevamente a la asset store y vamos a buscar un nuevo paquete llamado StarterAssets, le damos click en el botón que dice Add to My Assets 

Paso 45

Vamos nuevamente a Package Manager le damos es descargamos y después lo importamos, esto se nos colocara igualmente en assets en una carpeta llamada StarterAssets

Paso 46

Ahora lo que vamos hacer primero que todo es importar el personaje mas que todo que si recordamos lo tenemos en la carpeta llamada Characters dentro de Main Characters, vamos agregar dicho personaje

Paso 47

Lo que hacemos ahora es que vamos a hacer la parte del mapa con el paquete que descargamos de StarterAssets, esto ya se crea al gusto 

Paso 48

Lo que haremos ahora es agregar la union del personaje que estamos utilizando anteriormente al mapa que acabamos de hacer, vamos a ubicar el personaje dentro del mapa 

Paso 49

Lo que vamos a hacer ahora es que vamos agregar unos componentes al personaje que vamos a utilizar como el animator el script correspondiente y el character controller, esto se hace para que pueda seguir funcionando como ha funciona anteriormente 

Paso 50 

Antes de agregar el script lo que vamos hacer es que vamos agregar el canva donde tendremos la parte del joystick, entonces vamos a hacer eso 

Paso 51

Lo que vamos hacer ahora es colocar el timer los fps los objetos que queremos que recoja para este nivel la idea es que sí recoge los 6 objetos entonces ya gana y se acaba el juego pero si no lo logra durante 10 minutos entonces pailas se le vuelve a reiniciar el mapa

Paso 52

Ahora lo que haremos será colocar los scripts correspondientes para la parte del canvas que básicamente es la parte de la animación de cada ítem que colocamos también es la contabilización del tiempo y el cálculo de cada fps que tenemos en el móvil

Paso 53

Ahora lo que vamos hacer es que vamos agregar todos los elementos que queremos para este nivel, para este nivel vamos a tener todos pero la idea es que los peones sean los mas importantes ya que son los que nos hacen acabar dicho juego

Paso 54

Ahora lo que vamos hacer es que vamos ajustar el código, así que abrimos el script de control y vamos a la función de AddChessPieces para que cada vez que completen la mesa de ajedrez ya finalice el juego

Código de la función de AddChessPieces

public static void AddChessPieces(byte piece)
{
    c.ChessPieces[c.world, piece] = true;

    if (Control.CheckChessPieces())
    {
        Debug.Log("All chess pieces collected! Changing scene.");

        // Obtener el índice de la escena actual
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;

        // Calcular el índice de la siguiente escena
        int nextSceneIndex = currentSceneIndex + 1;

        // Verificar si la siguiente escena existe en los build settings
        if (nextSceneIndex < SceneManager.sceneCountInBuildSettings)
        {
            // Cargar la siguiente escena
            SceneManager.LoadScene(nextSceneIndex);
        }
        else
        {
            Debug.Log("No hay más escenas para cargar.");
        }
    }
}

este código lo que hace principalmente es evaluar que exista más escena después de la de nosotros y esto lo valida desde la pestaña de Build Settings, esto es importante porque toma en cuenta el orden que tenga las escenas en nuestro caso el orden de las escenas por el momento va así 

Paso 55

Creación de la escena de instrucciones, para esto vamos a crearlo personalizada mente para ello lo que vamos hacer es primero hacer un Card de cada nivel como son 3 serán 3 cards para esto nos vamos apoyar en Figma

Paso 56

Lo que se necesita ahora es personalizar estas cards en una sola imagen con el tema de las instrucciones para ello nos vamos ayudar de un powerpoint 

Paso 57

Ahora procederemos a crear una nueva escena llamada Instrucciones y la vamos a colocar al principio del juego para que el usuario vea que es lo que tiene que hacer 

Script que nos permite el dicho cambio de escena

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

public class Irinstrucciones : MonoBehaviour
{
    public void Instrucciones()
    {
        SceneManager.LoadScene("Instrucciones");
    }
}

Paso 58 

En la nueva escena que se creó lo que se va hacer ahora es crear un nuevo canva y a ese mismo canva le agregamos el botón y el fondo con el que terminamos de hacer en powerpoint, para exportar una imagen a la parte de 3d se tiene que hacer de esta manera

entonces lo que se tiene que hacer es que en Texture type se le cambia a 2d y UI con eso ya después se puede colocar en la parte del panel y listo 

Paso 59

Creación del botón que nos va a permitir devolvernos al principio del juego y de su funcionalidad, esto se hace en la parte del panel que está en el canva 

Paso 60

Una vez se crea el botón y se crea el script que nos va a servir para este caso para irnos a la escena de jugar entonces se crea un empty object y ahí se mete el script que vamos a utilizar 

Script para Jugar de nuevo

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class JugardeNuevo : MonoBehaviour
{
    public void JugarDeNuevo()
    {

        SceneManager.LoadScene("Nivel 1");
    }
}

Paso 61 

Ahora lo que se hace es que ese gameObject se agrega en la acción del onClick del botón y buscamos la función que hicimos para hacer el cambio de escena 

Recordar siempre mirar que nuestro Builds Settings siempre tenga todas las escenas que vamos a utilizar sino entonces no servirá algunas configuraciones que hemos realizado 

Paso 62

Lo que vamos hacer ahora es la parte de generar el apk, pero antes de generar el apk lo que vamos hacer es que vamos hacer algunos ajustes en el Player Settings es mas que todo la parte de como queremos que se muestre nuestro juego, entonces vamos a la parte de Player Settings en la seccion de Player

es recomendable si no se tiene ninguna compañía o ninguna empresa que tenga asociación con unity entonces es mejor dejar el DefaultCompany, ya que si este juego lo que se quiere es comercializar si se tiene el nombre de una empresa Unity no lo deja hasta que actualice el plan de Empresa, por otro lado si es bueno manejar un versionamiento esto se hace es mas que todo para el tema de los relases ya que si se encuentra un bug pues uno lo puede corregir y después lo que hace es que actualiza ese versionamiento

Paso 63

Finalmente para terminar con la configuración del Player lo que necesitamos hacer también es Generar una Key esto se hace en la opción llamada Publishing Settings

Paso 64

Lo que haremos es ahora crear dicha contraseña tenemos que crear esa contraseña y se necesita también crear un alias, le damos click donde dice KeyStoreManager, le damos en la opción donde dice create new / anywhere y llenamos los datos y le agregamos el alias con su respectiva contraseña

Paso 65

Agregamos la contraseña que hemos creado con su respectivo alias y contraseña pero tenemos que estar seguros de que marcamos el Custom KeyStore, si esto no se hace el build no nos va a dejar generar el APK

Paso 66

Una vez hecho eso lo que hacemos es darle click en donde dice Build, esto nos abrirá el explorador de archivos y nos dirá donde queremos guardar y con que nombre, es importante dejar la extensión .apk, le agregamos un nombre y le damos en guardar

Paso 67

Una vez terminado la parte del build lo que va hacer es que nos va a dejar el apk en la ruta que se selecciono y ya estará listo para jugar tenemos que tener en cuenta que para nuestro caso este vídeo juego solo va a poder servir para dispositivos android desde el 7 en adelante si un android con menor al 7 intenta abrir el juego no lo va a dejar por la parte de configuración que se le hizo

Resultado Final

  1. Referencias 

Unity. (n.d.). Free Slavic Medieval Environment – Town Interior and Exterior [Unity Asset Store]. Unity Technologies. Retrieved May 25, 2024, from

https://assetstore.unity.com/packages/3d/environments/fantasy/free-slavic-medieval-environment-town-interior-and-exterior-167010

Unity. (n.d.). Forest Low Poly Toon Battle Arena – Tower Defense Pack [Unity Asset Store]. Unity Technologies. Retrieved May 25, 2024, from https://assetstore.unity.com/packages/3d/environments/forest-low-poly-toon-battle-arena-tower-defense-pack-100080

Dev Ritch. (2024, mayo 23). Cómo cambiar de nivel y poner una barra de carga en Unity || Tutorial Unity 2024 [Video]. YouTube. https://www.youtube.com/watch?v=ZjNOphxQ1OM

YouTube. (n.d.). Resultados de búsqueda para “videojuego 3D Unity”. Retrieved May 25, 2024, from https://www.youtube.com/results?search_query=videojuego+3d+unity

Pinzón, R. (2024). Computación Gráfica – Instalación de Unity. Universidad Central