A classe Weapon é uma subclasse de Inventory. O sistema de armas no UDK é bem flexível para a criação de diversos tipos de armas ou itens usáveis. A imagem abaixo mostra as subclasses de Weapon existentes no UDK:
Cada arma pode ter vários modos de tiro. O UDK utiliza dois tipos, o primário, que é acionado com o botão esquerdo do mouse, e o secundário, que é acionado com o botão direito do mouse. Entretanto, outros modos de tiro podem ser criados. Para cada modo de tiro é preciso definir o tipo de tiro. O UDK já possui dois tipos definidos, o Instant Fire que é usado para armas muito velozes como uma Sniper Rifle. Neste tipo de tiro, a bala não é criada. O que acontece é que no momento do disparo é feito uma projeção do caminho que a bala irá percorrer, se encontrar algum obstáculo a colisão é feita imediatamente. O outro tipo de tiro é o Projectile Fire. Quando a arma é disparada neste tipo de tiro, um objeto da classe Projectile é criado com as informações necessárias de velocidade e direção. A verificação de colisão passa a ser responsabilidade da classe Projectile.
Os tipos de tiro são definidos na classe Weapon em uma Enumeração (enum). O uso do enum é muito útil para limitar os possíveis valores que uma variável pode receber. Para definir o tipo de tiro de cada modo de tiro é utilizado um Array dinâmico. Cada posição do Array representa um modo de tiro. As posições de um Array começam a ser contadas a partir de zero, ou seja, as informações do tiro primário ficam na posição zero e as informações do tiro secundário ficam na posição um. O código abaixo mostra a declaração do enum e do Array.
Os tipos de tiro são definidos na classe Weapon em uma Enumeração (enum). O uso do enum é muito útil para limitar os possíveis valores que uma variável pode receber. Para definir o tipo de tiro de cada modo de tiro é utilizado um Array dinâmico. Cada posição do Array representa um modo de tiro. As posições de um Array começam a ser contadas a partir de zero, ou seja, as informações do tiro primário ficam na posição zero e as informações do tiro secundário ficam na posição um. O código abaixo mostra a declaração do enum e do Array.
// Extraído da classe Weapon (pacote Engine)
enum EWeaponFireType
{
EWFT_InstantHit,
EWFT_Projectile,
EWFT_Custom,
EWFT_None
};
var Array<EWeaponFireType> WeaponFireTypes;
Um bom exemplo de arma no UDK é a Link Gun. Essa é a arma padrão que o jogador começa ao iniciar um jogo no UDK como UTGame. O tiro primário da Link Gun é do tipo EWFT_Projectile que lança projéteis de plasmas a uma alta velocidade. O tiro secundário é do tipo EWFT_InstantHit que quando acionado mantém um raio de plasma ativo conforme figura abaixo.
A classe que define a arma Link Gun é a UTWeap_LinkGun. No bloco defaultproperties é definido o tipo de tiro e a classe que representa o projétil para o tiro primário conforme código abaixo.
//Extraído da classe UTWeap_LinkGun (pacote UTGame)
defaultproperties
{
//...
WeaponFireTypes(0)=EWFT_Projectile
WeaponProjectiles(0)=class'UTProj_LinkPlasma'
//...
}
A função da classe Weapon responsável por disparar armas do tipo EWFT_InstantHit é a InstantFire(). A função usada no tipo EWFT_Projectile para disparar projéteis é ProjectileFire(). Abaixo temos um código de exemplo da função ProjectileFire() da classe UTWeapon.
//Extraído da classe UTWeapon (pacote UTGame)
simulated function Projectile ProjectileFire()
{
local vector RealStartLoc;
local Projectile SpawnedProjectile;
// tell remote clients that we fired, to trigger effects
IncrementFlashCount();
if( Role == ROLE_Authority )
{
// this is the location where the projectile is spawned.
RealStartLoc = GetPhysicalFireStartLoc();
// Spawn projectile
SpawnedProjectile = Spawn(GetProjectileClass(),,, RealStartLoc);
if( SpawnedProjectile != None && !SpawnedProjectile.bDeleteMe )
{
SpawnedProjectile.Init( Vector(GetAdjustedAim( RealStartLoc )) );
}
// Return it up the line
return SpawnedProjectile;
}
return None;
}
Para mais informações sobre a classe Weapon:
Weapon System Technical Guide