Snake

Curso de Unity 3D

21.  
25.  
36.  

1. Botón derecho en el panel de proyecto → 2D Object → Sprite.

2. Cargamos el sprite de un cuadradito blanco en el componente anterior.

2. Utilizamos el propio cuadrado para hacer los límites del area por el que s emoverá la serpiente.

Snake 1

3. Movimiento de la serpiente.

private void Start(){
    StartCoroutine(MoveCoroutine());
}

private void Move(){
    Vector3 nextPos = Vector3.up;
    transform.position += nextPos;
}

IEnumerator MoveCoroutine(){
    while (true){
      yield return new WaitForSeconds(0.5f);
      Move();
    }
}

4. Ajustamos la magnitud del movimiento de la serpiente a su tamaño.

float step;
...
step = GetComponent<SpriteRenderer>().size.x;
...
transform.position += nextPos * step;

5. Movemos la serpiente en función de las instrucciones del usuario:

enum Direction
{
    up,
    down,
    left,
    right
}

void Update(){
    if (Input.GetKeyDown(KeyCode.RightArrow)){
      direction = Direction.right;
    }
    ...

private void Move(){
    Vector3 nextPos = Vector3.zero;
    if (direction == Direction.left){
      nextPos = Vector3.left;
    }
    ...

6. Vamos a crear la cola de la serpiente. La cola de la serpiente será una lista de cuadrados que van siguiendo la posición de la cabeza. Para ello, almacenaremos la posición de la cabeza justo antes del movimiento en una variable llamada lastPos e iremos moviendo la cola a esa posición tras haber efectuado el movimiento de la cabeza.

public List<Transform> tail = new List<Transform>();
Vector3 lastPos;

private void Move()
{
    lastPos = transform.position;
    ...
    MoveTail();
}

 void MoveTail()
{
    for (int i = 0; i < tail.Count; i++)
{
      Vector3 temp = tail[i].position;
      tail[i].position = lastPos;
      lastPos = temp;
    }
}

Para probar este código:

  1. Duplicaremos varias veces la cabeza de la serpiente.
  2. Le eliminaremos el script a las cabezas duplicadas.
  3. Asignaremos estas cabezas duplicadas sin script a la propiedad tail de la cabeza.

7. La serpiente come y crece.

  1. Para que haya colisión entre dos objetos, al menos uno de los dos debe tener RigidBody. Normalmalmente, dicho RigidBody se añade al elemento que se mueve. Como hemos visto anteriormente, es recomendable que un GameObject en movimiento tenga RigidBody, ya que esto hace que el cálculo su correspondiente BoxCollider sea mucho más ligero. Por tanto, añadimos un RigidBody a la serpiente. Puesto que la serpiente no se verá afectada por las fuerzas externas (como la gravedad) usaremos un RigidBody con un Body Type Kinematic.
  2. Duplicamos el sprite de la cabeza de la serpiente.
  3. Le quitamos el script asociado.
  4. Le asociamos el Tag food.
  5. Lo guardamos como Prefab. Lo llamaremos food.
  6. Añadiremos la siguiente función al código de la serpiente para comprobar que se produce la colisión:
private void OnTriggerEnter2D(Collider2D collision){
    if (collision.gameObject.tag == "Food"){
      print("colision");
    }
  }
}

7. Ahora en lugar de la traza instanciaremos un TailPrefab (será igual que la cabeza pero sin script) y lo lo añadiremos a la cola.

if (collision.gameObject.tag == "Food"){
      GameObject obj = tail.Count == 0 ? gameObject:tail[tail.Count - 1].gameObject;
      GameObject t = Instantiate(TailPrefab, obj.transform.position, Quaternion.identity);
      tail.Add(t.transform);
}

← Exportar / importar Assets
Videojuego de carreras en Unity3D →

Aviso Legal | Política de privacidad