때로는 게임에서 런타임 조건에 따라 다른 리소스 버전을 로드하고 사용하도록 해야 할 수 있습니다. 예를 들어 게임을 여러 언어로 번역하려는 경우 플레이어가 선택한 현재 언어에 따라 다른 텍스처를 표시하고 다른 애니메이션을 재생해야 할 수 있습니다. 또는 현재 게임이 실행되는 플랫폼에 따라 다른 리소스 버전을 사용해야 하는 경우도 있습니다.
Stingray는 지정한 설정을 기반으로 로드할 각 리소스에 대해 가장 적절한 버전을 자동으로 선택하는 내장 리소스 선택 메커니즘을 제공합니다.
현지화 메커니즘은 오버라이드라는 기본 개념을 기반으로 합니다. 오버라이드는 엔진이 특정 리소스를 요청하면 해당 리소스를 다른 리소스로 자동으로 대체하는 것을 의미합니다. 예를 들어, 다음 오버라이드가 활성 상태인 경우
엔진이 larch_03을 생성하려고 하면 대신 pine_05가 생성됩니다. 따라서 낙엽송으로 가득 찬 수준이 대신 소나무로 가득 찬 수준으로 보입니다.
오버라이드는 유닛이 생성되는 경우처럼 리소스가 인스턴스화될 때 발생합니다. 오버라이드는 소급 적용되지는 않기 때문에 오버라이드가 활성화되기 전에 생성된 낙엽송은 오버라이드를 활성화한 후에도 그대로 낙엽송으로 유지됩니다.
오버라이드 리소스는 그대로 소나무가 됩니다. 해당 리소스의 이름을 요청하면 trees/larch_03이 아닌 trees/pine_05가 됩니다. 게임 개발자는 오버라이드 리소스가 자신이 오버라이드하는 리소스의 대체자로 작동하는 데 필요한 모든 액터, 골격, 메시 등을 갖고 있는지 확인해야 합니다.
개별 리소스만 오버라이드할 수 있습니다. 폴더는 오버라이드할 수 없습니다.
한 리소스가 다른 리소스를 오버라이드하도록 만드는 가장 간단한 방법은 스크립트에서 명시적으로 이를 지정해주는 것입니다.
stingray.Application.set_resource_override("unit", "trees/larch_03", "trees/pine_05")
이러한 유형의 오버라이드는 어느 리소스가 다른 리소스를 오버라이드할지 스크립트가 완벽하게 제어할 수 있기 때문에 매우 유연하면서도 강력합니다. 하지만 이 방식은 전적으로 스크립트에 의존하는 것이라 패키지를 컴파일하는 방식에는 영향을 미치지 않습니다. 따라서 다른 리소스를 오버라이드하는 데 사용할 리소스를 수동으로 .package 파일에 추가해주어야 합니다.
접미사 오버라이드 시스템은 리소스 접미사를 바탕으로 자동 오버라이드를 생성합니다. 이 방법은 스크립트형 시스템만큼 유연하진 않지만 번들링 시스템이 이해할 수 있는 정적 시스템이기 때문에 보다 편리합니다.
접미사 오버라이드는 .stingray_project 파일에서 지정합니다. 샘플의 모습은 다음과 비슷합니다.
data_compiler = { resource_overrides = [ {suffix = ".win32", platforms = ["win32"]} {suffix = ".ps4", platforms = ["ps4"]} {suffix = ".xb1", platforms = ["xb1"]} {suffix = ".ios", platforms = ["ios"]} {suffix = ".android", platforms = ["android"]} {suffix = ".noblood", flags = ["noblood"]} {suffix = ".4k", flags = ["4k"]} {suffix = ".color-blind", flags = ["color-blind"]} ] }
접미사 오버라이드가 활성화되어 있고, 프로젝트에 접미사가 있는 리소스가 있으면 기준 리소스에서 접미사가 있는 리소스로의 오버라이드가 자동으로 생성됩니다.
따라서 .ps4 접미사가 활성화되어 있고, 엔진에 rocks/big_white_rock.unit 리소스와 rocks/big_white_rock.ps4.unit 리소스가 모두 있다면
오버라이드가 자동으로 생성됩니다.
일반적으로 접미사 오버라이드는 마침표(.)로 시작하지만 꼭 그런 것은 아닙니다. 접미사는 -hifi 등 어떠한 문자열이든 될 수 있습니다.
접미사 오버라이드는 플랫폼 접미사와 플래그 접미사, 두 가지 종류가 있습니다. 플랫폼 접미사는 특정 플랫폼용 데이터를 컴파일할 때 자동으로 적용됩니다. 예는 다음과 같습니다.
{suffix = ".mobile", platforms = ["ios", "android"]}
그러면 iOS 또는 Android용으로 컴파일할 때마다 이 오버라이드가 활성화됩니다.
플래그 접미사의 경우 컴파일 시 플래그 상태를 지정할 수 있습니다.
--resource-flag-true noblood --resource-flag-false 4k
그렇게 하면 플래그가 true 또는 false로 하드 매핑되고, 그 값에 해당하는 리소스만 번들에 포함됩니다.
컴파일 시 true 또는 false로 설정되어 있지 않은 모든 플래그는 동적 플래그로 간주됩니다. 이 경우 두 리소스 변형 모두 번들에 포함되고, 플래그를 설정하고 지움으로써 런타임 시 둘 간에 전환할 수 있습니다.
stingray.Application.set_resource_override_flag("color-blind", 100)
이렇게 하면 color-blind 플래그가 활성화되고, 그 우선순위가 100으로 설정됩니다. 우선순위는 적용될 가능성이 있는 런타임 리소스가 여럿일 때 그 효과를 발휘합니다. 우선순위가 가장 높은 오버라이드가 우선 적용됩니다. 기준 리소스(런타임 플래그 없음)가 우선순위 0인 것으로 간주됩니다. 스크립트로 설정된 명시적 오버라이드는 항상 스크립트형 오버라이드보다 우선합니다.
단순함을 위해 한 리소스가 여러 접미사를 가지는 것은 지원되지 않습니다. 최대 하나의 접미사가 짝을 이룹니다. 플래그와 플랫폼의 조합을 사용하고 싶다면 해당 조합에 대한 명시적인 접미사를 생성해야 합니다.
게임 작업을 하는 동안에는 항상 리소스의 가장 일반적인 버전을 참조하십시오. big_white_rock.ps4 유닛을 수준에 명시적으로 포함한다면 해당 리소스가 모든 플랫폼에서 사용됩니다. 오버라이드 해상도를 가져오려면 big_white_rock 유닛을 수준에 포함해야 하며, 그러면 해당 유닛이 오버라이드 설정을 기반으로 big_white_rock.ps4, big_white_rock.xb1에 자동으로 다시 매핑됩니다.