Skip to content

커스텀 Scaler (Custom Scalers)

사용자 지정 Scaler를 생성하여 Web Adaptive Performance 시스템을 쉽게 확장할 수 있습니다. 특정 게임 메커니즘을 동적으로 최적화하려는 경우 유용합니다. 예를 들어 군중 밀도를 줄이거나, 무거운 셰이더를 비활성화하거나, FPS가 떨어질 때 적 AI를 단순화할 수 있습니다.

WebAP 대 Unity AP 아키텍처

공식 Unity 패키지에서 사용자 지정 Scaler를 만들려면 복잡한 설정이 필요합니다. ScriptableObject를 생성하고, 인터페이스를 통해 구성을 상호 연결하고, 상호 배타적인 두 워크플로 중 하나를 선택해야 합니다.

WebAP에서는 모든 것이 플러그 앤 플레이(Plug-and-Play) 방식으로 작동합니다.
단순히 WebScalerBase에서 상속되는 단일 C# 스크립트를 작성하기만 하면 됩니다. 플러그인 코어는 자동으로 해당 클래스를 발견하고 Project Settings 창의 전역 Scaler 목록에 표시하며, 여기서 이를 활성화하고 시각적으로 매개변수를 구성할 수 있습니다.

예제로 배우기

사용자 지정 Scaler를 작성하는 방법을 이해하는 가장 좋은 방법은 내장된 Scaler를 살펴보는 것입니다. 모든 기본 Scaler(해상도, 그림자, LOD 등)의 소스 코드는 프로젝트의 다음 위치에 있습니다:
WebAdaptivePerformance/Runtime/Scalers/.

사용자 지정 Scaler 템플릿

Scaler를 만들려면 3개의 간단한 단계를 완료하세요:

  1. WebScalerBase에서 클래스를 상속합니다.
  2. 생성자에 기본 매개변수(Target, Visual Impact, Max Level)를 설정합니다.
  3. 수명 주기 메서드인 OnEnabled(), OnDisabled(), OnLevel()을 재정의합니다.

IL2CPP Stripping (WebGL의 경우 필수)

WebGL용 프로젝트를 빌드할 때 IL2CPP 컴파일러는 "죽은 코드(dead code)"를 공격적으로 제거("strip")합니다. 플러그인이 리플렉션을 통해 동적으로 사용자 지정 Scaler를 인스턴스화하기 때문에 컴파일러는 이를 사용하지 않는 것으로 간주하여 빌드에서 삭제합니다.

항상 사용자 지정 클래스에 [UnityEngine.Scripting.Preserve] 특성(attribute)을 첨부하세요. 이렇게 하면 출시 빌드에서 Scaler가 확실히 작동합니다.

예시: 텍스처 품질 Scaler

아래는 텍스처 해상도(Mipmap Limit)를 줄이는 Scaler를 생성하는 포괄적인 예입니다.

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

// 속성은 UI 표시(Project Settings) 및 코드 스트리핑(IL2CPP) 방지를 위해 필수적입니다
[Serializable]
[UnityEngine.Scripting.Preserve] 
public sealed class WebTextureQualityScaler : WebScalerBase
{
    // 사용자의 초기 설정을 독점적으로 저장하기 위한 변수
    private int _defaultTextureLimit;

    public WebTextureQualityScaler()
    {
        // 이 Scaler가 비디오 카드의 부하를 줄이도록 정의합니다
        _target = ScalerTarget.GPU; 
        
        // 텍스처 해상도를 줄이는 것은 눈에 잘 띄므로 High
        _visualImpact = ScalerVisualImpact.High;
        
        // 텍스처 저하의 3단계를 설정합니다: 절반(1), 1/4(2), 1/8(3)
        _maxLevel = 3; 
    }

    // 게임 시작 시 또는 플러그인 활성화 시 호출됨
    protected override void OnEnabled()
    {
        // Scaler를 비활성화할 때 복원하기 위해 원래 값을 기억합니다
        _defaultTextureLimit = QualitySettings.globalTextureMipmapLimit;
        ApplyScale();
    }

    // 플러그인 비활성화 시 또는 수동으로 Scaler 제거 시 호출됨
    protected override void OnDisabled()
    {
        // 게임을 안전하게 초기 상태로 되돌립니다
        QualitySettings.globalTextureMipmapLimit = _defaultTextureLimit;
    }

    // Indexer가 품질 레벨을 변경하기로 결정할 때마다 호출됨
    protected override void OnLevel()
    {
        ApplyScale();
    }

    private void ApplyScale()
    {
        // ScaleChanged() 메서드는 스케일링을 다시 계산하고 변경된 경우 true를 반환합니다
        if (ScaleChanged())
        {
            // 계산에 기본값을 의도적으로 사용하지 않습니다
            // 그래픽이 이미 최소인 경우 충돌을 방지하기 위함입니다.
            // 
            // globalTextureMipmapLimit 매개변수는 정수를 허용합니다: 
            // 0 (전체), 1 (절반), 2 (1/4), 3 (1/8).
            // CurrentLevel (0에서 3)은 이 논리와 완벽하게 일치합니다.
            QualitySettings.globalTextureMipmapLimit = CurrentLevel;
        }
    }
}

이 스크립트를 저장한 후 Edit -> Project Settings -> Adaptive Performance (Web) 로 이동합니다. Scalers 탭을 확장하면 사용 가능한 모듈 목록에 Texture Quality가 표시됩니다.

개체 찾기 최적화

OnLevel() 메서드는 자주 호출될 수 있습니다(Cooldown 트리거 중). 내부에서 GameObject.Find() 또는 GetComponent()와 같은 무거운 메서드를 사용하지 마십시오. 항상 OnEnabled() 메서드에서 필요한 구성 요소를 찾아 캐시(cache)하십시오.