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