Tanques

Curso de Unity 3D

20.  
23.  
25.  
38.  

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 usuarios 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ñonnes, así que definiremos dos variables estática 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ógia de acción del cañón debe estar supedidata a que sea su turno:

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

7. Cuando una bala de cañón colisione contra el cañón, pasaremos al siguiente turno.

...
StartCoroutine(EndTurn());
...

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

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

private void OnCollisionEnter2D(Collision2D collision)
{
    string collisionedName = collision.gameObject.name;
    //La segunda condición de este if comprueba que la bala no chocó contra el cañón que disparó
    //Para comprobarlo, debemos cambiar dinámicamente el nombre de la bala en el momento de su instanciación
    if (collision.gameObject.tag =="Player" && collisionedName != name)
    {
      string counterName = collisionedName + "Counter";
      int.TryParse(GameObject.Find(collisionedName + "Counter").GetComponent<TextMeshPro>().text,out int n);
      GameObject.Find(name + "Counter").GetComponent<TextMeshPro>().text =""+( n + 1);
    }
}

9. Tomaremos la potencia de disparo de un input, y en función de ella le daremos potencia a la bala.

int.TryParse(transform.Find("Canvas").Find("Input").GetComponent<TMP_InputField>().text, out int force);
ball.GetComponent<CannonBall>().AddForce(force);
← Cambiar el punto de pivote
Exportar / importar Assets →

Aviso Legal | Política de privacidad