Juego de los tanques con Unity 3d

Curso de Unity 3D

21.  
40.  

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

1. A partir de un sprite cuadrado, deformarlo para crear un sprite rectangular.

2. Cambiar el origen de coordenadas del sprite, para que gire alrededor de su base.

3. Utilizar un código similar al siguiente para rotar el cañon cuando el usuario pulse las flechas de dirección:

transform.Rotate(0, 0, inputX 
* 30 * Time.deltaTime);

Tecla de espacio para disparar, flecihitas para mover el tanque y la potencia de disparo la escribes en el input.

4. Cuando el jugador pulse la tecla espacio, debería disparar una bala de cañón. Para ello instanciaremos la bala con la rotación del cañón:

Instantiate(cannonBall, transform.position, transform.rotation);

Y asociaremos a la bala un script que le dotará de una fuerza inicial:

public class CannonBall : MonoBehaviour{
  void Start(){
    GetComponent<Rigidbody2D>().velocity = transform.up * 5;
  }
}

5. Ahora crearemos un Empty llamado ShootPoint que tendrá las coordenadas donde queremos que se instancie la bola de cañón.

Juego de los tanques con Unity 3d 1
Instantiate(cannonBall, transform.parent.Find("ShootPoint").transform.position, transform.rotation);

6. Queremos que haya varios cañones, así que definiremos dos variables estáticas en el Cannon para controlar a quien le toca disparar:

static int totalInstances;
static int currentInstance;

Cada vez que un jugador termine su disparo, le tocará al siguiente, para ello usaremos el siguiente código:

IEnumerator EndTurn(){
    yield return new WaitForEndOfFrame();
    currentInstance = currentInstance == totalInstances - 1 ? 0 : currentInstance + 1;
}

Hemos metido el código que pasa al siguiente cañón en una corrutina para que sólo se ejecute cuando el frame haya terminado y que no haya peligro de que como el frame no ha terminado pasemos a la siguiente instancia, y se ejecute su disparo.

Toda la lógica de acción del cañón debe estar supedidata a que sea su turno:

void Update(){
    if ("Cannon"+currentInstance == name){

7. Recoger la fuerza de la bala de cañón de un Input.

Dentro del prefab del cañón crearemos un Input que nos permitirá introducir los datos.

El Canvas al que pertenecerá este Input tendrá un Render Mode de tipo World Space. Por tanto, tendremos que asignarle la Main Camera a este Canvas, lo cual haremos con el siguiente script:

[RequireComponent (typeof(Canvas))]

public class AutoAssignMainCam : MonoBehaviour{
    void Start(){
        GetComponent<Canvas>().worldCamera = Camera.main;
    }  
}

Definiremos el getter y setter de la fuerza para la bala de cañón:

public int power { get; set; }

Debemos asignar la fuerza de disparo a la bala de cañón:

if (controls == Controls.shoot){
     GameObject ball = Instantiate(cannonBall, transform.Find("ShootPoint").position, transform.rotation);
                      
     int.TryParse(transform.GetComponentInChildren<TMP_InputField>().text, out int power);
     ball.GetComponentInChildren<CannonBall>().power = power;
     StartCoroutine(EndTurn());
}

8. Aumentaremos el marcador de puntos del cañón que ha disparado cuando la bala impacte sobre el otro cañón.

CannonBall.cs
public GameObject player { get; set; }

private void OnCollisionEnter2D(Collision2D collision){       
        if (collision.gameObject.tag == "Player" && collision.gameObject.transform.parent.name != player.name){
            player.GetComponent<Player>().UpdatePoints();
        }
}
Player.cs
public void UpdatePoints(){
        points++;
        counter.GetComponent<TextMeshProUGUI>().text = "" + points;
}

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.