From 98706929d0037eb5c3edc2d46b9430a00e4f4d32 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 29 Apr 2024 16:48:33 +0200 Subject: [PATCH 1/4] [unity] `SkeletonRenderTexture` example components now provide a `shaderPasses` parameter. --- CHANGELOG.md | 1 + .../SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs | 6 ++++-- .../SkeletonRenderTexture/SkeletonRenderTexture.cs | 8 +++++--- .../SkeletonRenderTexture/SkeletonRenderTextureBase.cs | 4 ++++ spine-unity/Assets/Spine Examples/package.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9aee30bc1..0bbe87aaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -154,6 +154,7 @@ - SkeletonGraphic: Added pre-defined SkeletonGraphic material sets for main workflow parameters in folders `spine-unity/Materials` instead of requiring manual copies: `SkeletonGraphic-PMATexture` containing materials for premultiplied-alpha texture workflow (`Straight Alpha Texture` disabled) and `SkeletonGraphic-StaightAlphaTexture` containing materials for straight alpha texture workflow (`Straight Alpha Texture` enabled). These directories contain a set of materials with `CanvasGroup Compatible` disabled for usage with `Advanced - PMA Vertex Color` enabled at the component. Each directory also provides a subdirectory `CanvasGroupCompatible` with materials with `CanvasGroup Compatible` enabled for usage with `CanvasGroup` alpha (requiring `Advanced - PMA Vertex Color` disabled at the component). - SkeletonGraphic: Added auto-detect functionality for parameters `Advanced` - `Tint Black`, `CanvasGroup Compatible` and `PMA Vertex Color`. If unsure which settings are correct, hit the `Detect` button next to each parameter, in top to bottom order, or the `Detect Settings` to detect all three. Also added automatic material assignment via a `Detect Material` button in the `Advanced` section and a `Detect` button next to the `Material` property at the top of the component Inspector, as well as next to the `Blend Mode Materials` section when using multiple canvas renderers with blend modes. The suitable material is selected based on these three settings, combined with texture settings (PMA or straight alpha texture settings). If you receive incorrect results, likely your texture settings are incorrectly setup for your PMA or Straight alpha texture export settings. + - `SkeletonRenderTexture` example components now provide a `shaderPasses` parameter to customize which passes are rendered to the `RenderTexture`. It defaults to `-1` for all passes to keep the existing behaviour. You might want to set it to `0` to only render the first pass e.g. to avoid issues when using a URP shader at the original skeleton. - **Breaking changes** diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs index 590f4f1fc..1116bfefd 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs @@ -195,7 +195,8 @@ namespace Spine.Unity.Examples { protected void RenderSingleMeshToRenderTexture (Mesh mesh, Material graphicMaterial, Texture texture) { Material meshRendererMaterial = MeshRendererMaterialForTexture(texture); - commandBuffer.DrawMesh(mesh, transform.localToWorldMatrix, meshRendererMaterial, 0, -1); + foreach (int shaderPass in shaderPasses) + commandBuffer.DrawMesh(mesh, transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass); Graphics.ExecuteCommandBuffer(commandBuffer); } @@ -204,7 +205,8 @@ namespace Spine.Unity.Examples { for (int i = 0; i < meshCount; ++i) { Material meshRendererMaterial = MeshRendererMaterialForTexture(textures[i]); - commandBuffer.DrawMesh(meshes[i], transform.localToWorldMatrix, meshRendererMaterial, 0, -1); + foreach (int shaderPass in shaderPasses) + commandBuffer.DrawMesh(meshes[i], transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass); } Graphics.ExecuteCommandBuffer(commandBuffer); } diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs index 413d8914d..41417a2c3 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs @@ -186,9 +186,11 @@ namespace Spine.Unity.Examples { meshRenderer.GetPropertyBlock(propertyBlock); meshRenderer.GetSharedMaterials(materials); - for (int i = 0; i < materials.Count; i++) - commandBuffer.DrawMesh(meshFilter.sharedMesh, transform.localToWorldMatrix, - materials[i], meshRenderer.subMeshStartIndex + i, -1, propertyBlock); + for (int i = 0; i < materials.Count; i++) { + foreach (int shaderPass in shaderPasses) + commandBuffer.DrawMesh(meshFilter.sharedMesh, transform.localToWorldMatrix, + materials[i], meshRenderer.subMeshStartIndex + i, shaderPass, propertyBlock); + } Graphics.ExecuteCommandBuffer(commandBuffer); } diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs index 2a6a59df4..99784806a 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs @@ -45,6 +45,10 @@ namespace Spine.Unity.Examples { protected Mesh quadMesh; public RenderTexture renderTexture; public Camera targetCamera; + [Tooltip("Shader passes to render to the RenderTexture. E.g. set the first element " + + "to -1 to render all shader passes, or set it to 0 to only render the first " + + "shader pass, which may be required when using URP.")] + public int[] shaderPasses = new int[1] { -1 }; protected CommandBuffer commandBuffer; protected Vector2Int screenSize; diff --git a/spine-unity/Assets/Spine Examples/package.json b/spine-unity/Assets/Spine Examples/package.json index 61b9c2101..4a6897095 100644 --- a/spine-unity/Assets/Spine Examples/package.json +++ b/spine-unity/Assets/Spine Examples/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity-examples", "displayName": "spine-unity Runtime Examples", "description": "This plugin provides example scenes and scripts for the spine-unity runtime.", - "version": "4.2.27", + "version": "4.2.28", "unity": "2018.3", "author": { "name": "Esoteric Software", From c65f73e873643fb23f0ddb557051e2ef1447ddc3 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 29 Apr 2024 17:32:52 +0200 Subject: [PATCH 2/4] [spine-csharp] Fixed Skeleton.PhysicsRotate passing r instead of x. Closes #2512. --- spine-csharp/src/Skeleton.cs | 2 +- spine-csharp/src/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spine-csharp/src/Skeleton.cs b/spine-csharp/src/Skeleton.cs index df6b52296..774e2472b 100644 --- a/spine-csharp/src/Skeleton.cs +++ b/spine-csharp/src/Skeleton.cs @@ -489,7 +489,7 @@ namespace Spine { public void PhysicsRotate (float x, float y, float degrees) { PhysicsConstraint[] physicsConstraints = this.physicsConstraints.Items; for (int i = 0, n = this.physicsConstraints.Count; i < n; i++) - physicsConstraints[i].Rotate(r, y, degrees); + physicsConstraints[i].Rotate(x, y, degrees); } /// Increments the skeleton's . diff --git a/spine-csharp/src/package.json b/spine-csharp/src/package.json index 78cdf16e5..c24efb7bb 100644 --- a/spine-csharp/src/package.json +++ b/spine-csharp/src/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-csharp", "displayName": "spine-csharp Runtime", "description": "This plugin provides the spine-csharp core runtime.", - "version": "4.2.19", + "version": "4.2.20", "unity": "2018.3", "author": { "name": "Esoteric Software", From cb4873702d72dd51c582d9f3fce3a43b99a8d4af Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Mon, 29 Apr 2024 12:23:22 -0400 Subject: [PATCH 3/4] Fixed constraint copy constructors references the wrong bones. ref #2511 --- .../esotericsoftware/spine/IkConstraint.java | 19 ++++++++--------- .../spine/PathConstraint.java | 9 ++++---- .../spine/PhysicsConstraint.java | 10 ++++----- .../com/esotericsoftware/spine/Skeleton.java | 8 +++---- .../spine/TransformConstraint.java | 21 +++++++++---------- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java index 8e0d7408d..67f833c96 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java @@ -54,25 +54,24 @@ public class IkConstraint implements Updatable { if (data == null) throw new IllegalArgumentException("data cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); this.data = data; - mix = data.mix; - softness = data.softness; - bendDirection = data.bendDirection; - compress = data.compress; - stretch = data.stretch; bones = new Array(data.bones.size); for (BoneData boneData : data.bones) bones.add(skeleton.bones.get(boneData.index)); target = skeleton.bones.get(data.target.index); + + mix = data.mix; + softness = data.softness; + bendDirection = data.bendDirection; + compress = data.compress; + stretch = data.stretch; } /** Copy constructor. */ - public IkConstraint (IkConstraint constraint) { - if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - data = constraint.data; - bones = new Array(constraint.bones); - target = constraint.target; + public IkConstraint (IkConstraint constraint, Skeleton skeleton) { + this(constraint.data, skeleton); + mix = constraint.mix; softness = constraint.softness; bendDirection = constraint.bendDirection; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java index f395d7e64..d74cd2338 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java @@ -72,6 +72,7 @@ public class PathConstraint implements Updatable { bones.add(skeleton.bones.get(boneData.index)); target = skeleton.slots.get(data.target.index); + position = data.position; spacing = data.spacing; mixRotate = data.mixRotate; @@ -80,11 +81,9 @@ public class PathConstraint implements Updatable { } /** Copy constructor. */ - public PathConstraint (PathConstraint constraint) { - if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - data = constraint.data; - bones = new Array(constraint.bones); - target = constraint.target; + public PathConstraint (PathConstraint constraint, Skeleton skeleton) { + this(constraint.data, skeleton); + position = constraint.position; spacing = constraint.spacing; mixRotate = constraint.mixRotate; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java index eea2b70e0..dcb28f684 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java @@ -58,7 +58,9 @@ public class PhysicsConstraint implements Updatable { if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); this.data = data; this.skeleton = skeleton; + bone = skeleton.bones.get(data.bone.index); + inertia = data.inertia; strength = data.strength; damping = data.damping; @@ -69,11 +71,9 @@ public class PhysicsConstraint implements Updatable { } /** Copy constructor. */ - public PhysicsConstraint (PhysicsConstraint constraint) { - if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - data = constraint.data; - skeleton = constraint.skeleton; - bone = constraint.bone; + public PhysicsConstraint (PhysicsConstraint constraint, Skeleton skeleton) { + this(constraint.data, skeleton); + inertia = constraint.inertia; strength = constraint.strength; damping = constraint.damping; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java index 8822ccaff..fca5f239f 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java @@ -139,19 +139,19 @@ public class Skeleton { ikConstraints = new Array(skeleton.ikConstraints.size); for (IkConstraint ikConstraint : skeleton.ikConstraints) - ikConstraints.add(new IkConstraint(ikConstraint)); + ikConstraints.add(new IkConstraint(ikConstraint, skeleton)); transformConstraints = new Array(skeleton.transformConstraints.size); for (TransformConstraint transformConstraint : skeleton.transformConstraints) - transformConstraints.add(new TransformConstraint(transformConstraint)); + transformConstraints.add(new TransformConstraint(transformConstraint, skeleton)); pathConstraints = new Array(skeleton.pathConstraints.size); for (PathConstraint pathConstraint : skeleton.pathConstraints) - pathConstraints.add(new PathConstraint(pathConstraint)); + pathConstraints.add(new PathConstraint(pathConstraint, skeleton)); physicsConstraints = new Array(skeleton.physicsConstraints.size); for (PhysicsConstraint physicsConstraint : skeleton.physicsConstraints) - physicsConstraints.add(new PhysicsConstraint(physicsConstraint)); + physicsConstraints.add(new PhysicsConstraint(physicsConstraint, skeleton)); skin = skeleton.skin; color = new Color(skeleton.color); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java index 176c77a1b..05d82dce8 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java @@ -53,26 +53,25 @@ public class TransformConstraint implements Updatable { if (data == null) throw new IllegalArgumentException("data cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); this.data = data; - mixRotate = data.mixRotate; - mixX = data.mixX; - mixY = data.mixY; - mixScaleX = data.mixScaleX; - mixScaleY = data.mixScaleY; - mixShearY = data.mixShearY; bones = new Array(data.bones.size); for (BoneData boneData : data.bones) bones.add(skeleton.bones.get(boneData.index)); target = skeleton.bones.get(data.target.index); + + mixRotate = data.mixRotate; + mixX = data.mixX; + mixY = data.mixY; + mixScaleX = data.mixScaleX; + mixScaleY = data.mixScaleY; + mixShearY = data.mixShearY; } /** Copy constructor. */ - public TransformConstraint (TransformConstraint constraint) { - if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - data = constraint.data; - bones = new Array(constraint.bones); - target = constraint.target; + public TransformConstraint (TransformConstraint constraint, Skeleton skeleton) { + this(constraint.data, skeleton); + mixRotate = constraint.mixRotate; mixX = constraint.mixX; mixY = constraint.mixY; From 6118a5f704d446f7e2352ed6db71f26b269e44c7 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 29 Apr 2024 19:09:45 +0200 Subject: [PATCH 4/4] [csharp] Port of commit cb48737: Fixed constraint copy constructors references the wrong bones. Closes #2511. --- spine-csharp/src/IkConstraint.cs | 20 +++++++++----------- spine-csharp/src/PathConstraint.cs | 10 ++++------ spine-csharp/src/PhysicsConstraint.cs | 10 +++++----- spine-csharp/src/Skeleton.cs | 8 ++++---- spine-csharp/src/TransformConstraint.cs | 22 ++++++++++------------ spine-csharp/src/package.json | 2 +- 6 files changed, 33 insertions(+), 39 deletions(-) diff --git a/spine-csharp/src/IkConstraint.cs b/spine-csharp/src/IkConstraint.cs index c71fb0fa4..bc92980da 100644 --- a/spine-csharp/src/IkConstraint.cs +++ b/spine-csharp/src/IkConstraint.cs @@ -52,26 +52,24 @@ namespace Spine { public IkConstraint (IkConstraintData data, Skeleton skeleton) { if (data == null) throw new ArgumentNullException("data", "data cannot be null."); this.data = data; - mix = data.mix; - softness = data.softness; - bendDirection = data.bendDirection; - compress = data.compress; - stretch = data.stretch; bones = new ExposedList(data.bones.Count); foreach (BoneData boneData in data.bones) bones.Add(skeleton.bones.Items[boneData.index]); target = skeleton.bones.Items[data.target.index]; + + mix = data.mix; + softness = data.softness; + bendDirection = data.bendDirection; + compress = data.compress; + stretch = data.stretch; } /// Copy constructor. - public IkConstraint (IkConstraint constraint) { - if (constraint == null) throw new ArgumentNullException("constraint", "constraint cannot be null."); - data = constraint.data; - bones = new ExposedList(constraint.Bones.Count); - bones.AddRange(constraint.Bones); - target = constraint.target; + public IkConstraint (IkConstraint constraint, Skeleton skeleton) + : this(constraint.data, skeleton) { + mix = constraint.mix; softness = constraint.softness; bendDirection = constraint.bendDirection; diff --git a/spine-csharp/src/PathConstraint.cs b/spine-csharp/src/PathConstraint.cs index 6a8c9b775..0a13c45c2 100644 --- a/spine-csharp/src/PathConstraint.cs +++ b/spine-csharp/src/PathConstraint.cs @@ -64,6 +64,7 @@ namespace Spine { bones.Add(skeleton.bones.Items[boneData.index]); target = skeleton.slots.Items[data.target.index]; + position = data.position; spacing = data.spacing; mixRotate = data.mixRotate; @@ -72,12 +73,9 @@ namespace Spine { } /// Copy constructor. - public PathConstraint (PathConstraint constraint) { - if (constraint == null) throw new ArgumentNullException("constraint cannot be null."); - data = constraint.data; - bones = new ExposedList(constraint.Bones.Count); - bones.AddRange(constraint.Bones); - target = constraint.target; + public PathConstraint (PathConstraint constraint, Skeleton skeleton) + : this(constraint.data, skeleton) { + position = constraint.position; spacing = constraint.spacing; mixRotate = constraint.mixRotate; diff --git a/spine-csharp/src/PhysicsConstraint.cs b/spine-csharp/src/PhysicsConstraint.cs index aede953ec..4221b0aec 100644 --- a/spine-csharp/src/PhysicsConstraint.cs +++ b/spine-csharp/src/PhysicsConstraint.cs @@ -60,7 +60,9 @@ namespace Spine { if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); this.data = data; this.skeleton = skeleton; + bone = skeleton.bones.Items[data.bone.index]; + inertia = data.inertia; strength = data.strength; damping = data.damping; @@ -71,11 +73,9 @@ namespace Spine { } /// Copy constructor. - public PhysicsConstraint (PhysicsConstraint constraint) { - if (constraint == null) throw new ArgumentNullException("constraint", "constraint cannot be null."); - data = constraint.data; - skeleton = constraint.skeleton; - bone = constraint.bone; + public PhysicsConstraint (PhysicsConstraint constraint, Skeleton skeleton) + : this(constraint.data, skeleton) { + inertia = constraint.inertia; strength = constraint.strength; damping = constraint.damping; diff --git a/spine-csharp/src/Skeleton.cs b/spine-csharp/src/Skeleton.cs index 774e2472b..522b27fc6 100644 --- a/spine-csharp/src/Skeleton.cs +++ b/spine-csharp/src/Skeleton.cs @@ -187,19 +187,19 @@ namespace Spine { ikConstraints = new ExposedList(skeleton.ikConstraints.Count); foreach (IkConstraint ikConstraint in skeleton.ikConstraints) - ikConstraints.Add(new IkConstraint(ikConstraint)); + ikConstraints.Add(new IkConstraint(ikConstraint, skeleton)); transformConstraints = new ExposedList(skeleton.transformConstraints.Count); foreach (TransformConstraint transformConstraint in skeleton.transformConstraints) - transformConstraints.Add(new TransformConstraint(transformConstraint)); + transformConstraints.Add(new TransformConstraint(transformConstraint, skeleton)); pathConstraints = new ExposedList(skeleton.pathConstraints.Count); foreach (PathConstraint pathConstraint in skeleton.pathConstraints) - pathConstraints.Add(new PathConstraint(pathConstraint)); + pathConstraints.Add(new PathConstraint(pathConstraint, skeleton)); physicsConstraints = new ExposedList(skeleton.physicsConstraints.Count); foreach (PhysicsConstraint physicsConstraint in skeleton.physicsConstraints) - physicsConstraints.Add(new PhysicsConstraint(physicsConstraint)); + physicsConstraints.Add(new PhysicsConstraint(physicsConstraint, skeleton)); skin = skeleton.skin; r = skeleton.r; diff --git a/spine-csharp/src/TransformConstraint.cs b/spine-csharp/src/TransformConstraint.cs index e234de305..2d50fc210 100644 --- a/spine-csharp/src/TransformConstraint.cs +++ b/spine-csharp/src/TransformConstraint.cs @@ -51,27 +51,25 @@ namespace Spine { if (data == null) throw new ArgumentNullException("data", "data cannot be null."); if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); this.data = data; - mixRotate = data.mixRotate; - mixX = data.mixX; - mixY = data.mixY; - mixScaleX = data.mixScaleX; - mixScaleY = data.mixScaleY; - mixShearY = data.mixShearY; bones = new ExposedList(); foreach (BoneData boneData in data.bones) bones.Add(skeleton.bones.Items[boneData.index]); target = skeleton.bones.Items[data.target.index]; + + mixRotate = data.mixRotate; + mixX = data.mixX; + mixY = data.mixY; + mixScaleX = data.mixScaleX; + mixScaleY = data.mixScaleY; + mixShearY = data.mixShearY; } /// Copy constructor. - public TransformConstraint (TransformConstraint constraint) { - if (constraint == null) throw new ArgumentNullException("constraint cannot be null."); - data = constraint.data; - bones = new ExposedList(constraint.Bones.Count); - bones.AddRange(constraint.Bones); - target = constraint.target; + public TransformConstraint (TransformConstraint constraint, Skeleton skeleton) + : this(constraint.data, skeleton) { + mixRotate = constraint.mixRotate; mixX = constraint.mixX; mixY = constraint.mixY; diff --git a/spine-csharp/src/package.json b/spine-csharp/src/package.json index c24efb7bb..e581b197d 100644 --- a/spine-csharp/src/package.json +++ b/spine-csharp/src/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-csharp", "displayName": "spine-csharp Runtime", "description": "This plugin provides the spine-csharp core runtime.", - "version": "4.2.20", + "version": "4.2.21", "unity": "2018.3", "author": { "name": "Esoteric Software",