jueves, 3 de junio de 2021

Como he hecho; el videojuego; Bombadron20;

 video tutorial

https://youtu.be/lMTKzf17kvs Bombadron20.

https://videojuegosenlineaasaco4.blogspot.com/p/juegadirectamente-bombadron20.html 

Boy a explicar como he hecho el videojuego Bombadron20.

El tema idea del videojuego es muy sencillo, un avión dron lanza unas bombas a unos camiones y al destruir cierta cantidad de ellos sale pantallazo de Misión complica, has ganado el videojuego en este caso al acumular mas de 20 camiones destruidos.

Necesitamos dos escenas la primera donde se desarrolla la accion del videojuego la e llamado ESCENA 1 .

Y la segunda donde sale el pantallazo con las letras que forman la palabra MISIÓN CUMPLIDA!!!!.

La e llamado Scenes/SampleScene.


E buscado por internet imágenes de satélite de poblaciones para hacer el fondo del videojuego donde circularan los camiones, los camiones son simples cubos con forma rectangular, las bombas que lanzo simples cylinder y el dron no se ve solo e puesto una cámara y desde esta e puesto como hijo un par de cubos que les e dado forma de cruz para hacer una mira telescópica.


El resto se resuelve mediante los scripts en C# y ciertos detalles con los gameobjects.

Intentare explicarme lo mejor que sepa y por partes.


Los gameobjects que tenemos en el videojuego son

1- el terreno donde esta la imagen de satélite de una ciudad---detalles de como esta echa...es un simple cubo, no un terreno, es un cubo que le dado forma de tabla de una mesa, tiene un box colider sin el trigger activado y otro idéntico pero con el trigger si activado, el motivo, necesidades de ciertas funciones del videojuego en este caso sumar puntos, contiene el siguiente escript…en C#.

 

 

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

public class SUMA21PASANIVELFINALPOINT : MonoBehaviour {


// Create public variables for player speed, and for the Text UI game objects
public float speed;
public Text countText;
public Text winText;

// Create private references to the rigidbody component on the player, and the count of pick up objects picked up so far
private Rigidbody rb;
private int count;/// <summary>



// At the start of the game..
void Start ()
{


// Assign the Rigidbody component to our private rb variable
rb = GetComponent<Rigidbody>();

// Set the count to zero
count = 0;

// Run the SetCountText function to update the UI (see below)
SetCountText ();

// Set the text property of our Win Text UI to an empty string, making the 'You Win' (game over message) blank
winText.text = "";
}


void OnTriggerEnter(Collider other)
{


if (other.gameObject.CompareTag ("balaamericano"))



{
// Make the other game object (the pick up) inactive, to make it disappear
other.gameObject.SetActive (false);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Add one to the score variable 'count'
count = count + 1;


SetCountText ();
}
}

// Create a standalone function that can update the 'countText' UI and check if the required amount to win has been achieved
void SetCountText()
{


countText.text = "POINT: " + count.ToString ();
// Check if our 'count' is equal to or exceeded 12
if (count >= 20)
// if (count >= 31) original
//if (count >= 99)
{
// Set the text value of our 'winText'
winText.text = "JUEGO COMPLETADO";

// Destroy (gameObject, 1.2f);

/////Application.LoadLevel (5);/////ORIGINALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
Application.LoadLevel (1);
}
}
}


2---Luego tenemos al camión que tiene unos scripts para darle movimientos continuos y unos scripts para ser destruido y para crear una explosión y a su vez soltar un nuevo gameobject nombrado con un tac que hace la suma de puntuación al tocar este, el terreno.

Scripts del camión .

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

public class mueberosalento : MonoBehaviour {

// Use this for initialization
void Start () {

}




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

transform.position += transform.forward * 4f * Time.deltaTime; }


}

-----------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------

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

public class cuborosadalavuelta : MonoBehaviour {

// Use this for initialization
void Start () {

}




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

//transform.position += transform.forward * 10.2f * Time.deltaTime; }

}


void OnTriggerEnter(Collider other) {
//if (other.gameObject.CompareTag ("avismo")){
//if (other.gameObject.CompareTag ("ogri2")){
if (other.gameObject.CompareTag ("datelavuelta")){



transform.position -= transform.forward * 1777.2f * Time.deltaTime; }



}
}


3-- Tenemos también unos cubos a donde se dirigen los camiones nombrados con el tac “datelabuelta”. .Hacen que con el script que tiene el camión aprezcaa de nuevo desde el otro lado del terreno una y otra vez continuamente.


4—Las bombas que lanza el dron, son simples cilindros a los que e colocado una cámara de forma que en una esquina de la pantalla se ve el recorrido de la bomba asta llegar al suelo, se activaba cada vez que soltamos una nueva….para no cargar la memoria estas tienen un script con un tac que hace se borre del videojuego, si no acabaría congelándose en pantalla el videojuego se pararía y saldría humo de todos los orificios del pc, (estoy exagerando ). tienen este script…

 

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

public class destruyeportacbalaamericana : MonoBehaviour {




//public AudioSource tickSource;


void Start () {

//tickSource = GetComponent<AudioSource> ();



}

void Update () {
}

void OnTriggerEnter(Collider other) {
//if (other.gameObject.CompareTag ("avismo")){
//if (other.gameObject.CompareTag ("ogri2")){
if (other.gameObject.CompareTag ("balaamericano")){
//transform.Rotate (new Vector3 (0 * Time.deltaTime, 91, 90), Space.Self);

//tickSource.Play ();
Destroy (gameObject, 0.0f);


}}

}


---------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------

El suelo donde tocan tiene este tac ...”balaamericano”.


Tenemos también el script que provoca el cambio de escena al haber sumado mas de 20 puntos…..

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

public class SUMA21PASANIVELFINALPOINT : MonoBehaviour {


// Create public variables for player speed, and for the Text UI game objects
public float speed;
public Text countText;
public Text winText;

// Create private references to the rigidbody component on the player, and the count of pick up objects picked up so far
private Rigidbody rb;
private int count;/// <summary>



// At the start of the game..
void Start ()
{


// Assign the Rigidbody component to our private rb variable
rb = GetComponent<Rigidbody>();

// Set the count to zero
count = 0;

// Run the SetCountText function to update the UI (see below)
SetCountText ();

// Set the text property of our Win Text UI to an empty string, making the 'You Win' (game over message) blank
winText.text = "";
}


void OnTriggerEnter(Collider other)
{


if (other.gameObject.CompareTag ("balaamericano"))



{
// Make the other game object (the pick up) inactive, to make it disappear
other.gameObject.SetActive (false);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Add one to the score variable 'count'
count = count + 1;


SetCountText ();
}
}

// Create a standalone function that can update the 'countText' UI and check if the required amount to win has been achieved
void SetCountText()
{


countText.text = "POINT: " + count.ToString ();
// Check if our 'count' is equal to or exceeded 12
if (count >= 20)
// if (count >= 31) original
//if (count >= 99)
{
// Set the text value of our 'winText'
winText.text = "JUEGO COMPLETADO";

// Destroy (gameObject, 1.2f);

/////Application.LoadLevel (5);/////ORIGINALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
Application.LoadLevel (1);
}
}
}

---------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

Esta parte hace dos cosas suma el marcador y hace el cambio.


Luego al pasar a la escena de juego ganado o misión cumplida hay un simple texto en ella con dicho mensaje y contiene un script en C# que tiene la aplicación descarga ble y gratuita que viene con unity la “TextMesh Pro”.

Contiene diversos scripts en C# que hacen efectos visuales en las letras…..


Volviendo a la escena de acción desde las cámara esta el script en C# que produce los disparos, es el siguiente….

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

public class launchermasvelocidad2 : MonoBehaviour {


public Rigidbody projectile;
public Rigidbody explosiveProjectile;
public float launchspeed = 50;
public bool useExplodingProjectiles = false;

private float _LaunchDelayTime = 0.0f;

public int stackSize = 60;
public Transform launchHole1;
public Transform launchHole2;

private Stack _Projectiles;
private Stack _ExplosiveProjectiles;
private Transform _myTransform;

// Use this for initialization
void Start ()
{
_myTransform = transform;
_Projectiles = new Stack();
if(useExplodingProjectiles)
{
_ExplosiveProjectiles = new Stack();
}

for(int i = 0; i < stackSize; i++)
{
Rigidbody tr = Instantiate (projectile, _myTransform.position, _myTransform.rotation) as Rigidbody;
PushProjectile(tr);

if(useExplodingProjectiles)
{
Rigidbody rr = Instantiate (explosiveProjectile, _myTransform.position, _myTransform.rotation) as Rigidbody;
PushExplosiveProjectile(rr);
}
}
}

// Update is called once per frame
void Update ()
{
if(_Projectiles.Count > 0)
{
if(Time.time > _LaunchDelayTime)
{


// if (Input.GetButton ("Fire1")) ////ametralladora
if (Input.GetButtonDown ("Fire1"))//// original tiro a tiro

{
Rigidbody tr = PopProjectile();
tr.gameObject.SetActive(true);
tr.transform.position = launchHole1.position;
tr.transform.rotation = launchHole1.rotation;
tr.velocity = transform.TransformDirection (Vector3.forward * launchspeed);

tr = PopProjectile();
tr.gameObject.SetActive(true);
tr.transform.position = launchHole2.position;
tr.transform.rotation = launchHole2.rotation;
tr.velocity = transform.TransformDirection (Vector3.forward * launchspeed);

_LaunchDelayTime = Time.time + 0.1f;
}
}
}

if(useExplodingProjectiles)
{
if(_ExplosiveProjectiles.Count > 0)
{
if(Time.time > _LaunchDelayTime)
{
if (Input.GetButtonDown ("Fire2"))
{
Rigidbody tr = PopExplosiveProjectile();
tr.gameObject.SetActive(true);
tr.transform.position = launchHole1.position;
tr.transform.rotation = launchHole1.rotation;
tr.velocity = transform.TransformDirection (Vector3.forward * launchspeed);

tr = PopExplosiveProjectile();
tr.gameObject.SetActive(true);
tr.transform.position = launchHole2.position;
tr.transform.rotation = launchHole2.rotation;
tr.velocity = transform.TransformDirection (Vector3.forward * launchspeed);

_LaunchDelayTime = Time.time + 0.5f;
}
}
}
}
}

public void PushProjectile(Rigidbody x)
{
x.gameObject.SetActive(false);
_Projectiles.Push(x);
}

public Rigidbody PopProjectile()
{
return (Rigidbody)_Projectiles.Pop();
}

public void PushExplosiveProjectile(Rigidbody x)
{
x.gameObject.SetActive(false);
_ExplosiveProjectiles.Push(x);
}

public Rigidbody PopExplosiveProjectile()
{
return (Rigidbody)_ExplosiveProjectiles.Pop();
}
}


-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

 

 

Y me dejaba el movimiento de la camara osea del dron por pantalla……..

 

 

 

 

 

 

 

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

public class desliza4sentidos : MonoBehaviour {


public float moveSpeed = 10f;
public float turnSpeed = 50f;


void Update ()
{



if (Input.GetKey(KeyCode.W))////funciona contantemente al apretar W mayusculas a de ser
//if (Input.GetKeyDown(KeyCode.W))// funciona pasito a pasito
//if(Input.GetKey(KeyCode.UpArrow))
//transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
transform.Translate(-Vector3.down * moveSpeed * Time.deltaTime);

if (Input.GetKey(KeyCode.S))////funciona contantemente al apretar W mayusculas a de ser
//if(Input.GetKey(KeyCode.DownArrow))
//transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
transform.Translate(Vector3.down * moveSpeed * Time.deltaTime);

if (Input.GetKey(KeyCode.A))////funciona contantemente al apretar W mayusculas a de ser
//if(Input.GetKey(KeyCode.LeftArrow))
transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);

if (Input.GetKey(KeyCode.D))////funciona contantemente al apretar W mayusculas a de ser

//if(Input.GetKey(KeyCode.RightArrow))
transform.Translate(-Vector3.left * moveSpeed * Time.deltaTime);
}
}



 

 

-----------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------

Este escrito por si solo es complicado de entender lo ampliare con un video explicativo….mas adelante...sin pausa ...pero sin prisa voy haciendo mi blog



https://youtu.be/lMTKzf17kvs

video tutorial