Tutorial: Fazendo a Direção do Deslizar do Touch em Unity3D

Olá! Nesse tutorial veremos como obter a direção do deslizar do touch em Unity3D. Essa interação é muito útil para jogos como Subway Surf. Para demonstração, usaremos esse motor de jogo na linguagem de programação C#.

Caso não tenha noções nessa linguagem, fizemos um tutorial básico aqui que você pode conferir.

Lógico que este tutorial não tem a intenção de ser definitivo e sim demonstrar os princípios básicos para obter esse resultado.

Vamos pensar um pouco

subway_surfers_

Para atingir nosso objetivo deveremos seguir alguns passos. Primeiro, precisamos capturar o primeiro momento em que o jogador toca, ou seja, quando ele inicia o movimento de deslizar. Assim, guardamos essa posição em uma variável. Por último, capturar a posição quando o dedo foi removido.

 

if(Input.touchCount > 0 && toqueIniciado == false & Input.GetTouch(0) .phase == TouchPhase.Began){

// verifica se tocou

Vector2 toque = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);

if(VerificaToque(toque)){

// iniciamos o toque

Debug.Log ("Toque iniciado");

toqueIniciado = true;

posicaoInicial = posicao;

}

}

// soltar o toque

if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended & toqueIniciado == true){

toqueIniciado = false;

Vector2 toque = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);

if( Vector2.Distance(posicaoInicial,toque) > 1 ){

//&& VerificaToque(toque)

Finalizar(toque);

}

}

Também deve ser considerada uma pequena margem da distância do movimento. Isso é fundamental para garantir que o jogador teve a intenção de mover naquela direção.

Agora com as duas posições, devemos fazer a comparações entre a posição final e inicial sendo:

    • Se Xfinal e menor que Xinicial então o movimento é para esquerda;
    • Se Xfinal e maior que Xinicial então o movimento é para direita;
    • Se Yfinal e menor que Yinicial então o movimento é para baixo;
    • Se Yfinal e maior que Yinicial então o movimento é para cima.
private void Finalizar(Vector2 posicao){

Direcao direcao; // direcao final

// obtem a diferença entre as posicoes

float x = posicao.x - posicaoInicial.x;

float y = posicao.y - posicaoInicial.y;

// veririca se o movimento vai ser na linhas ou coluna

if (Mathf.Abs (x) > Mathf.Abs (y)) {

// linha

// agora define se esquerda ou direita

if (posicao.x > posicaoInicial.x) {

// direita

direcao = Direcao.DIRETA;

} else {

// esquerda

direcao = Direcao.ESQUERDA;

}

} else {

// coluna

//agora define se é cima ou baixo

if (posicao.y > posicaoInicial.y) {

//cima

direcao = Direcao.CIMA;

} else {

//baixo

direcao = Direcao.BAIXO;

}

}

Debug.Log (direcao);

}

 

E finalmente emitir um evento correspondente para o tipo de movimento.

// Direcao do toque
	public enum Direcao
	{
		CIMA, BAIXO, DIRETA, ESQUERDA
	}

	public delegate void Toque(Direcao direcao);

	public static event Toque QuandoTerminar; 

	private void Finalizar(Vector2 posicao){
		
		Direcao direcao; // direcao final

		// obtem a diferença entre as posicoes
		float x = posicao.x - posicaoInicial.x;
		float y = posicao.y - posicaoInicial.y;
		// veririca se o movimento vai ser na linhas ou coluna
		if (Mathf.Abs (x) > Mathf.Abs (y)) {
			// linha
			// agora define se esquerda ou direita
			if (posicao.x > posicaoInicial.x) {
				// direita	
				direcao = Direcao.DIRETA;
			} else {
				// esquerda
				direcao = Direcao.ESQUERDA;
			}

		} else {
			// coluna
			//agora define se é cima ou baixo
			if (posicao.y > posicaoInicial.y) {
				//cima
				direcao = Direcao.CIMA;
			} else {
				//baixo
				direcao = Direcao.BAIXO;
			}

		}

		Debug.Log (direcao);

		if(QuandoTerminar != null)
			QuandoTerminar (itemDoGrid,direcao);

	}

 

Script final do Deslizar do Touch em Unity3D

 

using UnityEngine;
using System.Collections;

public class TouchBehaviourScript : MonoBehaviour {
	// Direcao do toque
	public enum Direcao
	{
		CIMA, BAIXO, DIRETA, ESQUERDA
	}

	public delegate void Toque(ItemDoGridBehaviourScript item, Direcao direcao);

	public static event Toque QuandoTerminar; // disparaddo quando o evento de toque é completado

	// posicao do primeiro toque
	private Vector2 posicaoInicial;
	// flag para marcar o inicio do toque
	private bool toqueIniciado = false;
	
	
	// Update is called once per frame
	void Update () {
		if(Input.touchCount > 0 && toqueIniciado 
			== false & Input.GetTouch(0) .phase == TouchPhase.Began){
			// verifica se tocou 
			Vector2 toque = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
			if(VerificaToque(toque)){
				// iniciamos o toque
				Debug.Log ("Toque iniciado");
				toqueIniciado = true;
				posicaoInicial = posicao;
			}
		}
		// soltar o toque
		if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended & toqueIniciado == true){
			toqueIniciado = false;
			Vector2 toque = 						Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
			if( Vector2.Distance(posicaoInicial,toque) > 1 ){
				//&& VerificaToque(toque)
				Finalizar(toque);
			}
		}	
	

	}

private void Finalizar(Vector2 posicao){
		
		Direcao direcao; // direcao final

		// obtem a diferença entre as posicoes
		float x = posicao.x - posicaoInicial.x;
		float y = posicao.y - posicaoInicial.y;
		// veririca se o movimento vai ser na linhas ou coluna
		if (Mathf.Abs (x) > Mathf.Abs (y)) {
			// linha
			// agora define se esquerda ou direita
			if (posicao.x > posicaoInicial.x) {
				// direita	
				direcao = Direcao.DIRETA;
			} else {
				// esquerda
				direcao = Direcao.ESQUERDA;
			}

		} else {
			// coluna
			//agora define se é cima ou baixo
			if (posicao.y > posicaoInicial.y) {
				//cima
				direcao = Direcao.CIMA;
			} else {
				//baixo
				direcao = Direcao.BAIXO;
			}

		}

		Debug.Log (direcao);

		if(QuandoTerminar != null)
			QuandoTerminar (itemDoGrid,direcao);

	}
}

 

Espero que tenha ficado claro o direcionamento do deslizar do Touch em Unity3D. Caso você tenha alguma dúvida ou sugestão sobre o funcionamento do script, deixa aí nos comentários.

Até a próxima.

Allan Douglas

Allan Douglas

Allan Douglas (Redator) – Formado em Análise e Desenvolvimento de Sistemas (Estácio de Sá). Atualmente trabalha como Analista Líder na Teccenter no Recife – PE. Também desenvolve soluções WEB, Mobile e Games. É fanboy da SEGA e adora jogos de estratégia digitais ou analógicos.

Send this to a friend