Browse Source

[ue4] Fixed segfault in SpineSkeletonDataAsset. Added PreviewAnimation and PreviewSkin to SpineSkeletonAnimationComponent. Enter the name of an animation or skin and it will be previewed live in the editor view. Use an empty string to reset the animation or skin.

badlogic 6 years ago
parent
commit
cef191f6c6

+ 11 - 0
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp

@@ -96,6 +96,17 @@ void USpineSkeletonAnimationComponent::InternalTick(float DeltaTime, bool CallDe
 	CheckState();
 
 	if (state && bAutoPlaying) {
+		if (lastPreviewAnimation != PreviewAnimation) {
+			if (PreviewAnimation != "") SetAnimation(0, TCHAR_TO_UTF8(*PreviewAnimation), true);
+			else SetEmptyAnimation(0, 0);
+			lastPreviewAnimation = PreviewAnimation;
+		}
+
+		if (lastPreviewSkin != PreviewSkin) {
+			if (PreviewSkin != "") SetSkin(TCHAR_TO_UTF8(*PreviewSkin));
+			else SetSkin("default");
+			lastPreviewSkin = PreviewSkin;
+		}
 		state->update(DeltaTime);
 		state->apply(*skeleton);
 		if (CallDelegates) BeforeUpdateWorldTransform.Broadcast(this);

+ 1 - 0
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp

@@ -128,6 +128,7 @@ public:
 void USpineSkeletonDataAsset::LoadInfo() {
 #if WITH_EDITORONLY_DATA
 	int dataLen = rawData.Num();
+	if (dataLen == 0) return;
 	NullAttachmentLoader loader;
 	SkeletonData* skeletonData = nullptr;
 	if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) {

+ 9 - 0
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h

@@ -259,6 +259,12 @@ public:
 
 	UPROPERTY(BlueprintAssignable, Category="Components|Spine|Animation")
 	FSpineAnimationDisposeDelegate AnimationDispose;
+
+	UPROPERTY(Transient, EditAnywhere)
+	FString PreviewAnimation;
+
+	UPROPERTY(Transient, EditAnywhere)
+	FString PreviewSkin;
 	
 	// used in C event callback. Needs to be public as we can't call
 	// protected methods from plain old C function.
@@ -279,4 +285,7 @@ private:
 	/* If the animation should update automatically. */
 	UPROPERTY()
 	bool bAutoPlaying;
+
+	FString lastPreviewAnimation;
+	FString lastPreviewSkin;
 };