Tanques

Curso de Unity 3D

20.  
23.  
25.  
39.  

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, 30 * Time.deltaTime);

Utilizaremos un objeto de tipo enum para controlar las posibles acciones que puede realizar el jugador.

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.

Tanques 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;
}
← Cambiar el punto de pivote
Exportar / importar Assets →

Aviso Legal | Política de privacidad