Câmera RTS com a Unity 3D

Câmera RTS com a Unity 3D

Recriamos uma movimentação de câmera como nos clássicos jogos de estratégia em tempo real.

RTS é uma sigla para Real-Time Strategy, que no bom e velho português significa estratégia em tempo real. Esse é um subgénero  que possui renomados jogos, como Age of Empires, Age of Mitology, World of Warcraft, Boswars, entre muitos outros.

Vamos ver aqui como criar uma câmera com a movimentação desse subgénero utilizando o Mouse e também o Teclado do dispositivo.

Vale lembrar que a movimentação pode ter suas complexibilidade dependendo da regra do jogo, como zoom e multiplicação de velocidade, por exemplo.

Para entender o que vamos criar, tudo o que precisamos fazer é verificar a posição do mouse em relação a tela, para isso, observe a imagem abaixo.

Unity 3D RTS Camera
Unity 3D RTS Camera

Nossa tela possui 1000px de largura e 500px de altura, é necessário verificar em que posição o mouse se encontra, no exemplo acima, ele deve estar entre a borda cinza escura e a borda azul.

Analisando a tabela abaixo é possível entender as regras.

RegraIntervalo    Descrição
Mouse.X < 250-25Movimenta para a esquerda
Mouse.X > (1000px-25px) 975-100    Movimenta para a direita
Mouse.Y < 250-25Movimenta para cima
Mouse.Y > (500px-25px)475-500Movimenta para baixo

Os valores de 1000px e 500px são obtidos durante a execução do projeto, aqui foram utilizados esses números para exemplificar.

Veja a nossa videoaula para aprender a criar o script e utilizar dentro da Unity 3D.

[Link videoaula]

Código fonte RTS Camera

Agora que você já sabe como criar a sua câmera, confira o código fonte utilizado durante a aula.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RTSCamera : MonoBehaviour
{

    public float borderSize = 25.0f;
    public float velocity = 10.0f;

    private float screenX;
    private float screenY;

    void Start()
    {
        screenX = Screen.width;
        screenY = Screen.height;

        print(screenX);
        print(screenY);
    }

    void Update()
    {
        Vector3 pos = Vector3.zero;

        #region Move X
        //Move para a esquerda
        if (Input.mousePosition.x < borderSize)
        {
            pos.x = -1;
        }

        //Move para a direita
        if (Input.mousePosition.x > (screenX - borderSize))
        {
            pos.x = 1;
        }

        #endregion

        #region Move Y

        //Move para cima
        if (Input.mousePosition.y < 25)
            pos.y = -1;

        //Move para baixo
        if (Input.mousePosition.y > (screenY - borderSize))
            pos.y = 1;

        #endregion

        if (pos == Vector3.zero)
            pos = GetKeyPosition();

        transform.Translate(pos * velocity * Time.deltaTime);
    }

    private Vector3 GetKeyPosition()
    {
        return new Vector3(
            Input.GetAxis("Horizontal"),
            Input.GetAxis("Vertical"),
            0
        );
    }
}

Por hora é isso, até a próxima.

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Deixe um comentário