5 de jun. de 2011

Como modificar o personagem padrão do UDK

Neste tutorial vamos mostrar como começar a personalizar um modelo padrão de jogo em primeira pessoa sem elementos do Unreal Tournement 3 (UT3).




Iremos eliminar o personagem padrão, as armas e o HUD, ficando apenas com uma câmera em primeira pessoa que se desloca pelo ambiente sem mostrar o corpo do jogador. Este modelo pode ser a base para muita coisa, mas já é suficiente, por exemplo, para passeios interativos em maquetes 3d para arquitetura (walk-through).

Antes de prosseguir, por segurança, faça backups de todos os arquivos e pastas que você vier a modificar.

Se você se considera experiente demais ou inexperiente demais, pule diretamente para as instruções em Verde.

Onde estão as configurações

Dentro do diretório onde está instalada sua versão mais atual, o UDK destina duas pastas para criação dos jogos: UDKGame e MobileUDK. A primeira é a que nos interessa neste tutorial, pois é usada para desenvolver jogos normais de PC, enquanto que a segunda é especificamente para jogos iOS 4 (iPhone, iPad e iPod Touch).

As configurações para os jogos a serem desenvolvidos estão na pasta “..\UDKGame\Config\”, nos arquivos “UDK***.ini”. Quando abrimos o editor, por exemplo, ele busca em “UDKGame.ini” as especificações do tipo de jogo a ser criado. Por padrão, nós sempre construímos fases no estilo mata-mata (deathmatch) do UT3 devido a essas linhas iniciais do arquivo UDKGame.ini:

[Engine.GameInfo]
DefaultGame=UTGame.UTDeathmatch

É a associação entre o parâmetro DefaultGame (jogo padrão) e a “classe” de instruções em UnrealScript UTDeathmatch, pertentencente ao pacote UTGame, que pré-configura o jogador, a câmera, a arma etc.

Para personalizar nosso jogo, basicamente teremos que mudar essa linha, associando DefaultGame ao tipo de game definido pelas classes que criaremos. Mas atenção, não se pode editar diretamente o arquivo UDKGame.ini, pois ele é criado automaticamente pelo sistema a partir de outros arquivos. O arquivo que pode ser de fato alterado para se chegar ao mesmo objetivo é DefaultGame.ini.

Entretanto, é preciso definir antes nossas novas classes em UnrealScript.

Classes em UnrealScript

Classes são conjuntos de propriedades e funções do jogo, agrupadas em pacotes. Cada uma delas são escritas em uma sintaxe parecida com Java em arquivos com extensões “.uc”, mas para serem usadas pelo UDK precisam ser compiladas em arquivos “.u” via Frontend, por exemplo.

Os pacotes de classes no UDK ficam na pasta “..\Development\Src\”. As classes fundamentais do sistema ficam em “…\Development\Src\Engine\Classes” e não deve ser modificadas diretamente. Por sua vez, as classes que definem jogos no estilo UT3 ficam em “…\Development\Src\UTGame\Classes\”.

Para estabelecer um novo tipo de jogo, criaremos novas classes organizadas em um novo pacote, que chamaremos de MeuJogo. Dentro dele personalizaremos classes originais de UnrealScript que definem características para o personagem do jogador (Pawn) e o modo como ele é controlado (PlayerController).

Criaremos a seguir um sistema hierárquico, definindo subclasses que modificam superclasses da engine:

GameInfo define as características gerais de um jogo: regras, pontuação, que actors podem existir e quem pode entrar no jogo.

Pawn (peão) define actors que representam fisicamente jogadores e personagens em um nível do jogo. Pawns podem possuir malha (mesh) e propriedades como colisão e dinâmica de movimento. Eles podem ser danificados, emitir ou provocar sons, portar armas e outros itens de inventário; em suma, eles são responsáveis por todas as interações físicas entre o jogador, personagens e o mundo.


 
Os pawns manipulados pelo jogador são controlados pela classe PlayerController. Esta classe também controla a câmera que define o ponto de vista do jogador.
 
Criando as novas classes

1. Crie uma nova pasta dentro de “..\Development\Src\” chamada “MeuJogo”.
2. Dentro desta, crie uma pasta chamada “Classes”.
3. Dentro de “Classes”, crie três novos arquivos de texto chamados: “MeuGameInfo.uc”, “MeuPawn.uc” e “MeuController.uc”
4. Edite cada arquivo em Notepad e salve-os com os seguintes conteúdos:

Em MeuGameInfo.uc:


class MeuGameInfo extends UDKGame; //MeuGameInfo->UDKGame->FrameworkGame->GameInfo
DefaultProperties
{
DefaultPawnClass = class'MeuPawn'
PlayerControllerClass = class'MeuController'
bDelayedStart = false
}

Em MeuPawn.uc:
class MeuPawn extends UDKPawn; // MeuPawn->UDKPawn->GamePawn->Pawn
DefaultProperties
{
/** A instrução abaixo define um volume em forma de cilindro que
* controla a superfície de colisão correspondente ao corpo do jogador */
Begin Object Name=CollisionCylinder
CollisionRadius=+0021.000000 // Largura do jogador (raio)
CollisionHeight=+0044.000000 // somada a BaseEyeHeight + 14 = altura do jogador
End Object
CylinderComponent=CollisionCylinder

// Parâmetros úteis
BaseEyeHeight=38.0 // Altura dos olhos relativa ao topo do cilindro de colisão
EyeHeight=38.0
GroundSpeed=400.0 // Velocidade ao andar
CrouchHeight=29.0 // Altura do jogador quando agachado
CrouchRadius=21.0 // Largura do jogador quando agachado
MaxStepHeight=26.0 // Maior altura de um degrau
}

Em MeuController.uc:

// MeuController->GamePlayerController->PlayerController
class MeuController extends GamePlayerController;
DefaultProperties
{
// Por estar vazio, mantém os controles definidos em GamePlayerController.
}

Informando ao sistema a existência do novo pacote

O passo abaixo forçará o UDK a monitorar o pacote MeuJogo para sempre que verificar modificações compilar automaticamente suas classes, sem o quê elas não poderiam ser acessadas pelo sistema:

5. Na pasta “…\UDKGame\Config\”, abra com o Notepad o arquivo “DefaultEngine.ini”.
6. Identifique o bloco que começa com “[UnrealEd.EditorEngine]” e acrescente ao final deste uma linha com o seguinte texto: “ModEditPackages=MeuJogo”.

Configurando o UDK para usar o novo tipo de jogo

7. Na pasta “…\UDKGame\Config\”, faça uma cópia de segurança do arquivo “DefaultGame.ini”, renomeando-o para “OLD_DefaultGame.ini”.
8. Crie no mesmo local com o Notepad um novo arquivo “DefaultGame.ini”, apenas com o seguinte conteúdo:
[Configuration]
BasedOn=..\UDKGame\Config\DefaultGameUDK.ini

[Engine.GameInfo]
DefaultGame=MeuJogo.MeuGameInfo
DefaultServerGame=MeuJogo.MeuGameInfo
PlayerControllerClassName=MeuJogo.MeuController
DefaultGameType=MeuJogo.MeuGameInfo


Compile suas novas configurações

9. Abra o programa Unreal Frontend.
10. Na aba superior, clique no botão SCRIPT e depois em FULL RECOMPILE.

Pronto!

Para testar, crie um novo mapa bem simples e veja o efeito.

11. Se quiser voltar atrás, basta restaurar o antigo arquivo “DefaultGame.ini” com a cópia de segurança criada no ponto 7 acima.