[unity] Fixed unnecessary high number of prefab reverts. Closes #2953. See #1273.

This commit is contained in:
Harald Csaszar 2025-10-17 17:08:12 +02:00
parent 74c2e9cab4
commit 59c90592c3
2 changed files with 46 additions and 10 deletions

View File

@ -43,6 +43,10 @@
#define CONFIGURABLE_ENTER_PLAY_MODE #define CONFIGURABLE_ENTER_PLAY_MODE
#endif #endif
#if UNITY_2020_1_OR_NEWER
#define REVERT_HAS_OVERLOADS
#endif
#define USE_THREADED_SKELETON_UPDATE #define USE_THREADED_SKELETON_UPDATE
#if !SPINE_AUTO_UPGRADE_COMPONENTS_OFF #if !SPINE_AUTO_UPGRADE_COMPONENTS_OFF
@ -731,6 +735,11 @@ namespace Spine.Unity {
requiresEditorUpdate = true; requiresEditorUpdate = true;
} }
// revert each prefab override only once each editor-frame.
private static int lastPrefabRevertFrame = -1;
private static HashSet<MeshFilter> revertedPrefabMeshes = new HashSet<MeshFilter>();
private static bool preventReentrance = false;
public void EditorUpdateMeshFilterHideFlags () { public void EditorUpdateMeshFilterHideFlags () {
if (!meshFilter) { if (!meshFilter) {
meshFilter = GetComponent<MeshFilter>(); meshFilter = GetComponent<MeshFilter>();
@ -746,18 +755,45 @@ namespace Spine.Unity {
if (dontSaveInEditor) { if (dontSaveInEditor) {
#if NEW_PREFAB_SYSTEM #if NEW_PREFAB_SYSTEM
if (UnityEditor.PrefabUtility.IsPartOfAnyPrefab(meshFilter)) { int currentFrame = Time.frameCount;
GameObject instanceRoot = UnityEditor.PrefabUtility.GetOutermostPrefabInstanceRoot(meshFilter); if (lastPrefabRevertFrame != currentFrame) {
if (instanceRoot != null) { lastPrefabRevertFrame = currentFrame;
List<ObjectOverride> objectOverrides = UnityEditor.PrefabUtility.GetObjectOverrides(instanceRoot); revertedPrefabMeshes.Clear();
foreach (ObjectOverride objectOverride in objectOverrides) { }
if (objectOverride.instanceObject == meshFilter) {
if (!preventReentrance && UnityEditor.PrefabUtility.IsPartOfAnyPrefab(meshFilter)) {
if (!revertedPrefabMeshes.Contains(meshFilter)) {
GameObject instanceRoot = UnityEditor.PrefabUtility.GetOutermostPrefabInstanceRoot(meshFilter);
if (instanceRoot != null) {
UnityEditor.PropertyModification[] mods = UnityEditor.PrefabUtility.GetPropertyModifications(instanceRoot);
bool hasMeshOverride = false;
if (mods != null) {
foreach (var mod in mods) {
if (mod.target == meshFilter && mod.propertyPath == "m_Mesh") {
hasMeshOverride = true;
break;
}
}
}
if (hasMeshOverride) {
preventReentrance = true;
try {
List<ObjectOverride> objectOverrides = UnityEditor.PrefabUtility.GetObjectOverrides(instanceRoot);
foreach (ObjectOverride objectOverride in objectOverrides) {
if (objectOverride.instanceObject == meshFilter) {
#if REVERT_HAS_OVERLOADS #if REVERT_HAS_OVERLOADS
objectOverride.Revert(UnityEditor.InteractionMode.AutomatedAction); objectOverride.Revert(UnityEditor.InteractionMode.AutomatedAction);
#else #else
objectOverride.Revert(); objectOverride.Revert();
#endif #endif
break; revertedPrefabMeshes.Add(meshFilter);
break;
}
}
}
finally {
preventReentrance = false;
}
} }
} }
} }

View File

@ -2,7 +2,7 @@
"name": "com.esotericsoftware.spine.spine-unity", "name": "com.esotericsoftware.spine.spine-unity",
"displayName": "spine-unity Runtime", "displayName": "spine-unity Runtime",
"description": "This plugin provides the spine-unity runtime core and examples. Spine Examples can be installed via the Samples tab.", "description": "This plugin provides the spine-unity runtime core and examples. Spine Examples can be installed via the Samples tab.",
"version": "4.3.22", "version": "4.3.23",
"unity": "2018.3", "unity": "2018.3",
"author": { "author": {
"name": "Esoteric Software", "name": "Esoteric Software",