sábado, 1 de agosto de 2020

Primeiro contato com uma classe C++ da Unreal

Vamos começar nosso estudo de C++ analisando o arquivo TutoProjectGameMode.h criado pela Unreal Engine para o nosso projeto. Este arquivo é o header (cabeçalho) da classe TutoProjectGameMode.

O conteúdo do arquivo é este:
// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "TutoProjectGameMode.generated.h"

UCLASS(minimalapi)
class ATutoProjectGameMode : public AGameModeBase
{
	GENERATED_BODY()

public:
	ATutoProjectGameMode();

};
A primeira linha é um comentário. Tudo que vier após os caracteres // até o final da linha é um comentário. O comentário é ignorado na compilação do programa e serve para que você possa colocar observações sobre o código.

É possível definir um bloco de comentários que ocupa várias linhas. Para isso use os caracteres /* para iniciar o comentário. Todo o texto seguinte será um comentário até que seja encontrado os caracteres */. Abaixo temos um exemplo desta forma de comentário.
/*
    Programação de Jogos em C++ na Unreal Engine
    Autor: Marcos Romero
*/

As linhas que começam com o caractere # são chamadas de diretivas de compilação. Elas são instruções usadas pelo compilador durante o processo de compilação. A diretiva #pragma once é usada para que o arquivo seja incluído apenas uma vez durante a compilação.

A diretiva #include insere o conteúdo do arquivo especificado na posição onde está a diretiva. Em C++ ela é normalmente usada para incluir os arquivos header que contém as especificações necessárias para o arquivo atual.

Quando criamos uma classe C++ na Unreal Engine, é gerado um arquivo header com a extensão .generated.h. Este arquivo deve ser sempre o último arquivo a ser incluído com a diretiva #include.

A instrução UCLASS(minimalapi) é uma macro que indica que esta classe será gerenciada pela Unreal Engine. Uma macro é substituída por um bloco de código no momento da compilação.

A linha abaixo de UCLASS( ) é a declaração da classe TutoProjectGameMode. Observe que o nome da classe possui como prefixo a letra A. Este prefixo é colocado pela Unreal Engine e significa que esta classe faz parte da hierarquia de classes da classe AActor. Este nome com o prefixo A é usado apenas no código C++. No editor da Unreal o nome da classe continua sendo TutoProjectGameMode.
class ATutoProjectGameMode : public AGameModeBase
{
   //código da classe...  
};

O texto : public AGameModeBase  após o nome da classe indica que a classe AGameModeBase é a classe pai da classe ATutoProjectGameMode. Este é um conceito conhecido como herança, e significa que as variáveis e funções da classe AGameModeBase fazem parte da classe ATutoProjectGameMode. Podemos dizer também que a classe ATutoProjectGameMode é do tipo AGameModeBase.

Um detalhe muito importante, a linguagem C++ faz distinção entre as letras maiúsculas e minúsculas. Portanto, se você usar o nome Atutoprojectgamemode para referenciar a classe ATutoProjectGameMode, o compilador irá gerar um erro porque são nomes diferentes.

Os caracteres { e } definem um bloco de código, que neste caso está sendo usado para definir o conteúdo da classe ATutoProjectGameMode.

A primeira linha depois de { contém o texto GENERATED_BODY(). Isto é uma macro da Unreal Engine que irá gerar o código necessário para a Unreal Engine gerenciar esta classe C++.

O rótulo public indica que as variáveis e funções que forem definidas a seguir serão públicas, ou seja, elas podem ser acessadas por outras classes C++. As outras opções de acesso para variáveis e funções são protected, onde elas não são acessíveis por outras classes C++ mas são acessíveis por classes filhas; e private, que não são acessíveis nem por classes filhas. Estes rótulos são conhecidos como Modificadores de Acesso.

Na linha abaixo de public: temos o texto ATutoProjectGameMode(); que é a declaração do Construtor da classe. Um Construtor possui um bloco de código que é executado quando um elemento da classe é criado. Este bloco de código está definido no arquivo TutoProjectGameMode.cpp.

O caractere ; é um terminador de comando em C++, logo você irá se familiarizar com as linhas que devem ser encerradas com ;