sábado, 28 de abril de 2012

Usando Archetypes em UnrealScript

O uso de archetype nos permite armazenar uma instância de uma classe para ser modificada e usada como modelo na criação de outras instâncias desta mesma classe no editor de níveis. Este recurso é muito útil para os Designers fazerem adaptações nos Atores do cenário sem depender totalmente do programador.

Criar um Archetype é simples, basta selecionar um Ator do cenário, clicar com o botão direito e escolher a opção "Create Archetype...", como pode ser visto na figura abaixo:


Outra forma de criar o archetype é através da janela "Actor Classes". Selecione uma classe e clique com o botão direito para aparecer a opção "Create Archetype...".


Após isso será exibida uma caixa de diálogo onde você deve informar o nome deste novo archetype e o package onde será armazenado. O campo "Grouping" é opcional.


Depois da criação, o novo archetype passará a ser exibido no "Content Browser". É possível mudar suas propriedade clicando com o botão direito no Archetype e escolhendo a opção "Properties...". Para obter o nome completo do Archetype escolha a opção "Copy Full Name to Clipboard" e depois cole no lugar desejado.


Criei uma classe chamada ArchetypeSpawner para ilustrar o uso de archetypes em UnrealScript. Esta classe é placeable e possui uma variável com o nome archetypeReference que é usada para referenciar um archetype. Foi definida uma função que pode ser chamada por outras classes para criar uma instância baseada no archetype referenciado. Neste exemplo foi criado um Timer de 5 segundos que irá chamar esta função uma única vez. A grande vantagem deste exemplo usando archetypes é que a variável está exposta no editor para o Designer, dessa forma ele pode criar qualquer Archetype e informar o nome completo na variável archetypeReference na janela de propriedades, como pode ser visto na imagem e código abaixo.

class ArchetypeSpawner extends Actor
      placeable;

var() const archetype Actor archetypeReference;
//O uso do modificador archetype é opcional.
      
event simulated PostBeginPlay()
{
    SetTimer(5);    
}

function Timer()
{
    SpawnArchetypeAt( self.Location );
}    

function Actor SpawnArchetypeAt( vector startLocation ) 
{    
    local Actor archetypeSpawned;
    
    archetypeSpawned = Spawn(archetypeReference.Class, , , startLocation, , archetypeReference);
    
    return archetypeSpawned;
}      

defaultproperties
{    
    archetypeReference=UltraHealthPack'ArchetypeExample.HealthPackArchetype'
}

Para mais informações sobre Archetypes: