From 45a7637a3645bf05bad49df9cd9638fbc26d3788871df521285e8c0a07df705f Mon Sep 17 00:00:00 2001 From: copecone Date: Tue, 13 Oct 2026 15:22:18 +0900 Subject: [PATCH] Fix OnLastUpdate Callback Skipped Without NonTile --- Core/RenderManager.cs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index 9afecb8..0a96c1e 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -396,19 +396,49 @@ internal class RenderManager : MonoBehaviour frameCount++; } + // Floors that own a hold renderer, collected from scrLevelMaker.listFloors (see RefreshHoldFloors). + private readonly List _holdFloors = new(); + private List? _holdFloorsSource; + private int _holdFloorsSourceCount = -1; + public void OnLastUpdate() { if (Instance.stage < RenderStage.Load) return; - if (!Configuration.AdvancedConfig.NonTile) return; - foreach (var floor in scrLevelMaker.instance.listFloors - .Where(floor => floor.holdRenderer && floor.holdRenderer.m_meshRenderer.enabled)) + + if (Configuration.AdvancedConfig.NonTile) { - floor.holdRenderer.m_meshRenderer.enabled = false; + // scrHoldRenderer.UpdateColor sets m_meshRenderer.enabled = true every time it runs + // (scrHoldRenderer.cs, called from scrPlanet/scrPlayer), so the hold meshes are disabled again every frame. + RefreshHoldFloors(); + foreach (var floor in _holdFloors) + { + if (!floor || !floor.holdRenderer) continue; + var meshRenderer = floor.holdRenderer.m_meshRenderer; + if (meshRenderer && meshRenderer.enabled) meshRenderer.enabled = false; + } } TriggerOnLastUpdate(); } + /// + /// Rebuilds the hold floor list when scrLevelMaker.listFloors is a different list or has a different count + /// (hold renderers are created together with the floors in scrLevelMaker). + /// + private void RefreshHoldFloors() + { + var floors = scrLevelMaker.instance.listFloors; + if (ReferenceEquals(floors, _holdFloorsSource) && floors.Count == _holdFloorsSourceCount) return; + + _holdFloors.Clear(); + foreach (var floor in floors) + { + if (floor && floor.holdRenderer) _holdFloors.Add(floor); + } + _holdFloorsSource = floors; + _holdFloorsSourceCount = floors.Count; + } + // ReSharper disable once Unity.IncorrectMethodSignature public void OnPostFrame(RenderTexture? texture) {