Métodos são as funções que pertencem a uma classe, assim como campos ou atributos representam dados da classe, como variáveis e constantes. Esta nomenclatura começou a ser usada na Programação Orientada a Objetos.
A linguagem Verse permite a criação de métodos de extensão que são funções que podem ser adicionadas a classes existentes sem precisar usar a herança.
Isto pode ser útil quando você precisar adicionar funcionalidade as classes que não podem ser estendidas como player, agent e team do UEFN.
Além de classes, os métodos de extensão podem ser usados em qualquer tipo do Verse. O exemplo abaixo adiciona uma função ao tipo int que calcula a potência de um número:
(Base:int).MyPowFunction(Exponent:int):int=
if (Exponent < 0):
return 0
var PowResult: int = 1
for (Ind := 1..Exponent):
set PowResult *= Base
PowResult
Entre parênteses, há a declaração de uma constante do tipo que está sendo estendido. Esta constante é usada no corpo da função como se fosse um parâmetro.
O código abaixo mostra como a função pode ser usada:
IntValue := 2
Result := IntValue.MyPowFunction(4)
Vamos usar métodos de extensão para adicionar funcionalidades à classe player do UEFN. Para isso, será utilizada uma nova classe e um map para associar novos campos a uma instância de player.
Abra o Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project.
Em Device Name coloque extension_device e clique no botão Create Empty.
Copie o código Verse abaixo para o dispositivo extension_device:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
player_fields := class:
var Score : int = 0
var CoinsCollected : int = 0
var GameLevel : int = 1
var CoinsPerLevel : int = 3
extension_device := class(creative_device):
@editable
ItemSpawnerArray : []item_spawner_device = array{}
var PlayerFieldsMap<public> : [player]player_fields = map{}
OnBegin<override>()<suspends>:void =
for(ItemSpawner : ItemSpawnerArray):
ItemSpawner.ItemPickedUpEvent.Subscribe(HandleCoinCollected)
HandleCoinCollected(Agent:agent):void=
if ( Player := player[Agent], Player.CollectCoin[] ) {}
(Player:player).GetPlayerFields()<decides><transacts>:player_fields=
if(PlayerFields := PlayerFieldsMap[Player]):
PlayerFields
else:
NewPlayerFields := player_fields{}
set PlayerFieldsMap[Player] = NewPlayerFields
NewPlayerFields
(Player:player).CollectCoin()<decides><transacts>:void=
PlayerFields := Player.GetPlayerFields[]
set PlayerFields.CoinsCollected += 1
set PlayerFields.Score += PlayerFields.GameLevel * 100
if ( Mod[PlayerFields.CoinsCollected, PlayerFields.CoinsPerLevel] = 0 ):
set PlayerFields.GameLevel += 1
Print("Score:{PlayerFields.Score} | GameLevel:{PlayerFields.GameLevel}")
A classe player_fields contém os novos campos que serão associados a uma instância de player por meio do map PlayerFieldsMap.
O dispositivo extension_device possui um array de item_spawner_device usado para armazenar as referências dos Item Spawner presentes no nível. A função OnBegin registra a função HandleCoinCollected em cada uma das instâncias do array item_spawner_device para ser executada quando o jogador coletar uma moeda.
A função HandleCoinCollected recebe como parâmetro o agente que coletou a moeda. É feito o cast (conversão) para player e, em seguida, é chamado o método de extensão CollectCoin, criado para a classe player. A expressão if está sendo usada apenas como contexto de falha.
GetPlayerFields é um método de extensão criado para a classe player. Ele retorna a instância de player_fields associada ao player. Caso ainda não exista, uma nova instância de player_fields é criada, armazenada no map e retornada pelo método.
CollectCoin é outro método de extensão criado para a classe player. O método obtém a instância de player_fields para atualizar seus valores. Neste exemplo, o GameLevel aumenta a cada três moedas coletadas. A pontuação obtida ao coletar cada moeda depende do GameLevel.
Salve o arquivo e compile o código Verse usando a opção Verse > Compile Verse Code do menu do UEFN.
Acesse o Content Drawer e adicione o dispositivo extension_device ao nível. Adicione um Item Spawner Device no nível e na aba Details configure conforme a imagem para que uma moeda seja gerada a cada 3 segundos.
Faça cópias do Item Spawner Device usando a tecla Alt e arrastando uma das setas de eixo do dispositivo selecionado. No meu exemplo, utilizei quatro Item Spawners.
Selecione o extension_device no nível. Na aba Details, adicione elementos ao array e selecione as referências aos Item Spawner Devices em cada elemento do array.
Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Ao coletar uma moeda, será exibida uma mensagem informando os valores atuais de Score e GameLevel do jogador.


