Skip to content

Custom Scalers

Puedes extender el sistema Web Adaptive Performance sin esfuerzo creando Scalers personalizados. Esto es ventajoso si deseas optimizar dinámicamente mecánicas específicas: por ejemplo, reduciendo la densidad de multitudes, deshabilitando shaders pesados, o simplificando la IA enemiga cuando los FPS caen.

Arquitectura WebAP vs Unity AP

En el paquete oficial de Unity, la creación de Scalers personalizados requiere una configuración compleja: generar un ScriptableObject, interconectar las configuraciones a través de interfaces y elegir uno de los dos flujos de trabajo mutuamente excluyentes.

En WebAP, todo funciona de manera Plug-and-Play.
Simplemente escribe un solo script de C# que herede de WebScalerBase. El núcleo del plugin descubre automáticamente tu clase y la agrega a la lista global de Scalers en la ventana Project Settings, donde puedes activarla y configurar sus parámetros visualmente.

Aprendiendo con Ejemplos

La mejor manera de entender cómo escribir Scalers personalizados es examinar los incorporados. El código fuente de todos los Scalers base (Resolución, Sombras, LOD, etc.) reside en tu proyecto en:
WebAdaptivePerformance/Runtime/Scalers/.

Plantilla de Scaler Personalizado

Para crear tu Scaler, completa 3 sencillos pasos:

  1. Hereda una clase de WebScalerBase.
  2. Establece los parámetros predeterminados en el constructor (Target, Visual Impact, Max Level).
  3. Sobrescribe los métodos del ciclo de vida: OnEnabled(), OnDisabled(), y OnLevel().

Stripping IL2CPP (Crítico para WebGL)

Al crear un proyecto para WebGL, el compilador IL2CPP elimina agresivamente el "código muerto". Dado que el plugin instancia tus Scalers personalizados dinámicamente a través de reflexión, el compilador los considerará sin uso y los eliminará de la build.

Siempre adjunta el atributo [UnityEngine.Scripting.Preserve] a tus clases personalizadas. Esto garantiza que el Scaler funcionará en la build de lanzamiento (release).

Ejemplo: Texture Quality Scaler

A continuación se muestra un ejemplo completo de la creación de un Scaler que reduce la resolución de la textura (Mipmap Limit).

csharp
using System;
using UnityEngine;
using GrindsetStudios.WebAdaptivePerformance.Scalers;

// Los atributos son obligatorios para la visualización de UI (Project Settings) y la protección contra Code Stripping (IL2CPP)
[Serializable]
[UnityEngine.Scripting.Preserve] 
public sealed class WebTextureQualityScaler : WebScalerBase
{
    // Una variable exclusivamente para almacenar la configuración inicial del usuario
    private int _defaultTextureLimit;

    public WebTextureQualityScaler()
    {
        // Define que este Scaler reduce la carga en la tarjeta de video
        _target = ScalerTarget.GPU; 
        
        // Reducir la resolución de las texturas es muy notable, por lo tanto High
        _visualImpact = ScalerVisualImpact.High;
        
        // Establece 3 pasos de degradación de la textura: Mitad (1), Cuarto (2), Octavo (3)
        _maxLevel = 3; 
    }

    // Llamado al inicio del juego o en la activación del plugin
    protected override void OnEnabled()
    {
        // Memoriza el valor original para restaurarlo al desactivar el Scaler
        _defaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
        ApplyScale();
    }

    // Llamado a la desactivación del plugin o eliminación manual del Scaler
    protected override void OnDisabled()
    {
        // Revierte el juego de manera segura a su estado inicial
        QualitySettings.globalTextureMipmapLimit = _defaultTextureLimit;
    }

    // Llamado cada vez que el Indexer decide cambiar el nivel de calidad
    protected override void OnLevel()
    {
        ApplyScale();
    }

    private void ApplyScale()
    {
        // El método ScaleChanged() recalcula el escalado y devuelve verdadero si ha cambiado
        if (ScaleChanged())
        {
            // Evitamos deliberadamente usar el valor predeterminado para los cálculos
            // para evitar conflictos si los gráficos ya estaban al mínimo.
            // 
            // El parámetro globalTextureMipmapLimit acepta enteros: 
            // 0 (Completo), 1 (Mitad), 2 (Cuarto), 3 (Octavo).
            // Nuestro CurrentLevel (de 0 a 3) se alinea perfectamente con esta lógica.
            QualitySettings.globalTextureMipmapLimit = CurrentLevel;
        }
    }
}

Una vez que guardes este script, ve a Edit -> Project Settings -> Adaptive Performance (Web). Expande la pestaña Scalers y verás tu Texture Quality en la lista de módulos disponibles.

Optimización de Búsqueda de Objetos

El método OnLevel() se puede invocar con frecuencia (durante los activadores de Cooldown). Nunca utilices métodos pesados como GameObject.Find() o GetComponent() en su interior. Siempre localiza y almacena en caché los componentes requeridos en el método OnEnabled().