스켈레톤 데이터 로딩

응용 프로그램에서 Spine 애니메이션을 얻는 첫 번째 단계는 Spine에서 내보낸 텍스처 아틀라스 및 스켈레톤 데이터를 로드하는 것입니다.

텍스처 아틀라스

Spine은 텍스처 아틀라스를 패킹할 수 있어 스켈레톤을 보다 효율적으로 렌더링합니다. 다른 도구는 "libgdx" 아틀라스 형식을 사용하는 텍스처 패커 프로와 같은 Spine 아틀라스 형식으로 텍스처 아틀라스를 패킹하는 데 사용될 수도 있습니다. Spine 런타임은 다음을 사용하여 아틀라스를 로드합니다.

TextureLoader textureLoader = ...
Atlas atlas = new Atlas("myAtlas.atlas", textureLoader);

아틀라스를 생성하면 아틀라스 텍스트 파일을 구문 분석합니다. 여기에는 아틀라스 페이지 이미지에 있는 영역에 대한 정보가 들어 있습니다. 또한 각 아틀라스 페이지의 이미지 파일을 로드합니다.

TextureLoader

이미지 로드는 게임 툴킷에 따라 다르므로 TextureLoader는 이미지를 생성하고 삭제합니다. 특정 게임 툴킷의 런타임에는 해당 게임 툴킷용 TextureLoader가 제공됩니다. 일반적인 런타임을 사용하는 경우, 자신만의 TextureLoader를 작성해야 합니다. 두 개의 메서드가 있습니다:

void load (AtlasPage page, String path)
void unload (Object rendererObject)

load 메서드는 경로를 사용하여 이미지를 로드하고 AtlasPagerendererObject 필드를 설정합니다. unload 메서드는 이전에 로드된 이미지를 삭제합니다. 예를 들어, 여기 텍스처는 게임 툴킷 유형입니다.

void load (AtlasPage page, String path) {
   Texture texture = GameToolkit.loadTexture(path);
   page.rendererObject = texture;
}

void unload (Object rendererObject) {
   Texture texture = (Texture)rendererObject;
   texture.dispose();
}

AtlasPage의 rendererObject렌더링 코드에서 사용됩니다.

JSON 및 바이너리 데이터

JSON 또는 바이너리 스켈레톤 데이터 로드는 SkeletonJson 또는 SkeletonBinary를 사용하여 수행됩니다. JSON은 사람이 읽을 수 있지만 파일 크기가 크기 때문에 구문 분석 속도가 느립니다. 바이너리는 매우 작고 빠르지만 사람이 읽을 수는 없습니다. SkeletonJson과 SkeletonBinary에는 모두 SkeletonData를 반환하는 readSkeletonData 메서드가 있습니다.

SkeletonJson 또는 SkeletonBinary 인스턴스를 생성하려면 AttachmentLoader를 지정해야 하며, 여기에는 새로운 첨부 인스턴스를 반환하는 메서드가 있습니다. AttachmentLoader는 나중에 렌더링할 수 있도록 어태치먼트의 아틀라스 영역을 설정하는 것과 같이 로드된 상태에서 어태치먼트를 사용자 지정하는 방법을 제공합니다. 이것은 매우 일반적이며 Spine 런타임에는 해당 작업을 정확히 수행하는 AtlasAttachmentLoader가 제공됩니다.

AtlasAttachmentLoader attachmentLoader = new AtlasAttachmentLoader(atlas);
SkeletonJson json = new SkeletonJson(attachmentLoader);
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");

AtlasAttachmentLoader는 어태치먼트의 path 문자열을 사용하여 텍스처 아틀라스에서 영역을 찾은 다음, 어태치먼트의 rendererObject 필드를 렌더링 코드에서 나중에 사용할 수 있도록 해당 영역으로 설정합니다.

AttachmentLoader

고급 사용자는 AtlasAttachmentLoader를 사용하는 대신 각 어태치먼트 유형에 대한 메서드가 있는 자신의 AttachmentLoader를 지정할 수 있습니다.

RegionAttachment newRegionAttachment (Skin skin, String name, String path)
MeshAttachment newMeshAttachment (Skin skin, String name, String path)
BoundingBoxAttachment newBoundingBoxAttachment (Skin skin, String name, String path)
PathAttachment newPathAttachment (Skin skin, String name, String path)

최소한 적절한 유형(또는 하위 클래스)의 새 어태치먼트를 생성하여 반환해야 하며, 그때 JSON 또는 이진 파일의 데이터로 추가 구성됩니다. 메서드가 null을 반환하면 어태치먼트가 마치 데이터에 전혀 없는 것처럼 무시됩니다.

영역 및 메쉬 첨부의 경우 rendererObject 필드는 렌더링 코드에 필요한 모든 개체로 설정될 수 있지만, 이는 선택 사항입니다. 예를 들어, 렌더링 이외의 목적으로 스켈레톤 데이터를 사용할 수 있으며 이미지를 로드할 필요가 없습니다. 또는 수천 개의 어태치먼트가 있을 수 있으며 스켈레톤 데이터가 로드될 때 모든 이미지를 로드할 수 없습니다. 이 경우 나중에 어느 어태치먼트가 실제로 사용되는지 알게 될 때까지 이미지 로드를 연기할 수 있습니다.

렌더링이 발생하기 전 적절한 시점에, rendererObject와 아틀라스 영역에 대한 몇 가지 속성을 설정해야 합니다(예: UV, 공백 제거된 영역 크기, 원본 이미지 크기 및 영역이 텍스처 패커에 의해 90도 회전된 경우). 이러한 속성을 설정하는 예제로 AtlasAttachmentLoader 소스에서 원하는 런타임을 참조하십시오.

스케일링

스켈레톤 데이터가 로드되면 SkeletonJson 또는 SkeletonBinary 클래스는 뼈대 위치, 이미지 크기 및 이동을 스케일링할 수 있습니다.

SkeletonJson json = new SkeletonJson(attachmentLoader);
json.scale = 2;
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");

이렇게 하면 스켈레톤이 다른 크기로 그려지며, 이 예제에서는 두 배가 됩니다. Spine에서 스켈레톤을 디자인할 때 사용된 것보다 다른 크기의 이미지를 사용할 때 스케일링이 유용할 수 있습니다. 예를 들어, Spine에서 사용된 것보다 크기가 절반인 이미지를 사용하는 경우 0.5의 배율을 사용할 수 있습니다. 일부 게임에는 크기가 다른 텍스처 아틀라스가 포함되어 있으며 플레이어의 화면 해상도에 따라 사용할 아틀라스를 선택합니다.

로더 스케일을 사용하면 사용된 단위가 변경됩니다. 예를 들어 뼈대의 로컬 위치가 50,100이고 배율이 2인 경우 로드 시간이 100,200으로 변경됩니다. 이 기능은 런타임에 픽셀 단위 배율을 사용하지 않을 때 유용할 수 있습니다. 이 기능은 실행 시 픽셀 단위 배율을 사용하지 않을 때 유용할 수 있습니다. 예를 들어 Box2D는 미터를 선호하므로 0.01의 배율을 사용하여 픽셀을 미터로 변환할 수 있습니다.

또한 루트 뼈대를 스케일링하여 단위에 영향을 주지 않고 스켈레톤의 크기를 조정할 수 있습니다.

SkeletonJson json = new SkeletonJson(attachmentLoader);
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");
BoneData root = skeletonData.findBone("root");
root.scaleX = 2;
root.scaleY = 2;

이 경우 뼈대가 50,100의 로컬 위치에 있으면 그 위치에 남아있게 됩니다. 하지만 뼈대의 월드 변형을 계산할 때 위치의 크기가 조정됩니다. 이렇게 하면 스켈레톤에 상속 스케일이 사용되지 않는 뼈대가 있는 경우 원하는 대로 작동하지 않을 수 있습니다.

다음: 애니메이션 적용 이전: 런타임 아키텍처