코드를 통한 URP 품질 설정 제어
Unity는 다양한 레벨의 품질 설정 프리셋을 제공하며, 프로젝트에 프리셋을 더 추가할 수도 있습니다. 다양한 하드웨어 사양을 수용하기 위해 C# 스크립트에서 프리셋 레벨 및 연결된 URP 에셋 간에 전환할 수 있습니다. 다음 예제는 API를 사용하여 품질 설정 레벨과 활성 URP 에셋을 변경하는 방법과 런타임 시점에 URP 에셋의 특정 설정을 변경하는 방법을 보여줍니다.
참고: 로딩 화면이나 정적 메뉴 등과 같이 성능이 중요하지 않은 지점에서만 런타임 시점에 품질 설정과 URP 에셋 설정을 변경해야 합니다. 이러한 변경은 일시적이지만 성능에 큰 영향을 주기 때문입니다.
런타임 시점에 URP 에셋 변경
각 품질 레벨은 URP 에셋을 사용하여 많은 특정 그래픽스 설정을 제어합니다. 각 품질 레벨에 서로 다른 URP 에셋을 할당하고 런타임 시점에 전환할 수 있습니다.
프로젝트 품질 설정 구성
품질 설정을 사용하여 URP 에셋 간에 전환하려면 프로젝트의 품질 레벨이 서로 다른 URP 에셋을 사용하도록 설정되어 있어야 합니다. URP 3D 샘플 씬은 기본적으로 그렇게 설정되어 있습니다.
각 품질 레벨에 대한 URP 에셋을 생성합니다. 이렇게 하려면 프로젝트 창에서 오른쪽 클릭하고 Create > Rendering > URP Asset (with Universal Renderer)을 선택합니다.
참고: 이 지침은 2D 렌더러를 사용하는 URP 에셋에도 적용됩니다.
필요에 따라 새 URP 에셋을 설정하고 이름을 지정합니다.
- 프로젝트 설정에서 품질 섹션(Edit > Project Settings > Quality)을 엽니다.
- 각 URP 에셋에 품질 레벨을 할당합니다. 이렇게 하려면 Levels 리스트에서 품질 레벨을 선택하고 Rendering > Render Pipeline Asset으로 이동한 후 이 품질 레벨에 대해 생성한 URP 에셋을 선택합니다. 각 품질 레벨에 대해 이 작업을 수행합니다.
이제 프로젝트의 품질 레벨을 사용하여 런타임 시점에 URP 에셋 간에 변경할 수 있습니다.
품질 레벨 변경
QualitySettings API를 통해 런타임 시점에 Unity가 사용하는 품질 레벨을 변경할 수 있습니다. 앞서 설명한 대로 품질 레벨을 설정하면 URP 에셋과 품질 설정 프리셋 간에 전환할 수 있습니다.
다음의 간단한 예제에서는 C# 스크립트가 빌드된 프로젝트를 열 때 사용자 입력 없이도 시스템의 총 그래픽스 메모리를 사용하여 적절한 품질 레벨을 결정합니다.
- QualityControls라는 이름의 새 C# 스크립트를 생성합니다.
QualityControls 스크립트를 열고
SwitchQualityLevel
메서드를QualityControls
클래스에 추가합니다.using System.Collections; using System.Collections.Generic; using UnityEngine; public class QualityControls : MonoBehaviour { void Start() { } private void SwitchQualityLevel() { } }
아래와 같이
SwitchQualityLevel
메서드에switch
문을 추가하여QualitySettings.SetQualityLevel()
메서드로 품질 레벨을 선택합니다.참고: 각 품질 레벨에는 프로젝트 설정 창의 Quality 섹션에 있는 리스트에서 해당 레벨의 위치와 일치하는 인덱스가 있습니다. 리스트 맨 위에 있는 품질 레벨의 인덱스는 0입니다. 이 인덱스는 빌드된 프로젝트 버전의 타겟 플랫폼에 대해 활성화된 것으로 지정한 품질 레벨만 계산합니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class QualityControls : MonoBehaviour { void Start() { } private void SwitchQualityLevel() { // Select Quality settings level (URP Asset) based on the size of the device's graphics memory switch (SystemInfo.graphicsMemorySize) { case <= 2048: QualitySettings.SetQualityLevel(1); break; case <= 4096: QualitySettings.SetQualityLevel(2); break; default: QualitySettings.SetQualityLevel(0); break; } } }
Start
메서드에SwitchQualityLevel
메서드에 대한 호출을 추가합니다. 이렇게 하면 씬이 처음 로드될 때만 품질 레벨이 변경됩니다.using System.Collections; using System.Collections.Generic; using UnityEngine; public class QualityControls : MonoBehaviour { void Start() { SwitchQualityLevel(); } private void SwitchQualityLevel() { // Select Quality settings level (URP Asset) based on the size of the device's graphics memory switch (SystemInfo.graphicsMemorySize) { case <= 2048: QualitySettings.SetQualityLevel(1); break; case <= 4096: QualitySettings.SetQualityLevel(2); break; default: QualitySettings.SetQualityLevel(0); break; } } }
시작될 때 빌드한 프로젝트가 로드하는 첫 번째 씬을 엽니다.
- 빈 게임 오브젝트를 생성하고 QualityController라고 명명합니다. 이렇게 하려면 계층 창에서 오른쪽 클릭하고 Create Empty를 선택합니다.
- 인스펙터에서 QualityController 오브젝트를 엽니다.
- QualityControls 스크립트를 QualityController에 컴포넌트로 추가합니다.
이제 이 씬이 로드되면 Unity는 QualityControls 스크립트의 SwitchQualityLevel
메서드를 실행하여 시스템의 총 그래픽스 메모리를 감지하고 품질 레벨을 설정합니다. 품질 레벨은 URP 에셋을 활성 렌더 파이프라인 에셋으로 설정합니다.
사용할 품질 레벨을 정하기 위해 더 복잡한 시스템과 검사 시퀀스를 만들 수 있지만,기본적인 프로세스는 동일하게 유지됩니다. 프로젝트가 시작되면 QualitySettings.SetQualityLevel
을 사용하는 스크립트를 실행하여 품질 레벨을 선택하고, 이를 통해 프로젝트가 런타임 시점에 사용할 URP 에셋을 선택합니다.
URP 에셋 설정 변경
C# 스크립트를 사용하여 런타임 시점에 URP 에셋의 일부 프로퍼티를 변경할 수 있습니다. 이를 통해 프로젝트의 품질 레벨과 완전히 일치하지 않는 하드웨어가 탑재된 기기에서 성능을 미세 조정할 수 있습니다.
참고: C# 스크립트를 통해 URP 에셋의 프로퍼티를 변경하려면 해당 프로퍼티에
set
메서드가 있어야 합니다. 이러한 프로퍼티에 대한 자세한 내용은 액세스 가능한 프로퍼티를 참조하십시오.
다음 예제에서는 코드를 통한 품질 레벨 변경 섹션의 QualityControls 스크립트와 QualityController 오브젝트를 사용하며, 해당 기능을 확장하여 활성 URP 에셋을 찾고 하드웨어의 성능 레벨에 맞게 일부 프로퍼티를 변경합니다.
- QualityControls 스크립트를 엽니다.
- 스크립트 맨 위에
using UnityEngine.Rendering
및using UnityEngine.Rendering.Universal
을 추가합니다. 아래와 같이
QualityControls
클래스에 이름이ChangeAssetProperties
이고 타입이void
인 메서드를 추가합니다.using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class QualityController : MonoBehaviour { void Start() { // Select the appropriate Quality Level first SwitchQualityLevel(); } private void SwitchQualityLevel() { // Code from previous example } private void ChangeAssetProperties() { // New code is added to this method } }
아래와 같이
GraphicsSettings.currentRenderPipeline
을 사용하여 활성 렌더 파이프라인 에셋을 검색합니다.참고: 스크립트가 올바르게 작동하려면
as
키워드를 사용하여 렌더 파이프라인 에셋을UniversalRenderPipelineAsset
타입으로 캐스팅해야 합니다.using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class QualityController : MonoBehaviour { void Start() { // Select the appropriate Quality Level first SwitchQualityLevel(); } private void SwitchQualityLevel() { // Code from previous example } private void ChangeAssetProperties() { // Locate the current URP Asset UniversalRenderPipelineAsset data = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; // Do nothing if Unity can't locate the URP Asset if (!data) return; } }
ChangeAssetProperties 메서드에
switch
문을 추가하여 URP 에셋 프로퍼티의 값을 설정합니다.using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class QualityController : MonoBehaviour { void Start() { // Select the appropriate Quality Level first SwitchQualityLevel(); } private void SwitchQualityLevel() { // Code from previous example } private void ChangeAssetProperties() { // Locate the current URP Asset UniversalRenderPipelineAsset data = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; // Do nothing if Unity can't locate the URP Asset if (!data) return; // Change URP Asset settings based on the size of the device's graphics memory switch (SystemInfo.graphicsMemorySize) { case <= 1024: data.renderScale = 0.7f; data.shadowDistance = 50.0f; break; case <= 3072: data.renderScale = 0.9f; data.shadowDistance = 150.0f; break; default: data.renderScale = 0.7f; data.shadowDistance = 25.0f; break; } } }
Start
메서드에ChangeAssetProperties
메서드에 대한 호출을 추가합니다. 이렇게 하면 씬이 처음 로드될 때만 URP 에셋이 변경됩니다.using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class QualityController : MonoBehaviour { void Start() { // Select the appropriate Quality Level first SwitchQualityLevel(); // Fine tune performance with specific URP Asset properties ChangeAssetProperties(); } private void SwitchQualityLevel() { // Code from previous example } private void ChangeAssetProperties() { // Locate the current URP Asset UniversalRenderPipelineAsset data = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; // Do nothing if Unity can't locate the URP Asset if (!data) return; // Change URP Asset settings based on the size of the device's graphics memory switch (SystemInfo.graphicsMemorySize) { case <= 1024: data.renderScale = 0.7f; data.shadowDistance = 50.0f; break; case <= 3072: data.renderScale = 0.9f; data.shadowDistance = 150.0f; break; default: data.renderScale = 0.7f; data.shadowDistance = 25.0f; break; } } }
이제 이 씬이 로드되면 Unity는 시스템의 총 그래픽스 메모리를 감지하고 그에 따라 URP 에셋 프로퍼티를 설정합니다.
이러한 방식으로 URP 에셋 프로퍼티와 품질 레벨을 변경하면 모든 타겟 하드웨어 설정에 대한 품질 레벨을 생성하지 않고도 다양한 시스템에 맞게 프로젝트의 성능을 미세 조정할 수 있습니다.
액세스 가능한 프로퍼티
런타임 시점에 C# 스크립트를 통해 set
메서드가 있는 URP 에셋의 모든 프로퍼티에 액세스하고 변경할 수 있습니다.
다음 URP 에셋의 프로퍼티에는 set
메서드가 있습니다.
- cascadeBorder
- colorGradingLutSize
- colorGradingMode
- conservativeEnclosingSphere
- fsrOverrideSharpness
- fsrSharpness
- hdrColorBufferPrecision
- maxAdditionalLightsCount
- msaaSampleCount
- numIterationsEnclosingSphere
- renderScale
- shadowCascadeCount
- shadowDepthBias
- shadowDistance
- shadowNormalBias
- storeActionsOptimization
- supportsCameraDepthTexture
- supportsCameraOpaqueTexture
- supportsDynamicBatching
- supportsHDR
- upscalingFilter
- useAdaptivePerformance
- useSRPBatcher
이러한 프로퍼티에 대한 자세한 내용은 유니버설 렌더 파이프라인 에셋 API를 참조하십시오.