diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp index 0dcb30af9..66b951bdf 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp @@ -41,6 +41,28 @@ USpineSkeletonComponent::USpineSkeletonComponent () { bAutoActivate = true; } +bool USpineSkeletonComponent::SetSkins(UPARAM(ref) TArray& SkinNames) { + CheckState(); + if (skeleton) { + spine::Skin* newSkin = new spine::Skin("__spine-ue3_custom_skin"); + for (auto& skinName : SkinNames) { + spine::Skin* skin = skeleton->getData()->findSkin(TCHAR_TO_UTF8(*skinName)); + if (!skin) { + delete newSkin; + return false; + } + newSkin->addSkin(skin); + } + skeleton->setSkin(newSkin); + if (customSkin != nullptr) { + delete customSkin; + } + customSkin = newSkin; + return true; + } + else return false; +} + bool USpineSkeletonComponent::SetSkin (const FString skinName) { CheckState(); if (skeleton) { diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp index 64357a7db..054064ca3 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp @@ -185,6 +185,11 @@ void USpineWidget::DisposeState() { skeleton = nullptr; } + if (customSkin) { + delete customSkin; + customSkin = nullptr; + } + trackEntries.Empty(); } @@ -204,6 +209,28 @@ bool USpineWidget::SetSkin(const FString skinName) { else return false; } +bool USpineWidget::SetSkins(UPARAM(ref) TArray& SkinNames) { + CheckState(); + if (skeleton) { + spine::Skin* newSkin = new spine::Skin("__spine-ue3_custom_skin"); + for (auto& skinName : SkinNames) { + spine::Skin* skin = skeleton->getData()->findSkin(TCHAR_TO_UTF8(*skinName)); + if (!skin) { + delete newSkin; + return false; + } + newSkin->addSkin(skin); + } + skeleton->setSkin(newSkin); + if (customSkin != nullptr) { + delete customSkin; + } + customSkin = newSkin; + return true; + } + else return false; +} + void USpineWidget::GetSkins(TArray &Skins) { CheckState(); if (skeleton) { diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h index b77858513..c37444d61 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h @@ -55,6 +55,9 @@ public: UFUNCTION(BlueprintPure, Category = "Components|Spine|Skeleton") void GetSkins(TArray &Skins); + + UFUNCTION(BlueprintCallable, Category = "Components|Spine|Skeleton") + bool SetSkins(UPARAM(ref) TArray& SkinNames); UFUNCTION(BlueprintCallable, Category = "Components|Spine|Skeleton") bool SetSkin (const FString SkinName); @@ -138,5 +141,6 @@ protected: spine::Skeleton* skeleton; USpineAtlasAsset* lastAtlas = nullptr; spine::Atlas* lastSpineAtlas = nullptr; - USpineSkeletonDataAsset* lastData = nullptr; + USpineSkeletonDataAsset* lastData = nullptr; + spine::Skin* customSkin = nullptr; }; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineWidget.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineWidget.h index de4f0fa7d..84f8884ad 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineWidget.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineWidget.h @@ -89,6 +89,9 @@ public: UFUNCTION(BlueprintCallable, Category = "Components|Spine|Skeleton") bool SetSkin(const FString SkinName); + UFUNCTION(BlueprintCallable, Category = "Components|Spine|Skeleton") + bool SetSkins(UPARAM(ref) TArray &SkinNames); + UFUNCTION(BlueprintCallable, Category = "Components|Spine|Skeleton") bool HasSkin(const FString SkinName); @@ -222,6 +225,7 @@ protected: USpineAtlasAsset* lastAtlas = nullptr; spine::Atlas* lastSpineAtlas = nullptr; USpineSkeletonDataAsset* lastData = nullptr; + spine::Skin* customSkin = nullptr; // Need to hold on to the dynamic instances, or the GC will kill us while updating them UPROPERTY()