Desenvolvimento 
Multiplataforma 
Apresentando UTools 
Alexandre Ribeiro de Sá - Vortex Game Studios
Tópicos 
• Quem sou? 
• Identificando e entendendo o problema 
• Planejando uma solução 
• Ação
Quem sou? 
• Fundador da Vortex Game Studios; 
• Organizador da SPJam; 
• Desenvolvedor (C, C++, C# e outros); 
• Atualmente, no desenvolvimento 
de jogos e ferramentas de apoio; 
• Gosto de bolo :) 
@VortexStudios 
@SPGameJam 
@TheMonkeyTail
Identificando e Entendendo o Problema
Tudo começa aqui:
Alguns problemas que encontramos 
• Input 
Para cada tipo de dispositivo de entrada (teclado, joystick, mobile, touch) 
há necessidade de códigos específicos e não padronizados 
• Arquivos 
A leitura e gravação de arquivos é diferente em cada plataforma. Nosso 
primeiros testes com gravação e leitura de arquivos no Android levavam 
os dispositivos a congelar. 
• Tradução 
Os assets disponíveis para tratar o tema não funcionam adequadamente 
em jogos multiplataforma. O que adquirimos não funciona em Windows 
Phone e OS X
E as coisas só pioravam...
Temos: 
• Diversos inputs, incluindo os desenhados na tela em jogos 
mobiles; 
• Leitura e Gravação de arquivos; 
• Bibliotecas que não compilam adequadamente em todas as 
plataformas; 
• Necessidade de integrar bibliotecas exclusivas para diferentes 
plataformas
Resultado 
• Longos periodos de produção e desenvolvimento; 
• Códigos não-padronizados; 
• Novo ciclo de aprendizado para cada plataforma; 
• Custo elevado de produção; 
• AHHHHHHHH!!!!
Ficou ó...
Planejando uma solução
O que queremos? 
• Reduzir o tempo de produção do seu jogo; 
• Padronização de código-fonte; 
• Reduzir o tempo de aprendizado para implementação de 
bibliotecas 
• Reduzir o custo de produção do seu jogo
Como tornar realidade?
O que é a UTools? 
• Qual o objetivo? 
Reduzir os custos e tempo de produção de jogos multiplataforma usando 
um framework padrão. 
• Como funciona? 
Através da implementação de módulos especializados, cada um fazendo 
a sua tarefa, independente da plataforma de destino! 
• E quais são os modulos? 
A imagem explica :)
Módulos da UTools
A UInput 
• Interface visual; 
• Permite configurar todas as entradas 
em um só lugar, incluindo virtual 
• Exportar e importar presets 
em formato JSON 
• Ativar, desativar ou mudar 
configurações em real-time
Exemplo (C#) 
float h = 0.0f; 
if ( isPC ) { 
h = Input.GetAxis("Horizontal"); 
} else if ( isMobile ) { 
if( Input.acceleration.x >= 0.1f && Input.acceleration.x < 0.2f ) { 
h = 0.5f; 
} else if( Input.acceleration.x <= -0.1f && Input.acceleration.x > -0.2f ) { 
h = -0.5f; 
} else if( Input.acceleration.x >= 0.2f ) { 
h = 1.0f; 
} else if( Input.acceleration.x <= -0.2f ) { 
h = -1.0f; 
} else{ 
h = 0.0f; 
} 
}
Exemplo (C# c/ UInput) 
float h = UInput.getAxis( "Player", "X" );
A UData 
• Sintaxes amigáveis 
• Leitura e gravação funcionando em qualquer plataforma, com 
a mesma implementação 
• Armazenamento automático em nuvem quando a plataforma 
permitir
Exemplo (C#) 
• Leitura 
BinaryWriter bW = new BinaryWriter( file ); 
bW.Write( section.id ); 
bW.Write( section.locked ); 
bW.Write( section.storeKey ); 
• Gravação 
BinaryReader bR = new BinaryReader( file ); 
section.id = bR.ReadUInt32(); 
section.locked = bR.ReadBoolean(); 
section.storeKey = bR.ReadString();
Exemplo (C# c/ UData) 
• Leitura 
udSave.OpenPlayerData( "jelly_save", false); // False = Leitura 
udSave.Write( section.id ); 
udSave.Write( section.locked ); 
udSave.Write( section.storeKey ); 
• Gravação 
udSave.OpenPlayerData( "jelly_save", true ); // True = Gravação 
section.id = udSave.Read<uint>(); 
section.locked = udSave.Read<bool>(); 
section.storeKey = udSave.Read<string>();
Ação
Obrigado! 
http://utools.rocks 
fb.com/UToolsFramework 
twitter.com/UToolsFramework

UTools Unite Brasil

  • 1.
    Desenvolvimento Multiplataforma ApresentandoUTools Alexandre Ribeiro de Sá - Vortex Game Studios
  • 2.
    Tópicos • Quemsou? • Identificando e entendendo o problema • Planejando uma solução • Ação
  • 3.
    Quem sou? •Fundador da Vortex Game Studios; • Organizador da SPJam; • Desenvolvedor (C, C++, C# e outros); • Atualmente, no desenvolvimento de jogos e ferramentas de apoio; • Gosto de bolo :) @VortexStudios @SPGameJam @TheMonkeyTail
  • 4.
  • 5.
  • 6.
    Alguns problemas queencontramos • Input Para cada tipo de dispositivo de entrada (teclado, joystick, mobile, touch) há necessidade de códigos específicos e não padronizados • Arquivos A leitura e gravação de arquivos é diferente em cada plataforma. Nosso primeiros testes com gravação e leitura de arquivos no Android levavam os dispositivos a congelar. • Tradução Os assets disponíveis para tratar o tema não funcionam adequadamente em jogos multiplataforma. O que adquirimos não funciona em Windows Phone e OS X
  • 7.
    E as coisassó pioravam...
  • 8.
    Temos: • Diversosinputs, incluindo os desenhados na tela em jogos mobiles; • Leitura e Gravação de arquivos; • Bibliotecas que não compilam adequadamente em todas as plataformas; • Necessidade de integrar bibliotecas exclusivas para diferentes plataformas
  • 9.
    Resultado • Longosperiodos de produção e desenvolvimento; • Códigos não-padronizados; • Novo ciclo de aprendizado para cada plataforma; • Custo elevado de produção; • AHHHHHHHH!!!!
  • 10.
  • 11.
  • 12.
    O que queremos? • Reduzir o tempo de produção do seu jogo; • Padronização de código-fonte; • Reduzir o tempo de aprendizado para implementação de bibliotecas • Reduzir o custo de produção do seu jogo
  • 13.
  • 14.
    O que éa UTools? • Qual o objetivo? Reduzir os custos e tempo de produção de jogos multiplataforma usando um framework padrão. • Como funciona? Através da implementação de módulos especializados, cada um fazendo a sua tarefa, independente da plataforma de destino! • E quais são os modulos? A imagem explica :)
  • 15.
  • 16.
    A UInput •Interface visual; • Permite configurar todas as entradas em um só lugar, incluindo virtual • Exportar e importar presets em formato JSON • Ativar, desativar ou mudar configurações em real-time
  • 17.
    Exemplo (C#) floath = 0.0f; if ( isPC ) { h = Input.GetAxis("Horizontal"); } else if ( isMobile ) { if( Input.acceleration.x >= 0.1f && Input.acceleration.x < 0.2f ) { h = 0.5f; } else if( Input.acceleration.x <= -0.1f && Input.acceleration.x > -0.2f ) { h = -0.5f; } else if( Input.acceleration.x >= 0.2f ) { h = 1.0f; } else if( Input.acceleration.x <= -0.2f ) { h = -1.0f; } else{ h = 0.0f; } }
  • 18.
    Exemplo (C# c/UInput) float h = UInput.getAxis( "Player", "X" );
  • 19.
    A UData •Sintaxes amigáveis • Leitura e gravação funcionando em qualquer plataforma, com a mesma implementação • Armazenamento automático em nuvem quando a plataforma permitir
  • 20.
    Exemplo (C#) •Leitura BinaryWriter bW = new BinaryWriter( file ); bW.Write( section.id ); bW.Write( section.locked ); bW.Write( section.storeKey ); • Gravação BinaryReader bR = new BinaryReader( file ); section.id = bR.ReadUInt32(); section.locked = bR.ReadBoolean(); section.storeKey = bR.ReadString();
  • 21.
    Exemplo (C# c/UData) • Leitura udSave.OpenPlayerData( "jelly_save", false); // False = Leitura udSave.Write( section.id ); udSave.Write( section.locked ); udSave.Write( section.storeKey ); • Gravação udSave.OpenPlayerData( "jelly_save", true ); // True = Gravação section.id = udSave.Read<uint>(); section.locked = udSave.Read<bool>(); section.storeKey = udSave.Read<string>();
  • 22.
  • 23.