domingo, 23 de outubro de 2011

Usando Vetores em UnrealScript

Um vetor em UnrealScript é apenas uma estrutura que contém os valores X, Y e Z. O uso de vetores simplifica muita coisa na programação de jogos 3D. Os vetores podem ser usados para representar posição, velocidade, aceleração, distância, direção, etc.

UnrealScript possui algumas funções utilitárias para vetores, segue abaixo as duas mais importantes:
  • function float VSize( vector A ): Retorna o comprimento do vetor.
  • function vector Normal( vector A ): Retorna um vetor Normalizado, ou seja, um vetor cujo comprimento é 1.

A classe Actor possui um vetor chamado Location que indica sua posição atual no mundo 3D.

O exemplo abaixo ilustra os diversos usos de vetores. Foi criado um Actor que se movimenta em direção a uma posição aleatória. Quando ele chega no destino uma nova posição é escolhida.
class TesteVetores extends Actor
      placeable;
     
var vector vDestino;

const VEL = 100; 
//Velocidade = 100 UU/Seg (Unidade Unreal / Segundo)
     
function DefinirNovoDestino()
{
    //Escolhe posição aleatória
    vDestino.X = -500 + Rand(1001); //-500 a 500
    vDestino.Y = -500 + Rand(1001); //-500 a 500
    vDestino.Z = 150 + Rand(101); //150 a 250
    
    worldinfo.game.broadcast(self, "NOVO DESTINO: " $ vDestino);
}     

event PostBeginPlay()
{
    DefinirNovoDestino();
}

//Esta função é chamada a cada Quadro (Frame) pela Unreal Engine
event Tick(float DeltaTime)
{   
   local vector vDistancia;
   local vector vDirecao;
   local vector vVelocidade;
   local vector vPasso;
   
   vDistancia = vDestino - Location;   
   
   //Verificar se o Actor chegou no destino
   if( VSize( vDistancia ) < VEL )
   {
        DefinirNovoDestino();
        vDistancia = vDestino - Location;
   }
   
   vDirecao = Normal( vDistancia );      
   vVelocidade = vDirecao * VEL;
   vPasso = vVelocidade * DeltaTime;
   Move( vPasso );    
}
     
defaultproperties
{        
    begin object Class=StaticMeshComponent Name=Modelo3D
        StaticMesh = Pickups.UDamage.Mesh.S_Pickups_UDamage        
    end object
    
    Components.add(Modelo3D);
}    

Nenhum comentário:

Postar um comentário