Tutorial: Mecânica de Connect 3 com C# no Unity3D – Parte 01

Olá, pessoal. Neste tutorial, vou mostrar como criar uma mecânica de Connect 3 com C# em Unity3D.

Esta mecânica é usada, por exemplo, no jogo mobile Dots: o jogo das ligações.

Ele já teve mais de 10 milhões de downloads em sua versão para sistema operacional Android.

Atenção!

Nesse artigo julgo que o leitor já tem algum conhecimento de programação e do uso de engine Unity3D. Caso não tenha, temos alguns artigos que você pode explorar pelas tags unity e unity3d.

Definindo o projeto

Em nosso exemplo simples, montaremos um “grid” com bolinhas. Eu  o  chamarei de Item, tamanho 6×6 e com 4 cores diferentes. Assim, nós poderemos ligá-los na horizontal e vertical até não haverem mais conexões possíveis.

Para isso, precisaremos de um Sprite básico branco em formato de círculo com preenchimento para que possamos colorir. Também de três Scripts: um para o Item, outro para controle do toque e por último o script responsável pela montagem do grid.

Two_Dots_iPad_iPhone_game_review_800home

Fazendo nosso Connect 3 com C# no Unity3D

Nessa primeira parte, vamos trabalhar o script responsável pela captura do toque na tela ou do mouse.

Para começar, criamos um já com o projeto criado. Vamos adicionar um novo script em C#. Coloque seu nome de TouchBehaviourScript.

Comecemos definindo duas “Actions” que usaremos em dois momentos principais para nós: quando tocamos sobre um item e quando liberamos o toque.

public static Action OnTouchEnd;

public static Action<GameObject> OnTouchableFound;

Para podemos identificarmos quais GameObjects serão levados em consideração no toque, criaremos um array de strings. Será onde configuraremos com nomes das “layers” dos objetos que podem ser identificadas pelo toque.

[SerializeField]

[Header("Layers touchable")]

private string[] layers;

Para controlar o status atual do toque, teremos dois verificadores: um para o ultimo objeto encontrado, para não ficarmos enviando o mesmo objeto seguidamente, e um para verificar se o toque já foi iniciado.

private GameObject lastFound;

private bool touchStarted = false;

Para controlar o término do toque, criaremos um método que “reseta” os verificadores e verifica se action OnTouchEnd e diferente de null para chamá-lo.

/// <summary>

/// Release the touch

/// </summary>

private void Release()

{

lastFound = null;

touchStarted = false;

if(OnTouchEnd != null)

OnTouchEnd();

}

Finalmente agora chegamos ao coração da nossa classe. É a função que vai verificar se o toque foi feito em cima de um objeto que atende as condições.

Primeiro temos que capturar a posição to toque da tela e convertê-la para uma posição do mundo.

Depois faremos um raycast da posição encontrada no centro de Vector.zero, tamanho 1 e que pertença a uma das layers especificadas no array.

private void Touching(Vector3 screenPosition)

{

screenPosition = Camera.main.ScreenToWorldPoint(screenPosition);

RaycastHit2D hit = Physics2D.Raycast(screenPosition,

Vector2.zero, 2, LayerMask.GetMask(layers));

//...

}

Feito isso precisamos verifica se algum objeto foi encontrado. Em caso positivo, armazenaremos o GameObject em uma variável a qual compararemos se tem a mesma referência do último objeto encontrado. Também observaremos se o evento OnTouchableFound é diferente de null.

Sendo atendidos todas essas condições, configuraremos nossos controladores e finalmente chamamos o a ação que leva o item encontrado.

private void Touching(Vector3 screenPosition)

{

screenPosition = Camera.main.ScreenToWorldPoint(screenPosition);

RaycastHit2D hit = Physics2D.Raycast(screenPosition,

Vector2.zero, 2, LayerMask.GetMask(layers));

//verify the hit

if (hit)

{

GameObject found = hit.transform.gameObject;

if(found != lastFound && OnTouchableFound != null)

{

lastFound = found;

touchStarted = true;

OnTouchableFound(found);

}

}

}

Finalmente precisamos precisamo chamar nosso método Touching. Faremos isso no Update, contudo para pc e mobile, os inputs são diferentes. Assim temos que identificar em qual plataforma estamos trabalhando e usar os inputs certos.

void Update () {

#if UNITY_EDITOR

TouchingPC();

#endif

#if UNITY_ANDROID

TouchingMobile();

#endif

}

Para mobile

/// <summary>

/// Touching in Mobile

/// </summary>

private void TouchingMobile()

{

if (Input.touchCount > 0)

{

Vector3 position = Input.GetTouch(0).position;

Touching(position);

}else if (Input.touchCount == 0)

{

Release();

}

}

Para PC

/// <summary>

/// Pointing in PC

/// </summary>

private void TouchingPC()

{

if (Input.GetMouseButton(0))

{

Vector3 position = Input.mousePosition;

Touching(position);

}

else if (touchStarted)

{

Release();

}

}

O Script completo

Assim temos nosso script:

using System;

using UnityEngine;

public class TouchBehaviourScript : MonoBehaviour {

private enum Mode { MOBILE, PC}

// events

public static Action OnTouchEnd;

public static Action<GameObject> OnTouchableFound;

[SerializeField]

[Header("Layers touchable")]

private string[] layers;

// properties

private GameObject lastFound;

private bool touchStarted = false;

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

#if UNITY_EDITOR

TouchingPC();

#endif

#if UNITY_ANDROID

TouchingMobile();

#endif

}

/// <summary>

/// Release the touch

/// </summary>

private void Release()

{

Debug.Log("Executando o release do mouse");

lastFound = null;

touchStarted = false;

if(OnTouchEnd != null)

OnTouchEnd();

}

/// <summary>

/// Check position touched

/// </summary>

/// <param name="position"></param>

private void Touching(Vector3 screenPosition)

{

screenPosition = Camera.main.ScreenToWorldPoint(screenPosition);

RaycastHit2D hit = Physics2D.Raycast(screenPosition,

Vector2.zero, 2, LayerMask.GetMask(layers));

//verify the hit

if (hit)

{

GameObject found = hit.transform.gameObject;

if(found != lastFound && OnTouchableFound != null)

{

lastFound = found;

touchStarted = true;

OnTouchableFound(found);

}

}

}

/// <summary>

/// Touching in Mobile

/// </summary>

private void TouchingMobile()

{

if (Input.touchCount > 0)

{

Vector3 position = Input.GetTouch(0).position;

Touching(position);

}else if (Input.touchCount == 0)

{

Release();

}

}

/// <summary>

/// Pointing in PC

/// </summary>

private void TouchingPC()

{

if (Input.GetMouseButton(0))

{

Vector3 position = Input.mousePosition;

Touching(position);

}

else if (touchStarted)

{

Release();

}

}

}

Então é isso, fico por aqui. Na próxima parte, veremos a montagem do Item e a construção do Grid.

Até lá.

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