Custom Scalers
Pode estender o sistema Web Adaptive Performance sem esforço criando Scalers personalizados. Isto é vantajoso se desejar otimizar dinamicamente mecânicas específicas: por exemplo, reduzindo a densidade da multidão, desativando shaders pesados ou simplificando a IA inimiga quando os FPS caem.
Arquitetura WebAP vs Unity AP
No pacote oficial da Unity, a criação de Scalers personalizados requer uma configuração complexa: gerar um ScriptableObject, interligar as configurações por meio de interfaces e escolher um dos dois workflows mutuamente exclusivos.
No WebAP, tudo opera de maneira Plug-and-Play.
Basta escrever um único script C# que herda de WebScalerBase. O núcleo do plugin descobre automaticamente a sua classe e popula-a para a lista global de Scalers na janela de Project Settings, onde pode ativá-la e configurar os seus parâmetros visualmente.
Aprendendo por Exemplo
A melhor maneira de entender como escrever Scalers personalizados é examinar os embutidos. O código-fonte de todos os Scalers base (Resolução, Sombras, LOD, etc.) reside no seu projeto em:WebAdaptivePerformance/Runtime/Scalers/.
Template de Scaler Personalizado
Para criar o seu Scaler, complete 3 passos simples:
- Herde uma classe de
WebScalerBase. - Defina os parâmetros predefinidos no construtor (
Target,Visual Impact,Max Level). - Sobrescreva os métodos de ciclo de vida:
OnEnabled(),OnDisabled()eOnLevel().
IL2CPP Stripping (Crítico para WebGL)
Ao construir um projeto para WebGL, o compilador IL2CPP remove ("strips") agressivamente "código morto". Dado que o plugin instancia os seus Scalers personalizados de forma dinâmica através de reflexão, o compilador irá considerá-los sem uso e removê-los do build.
Sempre anexe o atributo [UnityEngine.Scripting.Preserve] às suas classes personalizadas. Isto garante que o Scaler funcione na build de lançamento (release).
Exemplo: Texture Quality Scaler
Abaixo está um exemplo abrangente de criação de um Scaler que reduz a resolução de textura (Mipmap Limit).
using System;
using UnityEngine;
using GrindsetStudios.WebAdaptivePerformance.Scalers;
// Os atributos são obrigatórios para exibição de UI (Project Settings) e proteção contra Code Stripping (IL2CPP)
[Serializable]
[UnityEngine.Scripting.Preserve]
public sealed class WebTextureQualityScaler : WebScalerBase
{
// Uma variável exclusivamente para armazenar as configurações iniciais do utilizador
private int _defaultTextureLimit;
public WebTextureQualityScaler()
{
// Define que este Scaler reduz a carga na placa de vídeo
_target = ScalerTarget.GPU;
// Reduzir a resolução das texturas é altamente notável, logo High
_visualImpact = ScalerVisualImpact.High;
// Estabelece 3 passos de degradação da textura: Metade (1), Quarto (2), Oitavo (3)
_maxLevel = 3;
}
// Chamado na inicialização do jogo ou na ativação do plugin
protected override void OnEnabled()
{
// Memorize o valor original para o restaurar ao desativar o Scaler
_defaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
ApplyScale();
}
// Chamado na desativação do plugin ou na remoção manual do Scaler
protected override void OnDisabled()
{
// Reverta o jogo de forma segura ao seu estado inicial
QualitySettings.globalTextureMipmapLimit = _defaultTextureLimit;
}
// Chamado cada vez que o Indexer resolve alterar o nível de qualidade
protected override void OnLevel()
{
ApplyScale();
}
private void ApplyScale()
{
// O método ScaleChanged() recalcula o escalonamento e retorna verdadeiro se tiver mudado
if (ScaleChanged())
{
// Evitamos deliberadamente usar o valor padrão para cálculos
// para prevenir conflitos se os gráficos já estivessem no mínimo.
//
// O parâmetro globalTextureMipmapLimit aceita números inteiros:
// 0 (Full), 1 (Metade), 2 (Quarto), 3 (Oitavo).
// O nosso CurrentLevel (de 0 a 3) alinha-se perfeitamente com esta lógica.
QualitySettings.globalTextureMipmapLimit = CurrentLevel;
}
}
}Assim que guardar este script, navegue até Edit -> Project Settings -> Adaptive Performance (Web). Expanda a aba Scalers e verá a sua Texture Quality na lista de módulos disponíveis.
Otimização de Busca de Objetos
O método OnLevel() pode ser invocado frequentemente (durante gatilhos de Cooldown). Nunca use métodos pesados como GameObject.Find() ou GetComponent() no interior dele. Sempre localize e faça o cache dos componentes requeridos no método OnEnabled().
