이 절차는 리소스 패키지를 생성 및 사용하여 다양한 수준에 맞게 컨텐츠를 메모리에 넣거나 메모리에서 가져와 교체하는 프로세스를 안내합니다.
최종적으로, 리소스를 패키지로 분할하기 위한 다른 전략을 사용할 계획이라고 해도 먼저 이 절차를 따라하면서 패키징 시스템이 작동하는 방식을 익혀두는 것이 좋습니다.
이 단계에서는 게임에서 바꿔가며 사용할 두 개의 새 수준을 생성합니다.
empty 템플릿으로 새 프로젝트를 시작합니다.
루트 수준에 content_level_1이라는 새 폴더를 만듭니다.
content_level_1 폴더로 새 자산을 몇 개 가져옵니다.
새 수준을 생성하고, content_level_1 폴더에 추가해둔 일부 자산을 수준에 배치한 다음, 이 수준을 content_level_1/level_1.level로 저장합니다.
두 번째 수준에 대해서도 2~4단계를 반복하되 수준 이름을 content_level_2로 정합니다. 다양한 컨텐츠 세트를 가져오고 배치하여 서로 다른 수준을 로드했을 때 알아볼 수 있도록 합니다. 한 수준에 더 큰 유닛을 포함시켜 다른 수준보다 훨씬 더 큰 용량으로 만들어 두면 나중에 리소스 교체가 잘 이루어지는지 확인하기가 보다 쉽습니다.
script/lua/project.lua 파일을 편집합니다. 12번째 줄에서 다음과 같이 변경합니다.
basic = "content/levels/basic"
전환 대상:
basic = "content_level_1/level_1"
이렇게 하면 프로젝트를 실행하고 기본 메뉴에서 START를 선택하면 템플릿에 사전 생성되어 제공되는 기본 수준 대신 새로운 level_1이 기본 메뉴를 통해 로드됩니다.
이 단계에서는 플레이어에게 반응하여 두 수준 간에 교체하도록 기본 Level Flow를 설정합니다. 이 작업을 간단하게 하기 위해 본 지침에서는 플레이어가 l 키를 누를 때 변경을 트리거합니다. 원하면 다른 트리거를 사용해도 됩니다.
level_1을 열고 Level Flow 편집기를 엽니다.
Input > Keyboard Button 노드를 그래프에 추가합니다. Button Name 값을 변화를 트리거할 키로 설정합니다. 위 이미지의 예에서는 l를 사용합니다.
Level > Change Level 노드를 그래프에 추가합니다. Name 값이 content_level_2/level_2.level을 가리키도록 설정합니다.
Keyboard Button 노드의 Pressed 출력을 Change Level 노드의 In 포트에 연결합니다.
수준을 저장합니다.
level_2에 대해 위의 모든 단계를 반복하되, Change Level 노드가 다시 level_1로 변경되도록 설정합니다.
수준을 테스트하거나 프로젝트를 실행하고 기본 메뉴에서 START를 선택합니다. 이제 l 키를 눌러 두 컨텐츠 수준 간에 교체할 수 있습니다.
이제 설정된 두 개 수준이 잘 작동하고 있으니 믹스에 다른 리소스 패키지를 추가할 수 있도록 모든 프로젝트 리소스를 자동 로드하는 기능을 중지시킬 때입니다.
프로젝트의 boot.package를 Script Editor 패널 또는 즐겨 사용하는 텍스트 편집기에서 엽니다. 파일 위쪽에 있는 자동 로드 줄을 다음과 같이 변경합니다.
* = ["*"]
작업
* = ["core/*"]
이제 프로젝트를 실행하면 시작 시 코어 리소스만 로드됩니다. 수준과 해당 컨텐츠가 메모리에 저장되지 않습니다. 프로젝트를 실행하고, 기본 메뉴에서 START를 눌러보면 다음과 같은 오류가 발생할 것입니다.
basic_project_for_packages / Lua: core/appkit/lua/simple_project.lua:101: Level not loaded: content_level_1/level_1
편집기에서 Test Level을 실행할 때 수준이 잘 로드되는지 확인하십시오. Test Level 모드에서는 리소스가 필요할 때 항상 자동 로드됩니다. 리소스 패키지가 실제로 로드되는지 테스트하려면 Run Project를 사용해야 합니다.
이 단계에서는 각 컨텐츠 수준에서 사용되는 리소스를 수집할 두 개 패키지를 생성합니다.
content_level_1/level_1.package라는 이름으로 새 텍스트 파일을 생성합니다.
파일에 다음과 같은 줄을 삽입합니다.
* = ["content_level_1/*"]
이 줄로 인해 프로젝트의 content_level_1/ 폴더에 있는 모든 유형의 리소스가 이 패키지에 모두 포함됩니다.
content_level_2에 대해 같은 단계를 반복합니다.
boot.package로 돌아가 새로운 .package 리소스 파일에 다음과 같은 참조를 추가합니다.
package = [ "content_level_1/level_1" "content_level_2/level_2" ]
.package 파일 형식에 대한 자세한 내용은 리소스 패키지 정의를 참조하십시오.
이제 각각 자체 리소스 패키지를 가진 두 개의 수준이 있습니다. 이 단계에서는 수준 로드 코드가 해당 수준의 리소스 패키지를 먼저 메모리로 로드하도록 업데이트합니다. 해당 수준과 리소스가 더 이상 필요 없어지면 리소스 패키지를 메모리에서 언로드하도록 수준 언로드 코드도 업데이트할 것입니다.
empty 템플릿 프로젝트는 Appkit의 SimpleProject Lua 클래스를 사용합니다. 기본적으로 SimpleProject가 수준 로드 및 언로드를 처리하지만 여기에서는 필요한 리소스가 이미 메모리에 로드되어 사용할 준비가 된 상태라고 가정합니다. 패키지 로드 및 언로드를 지원하는 기능을 빌드하려면 SimpleProject 코드를 확장해야 합니다.
Appkit 및 SimpleProject 클래스에 대한 자세한 내용은 템플릿에서 Lua 시작: Appkit 사용의 항목들도 참조하십시오.
core/appkit/lua/simple_project.lua 파일을 프로젝트 소스 폴더 내 script/lua/simple_project.lua로 복사합니다.
코어 리소스에서 직접 이 파일의 코드를 수정할 수도 있지만 파일 복사본을 만들어 프로젝트로 가져오는 것이 더 안전합니다. 코어 리소스 작업 및 Appkit 사용자 정의의 논의 내용도 참조하십시오.
프로젝트의 script/lua/project.lua 파일을 열고, require 문이 simple_project.lua 파일의 새 위치를 가리키도록 다음과 같이 변경합니다.
SimpleProject = require 'script/lua/simple_project'
script/lua/simple_project.lua 파일을 엽니다.
현재 수준에 대한 리소스 패키지 오브젝트를 저장하도록 새로운 변수를 다음과 같이 선언합니다.
SimpleProject.resource_package = SimpleProject.resource_package or nil
이를 다른 SimpleProject 구성원 변수가 초기화되는 47번 줄에 추가합니다.
함수 시작 부분에 다음 코드를 추가해 load_level 함수를 업데이트합니다.
if stingray.Application.can_get("package", resource_name) then SimpleProject.resource_package = stingray.Application.resource_package(resource_name) stingray.ResourcePackage.load(SimpleProject.resource_package) stingray.ResourcePackage.flush(SimpleProject.resource_package) end
수준이 로드될 때마다 이 코드가 동일한 이름을 가진 .package 리소스를 찾습니다. 해당 리소스를 찾으면 메모리로 로드하고, SimpleProject.resource_package 변수가 이 리소스를 가리키도록 설정합니다.
함수 끝에 다음 코드를 추가해 unload_level 함수를 업데이트합니다.
if SimpleProject.resource_package ~= nil then stingray.ResourcePackage.unload(SimpleProject.resource_package) stingray.Application.release_resource_package(SimpleProject.resource_package) SimpleProject.resource_package = nil end
수준이 언로드될 때마다 이 코드가 해당 수준에 대해 로드된 리소스 패키지(있는 경우)를 제거합니다.
모든 파일을 저장합니다.
위에 나온 코드는 패키지를 즉시 로드하여 리소스가 모두 로드될 때까지 업데이트 루프가 계속 진행되지 않도록 차단합니다. 리소스 패키지가 너무 커지거나 속도가 매우 느린 매체에서 데이터를 읽어오는 경우에는 비동기 로드 모델을 사용하는 것이 좋습니다. 코드 예제를 더 많이 살펴보려면 패키지 로드 및 언로드를 참조하십시오.
이 단계에서는 게임이 실제로 소비하는 메모리가 런타임 시 예상대로 변화하는지 테스트를 통해 확인해볼 것입니다.
프로젝트를 실행합니다.
Stingray 편집기의 상태 막대에 있는 드롭다운 목록에서 실행 중인 프로젝트를 선택하고, 게임에 대해 perfhud memory 명령을 실행합니다. 상태 막대에서 명령 보내기도 참조하십시오.
게임 UI에 현재 메모리 사용량을 간략하게 보여주는 오버레이가 나타나야 합니다.
게임으로 이동하여 기본 메뉴에서 START를 눌러 첫 번째 수준을 로드합니다.
l 키를 눌러 수준 간에 교체합니다. 수준을 교체할 때마다 메모리 사용량이 증가하고 감소해야 합니다. 이는 리소스가 예상대로 메모리에 로드되었다가 다시 메모리에서 언로드되고 있다는 것을 나타냅니다.
memory_resources list unit 명령을 실행해 현재 메모리에 로드된 모든 유닛의 목록을 출력해 봄으로써 시스템이 예상대로 작동 중인지 확인할 수도 있습니다. level_1이 로드되면 이 명령의 출력 결과에 core, content 및 content_level_1 폴더의 리소스만 포함되고, content_level_2 폴더에서는 아무것도 포함되어서는 안 됩니다.
모든 콘솔 명령 목록도 참조하십시오.