[unity] Added updateSeparatorPartScale property to SkeletonGraphic to let render separator parts follow scale.

This commit is contained in:
Harald Csaszar 2023-06-14 15:56:32 +02:00
parent cbe0e5433a
commit ad614dc5ab
3 changed files with 19 additions and 3 deletions

View File

@ -103,6 +103,7 @@
* Timeline extension package: An additional Spine preferences parameter `Timeline` - `Default Mix Duration` has been added, setting newly added `SpineAnimationStateClip` clips accordingly, defaults to false. This Spine preferences parameter can be enabled to default to the previous behaviour before this update. * Timeline extension package: An additional Spine preferences parameter `Timeline` - `Default Mix Duration` has been added, setting newly added `SpineAnimationStateClip` clips accordingly, defaults to false. This Spine preferences parameter can be enabled to default to the previous behaviour before this update.
* Tint Black: Added support for [Tint Black](http://en.esotericsoftware.com/spine-slots#Tint-black) functionality at all Spine URP shaders (2D and 3D shaders) and at all standard pipeline `Spine/Sprite` shaders. This feature can be enabled via the `Tint Black` material parameter in the Inspector. Note: The URP Sprite shaders provided in the Spine URP Shaders extension UPM package require the latest version of the spine-unity runtime (package version 4.1.12, 2023-05-31 or newer) to display the added material parameters in the Inspector GUI. * Tint Black: Added support for [Tint Black](http://en.esotericsoftware.com/spine-slots#Tint-black) functionality at all Spine URP shaders (2D and 3D shaders) and at all standard pipeline `Spine/Sprite` shaders. This feature can be enabled via the `Tint Black` material parameter in the Inspector. Note: The URP Sprite shaders provided in the Spine URP Shaders extension UPM package require the latest version of the spine-unity runtime (package version 4.1.12, 2023-05-31 or newer) to display the added material parameters in the Inspector GUI.
* Added `SkeletonGraphic.MeshScale` property to allow access to calculated mesh scale. `MeshScale` is based on (1) Canvas pixels per unit, and (2) `RectTransform` bounds when using `Layout Scale Mode` other than `None` at `SkeletonGraphic` which scales the skeleton mesh to fit the parent `RectTransform` bounds accordingly. * Added `SkeletonGraphic.MeshScale` property to allow access to calculated mesh scale. `MeshScale` is based on (1) Canvas pixels per unit, and (2) `RectTransform` bounds when using `Layout Scale Mode` other than `None` at `SkeletonGraphic` which scales the skeleton mesh to fit the parent `RectTransform` bounds accordingly.
* Added `updateSeparatorPartScale` property to `SkeletonGraphic` to let render separator parts follow the scale (lossy scale) of the `SkeletonGraphic` GameObject. Defaults to `false` to maintain existing behaviour.
* **Breaking changes** * **Breaking changes**
* Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead. * Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead.

View File

@ -64,7 +64,8 @@ namespace Spine.Unity.Editor {
updateTiming, updateWhenInvisible, unscaledTime, tintBlack, layoutScaleMode, editReferenceRect; updateTiming, updateWhenInvisible, unscaledTime, tintBlack, layoutScaleMode, editReferenceRect;
SerializedProperty initialFlipX, initialFlipY; SerializedProperty initialFlipX, initialFlipY;
SerializedProperty meshGeneratorSettings; SerializedProperty meshGeneratorSettings;
SerializedProperty allowMultipleCanvasRenderers, separatorSlotNames, enableSeparatorSlots, updateSeparatorPartLocation; SerializedProperty allowMultipleCanvasRenderers, separatorSlotNames, enableSeparatorSlots,
updateSeparatorPartLocation, updateSeparatorPartScale;
SerializedProperty raycastTarget, maskable; SerializedProperty raycastTarget, maskable;
readonly GUIContent UnscaledTimeLabel = new GUIContent("Unscaled Time", readonly GUIContent UnscaledTimeLabel = new GUIContent("Unscaled Time",
@ -141,6 +142,7 @@ namespace Spine.Unity.Editor {
allowMultipleCanvasRenderers = so.FindProperty("allowMultipleCanvasRenderers"); allowMultipleCanvasRenderers = so.FindProperty("allowMultipleCanvasRenderers");
updateSeparatorPartLocation = so.FindProperty("updateSeparatorPartLocation"); updateSeparatorPartLocation = so.FindProperty("updateSeparatorPartLocation");
updateSeparatorPartScale = so.FindProperty("updateSeparatorPartScale");
enableSeparatorSlots = so.FindProperty("enableSeparatorSlots"); enableSeparatorSlots = so.FindProperty("enableSeparatorSlots");
separatorSlotNames = so.FindProperty("separatorSlotNames"); separatorSlotNames = so.FindProperty("separatorSlotNames");
@ -304,7 +306,7 @@ namespace Spine.Unity.Editor {
} }
EditorGUILayout.Space(); EditorGUILayout.Space();
SeparatorsField(separatorSlotNames, enableSeparatorSlots, updateSeparatorPartLocation); SeparatorsField(separatorSlotNames, enableSeparatorSlots, updateSeparatorPartLocation, updateSeparatorPartScale);
} }
} }
@ -428,7 +430,7 @@ namespace Spine.Unity.Editor {
} }
public static void SeparatorsField (SerializedProperty separatorSlotNames, SerializedProperty enableSeparatorSlots, public static void SeparatorsField (SerializedProperty separatorSlotNames, SerializedProperty enableSeparatorSlots,
SerializedProperty updateSeparatorPartLocation) { SerializedProperty updateSeparatorPartLocation, SerializedProperty updateSeparatorPartScale) {
bool multi = separatorSlotNames.serializedObject.isEditingMultipleObjects; bool multi = separatorSlotNames.serializedObject.isEditingMultipleObjects;
bool hasTerminalSlot = false; bool hasTerminalSlot = false;
@ -466,6 +468,7 @@ namespace Spine.Unity.Editor {
EditorGUILayout.PropertyField(enableSeparatorSlots, SpineInspectorUtility.TempContent("Enable Separation", tooltip: "Whether to enable separation at the above separator slots.")); EditorGUILayout.PropertyField(enableSeparatorSlots, SpineInspectorUtility.TempContent("Enable Separation", tooltip: "Whether to enable separation at the above separator slots."));
EditorGUILayout.PropertyField(updateSeparatorPartLocation, SpineInspectorUtility.TempContent("Update Part Location", tooltip: "Update separator part GameObject location to match the position of the SkeletonGraphic. This can be helpful when re-parenting parts to a different GameObject.")); EditorGUILayout.PropertyField(updateSeparatorPartLocation, SpineInspectorUtility.TempContent("Update Part Location", tooltip: "Update separator part GameObject location to match the position of the SkeletonGraphic. This can be helpful when re-parenting parts to a different GameObject."));
EditorGUILayout.PropertyField(updateSeparatorPartScale, SpineInspectorUtility.TempContent("Update Part Scale", tooltip: "Update separator part GameObject scale to match the scale (lossyScale) of the SkeletonGraphic. This can be helpful when re-parenting parts to a different GameObject."));
} }
} }

View File

@ -116,6 +116,7 @@ namespace Spine.Unity {
[SerializeField] protected List<Transform> separatorParts = new List<Transform>(); [SerializeField] protected List<Transform> separatorParts = new List<Transform>();
public List<Transform> SeparatorParts { get { return separatorParts; } } public List<Transform> SeparatorParts { get { return separatorParts; } }
public bool updateSeparatorPartLocation = true; public bool updateSeparatorPartLocation = true;
public bool updateSeparatorPartScale = false;
private bool wasUpdatedAfterInit = true; private bool wasUpdatedAfterInit = true;
private bool requiresInstructionUpate = true; private bool requiresInstructionUpate = true;
@ -952,6 +953,17 @@ namespace Spine.Unity {
separatorParts[p].rotation = this.transform.rotation; separatorParts[p].rotation = this.transform.rotation;
} }
} }
if (updateSeparatorPartScale) {
Vector3 targetScale = this.transform.lossyScale;
for (int p = 0; p < this.separatorParts.Count; ++p) {
Transform partParent = separatorParts[p].transform.parent;
Vector3 parentScale = partParent == null ? Vector3.one : partParent.lossyScale;
separatorParts[p].localScale = new Vector3(
parentScale.x == 0f ? 1f : targetScale.x / parentScale.x,
parentScale.y == 0f ? 1f : targetScale.y / parentScale.y,
parentScale.z == 0f ? 1f : targetScale.z / parentScale.z);
}
}
for (int i = 0; i < submeshCount; i++) { for (int i = 0; i < submeshCount; i++) {
CanvasRenderer canvasRenderer = canvasRenderers[i]; CanvasRenderer canvasRenderer = canvasRenderers[i];