Skip to content

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:

  1. Herde uma classe de WebScalerBase.
  2. Defina os parâmetros predefinidos no construtor (Target, Visual Impact, Max Level).
  3. Sobrescreva os métodos de ciclo de vida: OnEnabled(), OnDisabled() e OnLevel().

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).

csharp
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().