추가 정보에 감사드립니다. spine-unity 4.0 런타임 버전이 사용 가능한 최신 버전은 아니지만(일반적으로 여기에서 찾을 수 있음) 업데이트하면 자산 로딩 시간과 관련하여 아무 것도 변경하지 마십시오.
스킨 텍스처 자산이 많은 경우 즉시 로드 시간을 줄이려면 텍스처를 정상적으로 로드하지 않고 대신 Unity Addressables, Asset Bundles 등과 같은 지연 로드 메커니즘을 사용하는 것이 가장 좋은 방법입니다. 여기에서 이 기능을 공식적으로 제공할 수 있는 문제 티켓이 있습니다. 불행히도 아직 구현하지 못했습니다(주로 지원되는 모든 Unity 버전 및 다양한 유형의 지연 로딩 메커니즘과 호환됨).
그럼에도 불구하고 지연된 로드를 처리하기 위해 고유한 스크립트 구성 요소를 구현할 수 있습니다. 기본적으로 SkeletonDataAsset
에서 Texture
로의 자산 간접 참조를 제거해야 합니다. 사용된 각 Material
에서 할당된 Texture
를 작은 자리 표시자 Texture
(예: 흰색 1x1 텍스처)로 설정합니다. 그런 다음 이 재질을 사용하는 각각의 스킨 또는 부착물을 지정하려면 적절한 Texture
자산(예: Adressables를 통해)을 로드하고 자리 표시자 텍스처 대신 Material
에 지정해야 합니다. 예를 들어 빌드 전 단계에서 동일한 작은 placeholder.png
텍스처를 자동으로 할당(그리고 빌드 후 단계에서 적절한 텍스처를 다시 할당)하고 Material
에서 실제 로드할 텍스처. 그런 다음 placeholder.png
텍스처가 사용될 때마다 이를 감지하고 각각의 실제 텍스처를 로드합니다(그리고 이에 따라 스켈레톤을 업데이트합니다).
이 포럼 게시물의 다음 설명도 도움이 될 수 있습니다.
https://esotericsoftware.com/forum/d/15867-memory-management-of-character-with-many-outfits/12
게시물의 관련 부분에 대한 기계 번역은 아래에서 찾을 수 있습니다.
불행하게도 완전 자동 솔루션은 몇 줄로 빠른 구현을 설명할 만큼 사소하지 않습니다. 이 기능을 직접 구현하기로 결정하고 공식 구현을 기다리지 않는 경우 스킨 설정 및 로드에 대해 하나의 간접 레이어(예: 새로운 SkinLoader
구성 요소 클래스)를 추가하는 것이 좋습니다. 그런 다음 준비 단계로 모든 SkeletonDataAsset 참조 캐스케이드에서 기본 스킨의 자산을 제외한 모든 자산을 제거합니다. 그런 다음 skinLoader.SetSkin(targetSkeletonAnimation, "skinname")
에서 스킨을 설정하여 먼저 로드되었는지 확인하고 요청 시 로드하고 모든 참조를 연결한 다음 targetSkeletonAnimation.Skeleton.SetSkin(skinname)
을 호출합니다. 이렇게 하면 spine-unity 코드를 수정하지 않고도 수행할 수 있습니다.
Thanks for the additional info. While your spine-unity 4.0 runtime version is not the latest available (which can be found here as usual), updating it will likely not change anything in regards to asset loading time.
If you want to decrease immediate loading time with many skin texture assets, the best way is to not load the textures normally but instead use a delayed loading mechanism such as Unity Addressables, Asset Bundles, or the like. We have an issue ticket here to officially provide this feature, unfortunately we didn't get to implement it yet (mainy since it needs to be compatible with all supported Unity versions and the different types of delayed loading mechanisms).
Nevertheless you could implement your own script component to handle delayed loading. Basically you need to remove any asset indirect references from the SkeletonDataAsset
to the Texture
, e.g. by setting the assigned Texture
at each used Material
to a small placeholder Texture
(e.g. a white 1x1 texture). Then when you want to assign the respective skins or attachments that use this material, you would then need to load the proper Texture
asset (via e.g. Adressables) and assign it at the Material
instead of the placeholder texture. You could e.g. implement it as automatically assigning the same small placeholder.png
texture in a pre-build step (and assign the proper texture again in a post-build step) and populating a map (or list) mapping from Material
to the real to-be-loaded texture. Then whenever the placeholder.png
texture is used, you would detect this and load the respective real texture (and update the skeleton accordingly).
The following description in this forum posting might also help:
https://esotericsoftware.com/forum/d/15867-memory-management-of-character-with-many-outfits/12
Machine translation of the relevant part of the post can be found below:
Unfortunately a fully automatic solution is not trivial enough to just describe a quick implementation in a few lines. If you decide to implement this feature yourself and not wait for the official implementation, I would recommend adding one layer of indirection (e.g. a new SkinLoader
component class) around setting and loading any skin. As a preparation you would then remove all but the default skin's assets from any SkeletonDataAsset reference cascades. Then you would set your skin at skinLoader.SetSkin(targetSkeletonAnimation, "skinname")
which first checks if it's loaded, loads it on demand and hooks up any references, and then calls targetSkeletonAnimation.Skeleton.SetSkin(skinname)
. This way it should be doable without having to modify the spine-unity code.