From 85e83577342090a69d9012a849eb002da9458033 Mon Sep 17 00:00:00 2001 From: Vivian V Wing Date: Sat, 23 May 2026 20:22:51 -0700 Subject: [PATCH] Optimized Automap Moved Automap onto its own non-interacting physics layer, so we don't have to constantly enable/disable its game objects. This is a *huge* performance boost in large dungeons. Also we now destroy the generated geo immediately on transition to the outside. This could wait, before, because the geo was disabled; but now that we don't disable geo, we need to do it immediately. --- Assets/Scripts/Game/Automap.cs | 53 ++++++--------------------- ProjectSettings/DynamicsManager.asset | 2 +- 2 files changed, 13 insertions(+), 42 deletions(-) diff --git a/Assets/Scripts/Game/Automap.cs b/Assets/Scripts/Game/Automap.cs index a757a91905..dbe45a1551 100644 --- a/Assets/Scripts/Game/Automap.cs +++ b/Assets/Scripts/Game/Automap.cs @@ -406,8 +406,6 @@ public void UpdateAutomapStateOnWindowPush() // since new teleporters could have been discovered by pc since last time map was open this must be checked here CreateTeleporterMarkers(); - SetActivationStateOfMapObjects(true); - gameobjectPlayerMarkerArrow.transform.position = gameObjectPlayerAdvanced.transform.position; gameobjectPlayerMarkerArrow.transform.rotation = gameObjectPlayerAdvanced.transform.rotation; @@ -429,12 +427,6 @@ public void UpdateAutomapStateOnWindowPush() /// public void UpdateAutomapStateOnWindowPop() { - // about SetActivationStateOfMapObjects(false): - // this will not be enough if we will eventually allow gui windows to be opened while exploring the world - // then it will be necessary to either only disable the colliders on the automap level geometry or - // make player collision ignore colliders of objects in automap layer - I would clearly prefer this option - SetActivationStateOfMapObjects(false); - if ((GameManager.Instance.PlayerEnterExit.IsPlayerInside) && ((GameManager.Instance.PlayerEnterExit.IsPlayerInsideBuilding) || (GameManager.Instance.PlayerEnterExit.IsPlayerInsideDungeon) || (GameManager.Instance.PlayerEnterExit.IsPlayerInsideDungeonCastle))) { // and get rid of lights used to light the automap level geometry @@ -1154,9 +1146,6 @@ void CheckForNewlyDiscoveredMeshes() if ((gameobjectGeometry != null) && ((GameManager.Instance.IsPlayerInsideBuilding) || (GameManager.Instance.IsPlayerInsideDungeon) || (GameManager.Instance.IsPlayerInsideCastle))) { - // enable automap level geometry for revealing (so raycasts can hit colliders of automap level geometry) - gameobjectGeometry.SetActive(true); - // reveal geometry right below player - raycast down from player head position Vector3 rayStartPos = gameObjectPlayerAdvanced.transform.position + Camera.main.transform.localPosition; Vector3 rayDirection = Vector3.down; @@ -1189,9 +1178,6 @@ void CheckForNewlyDiscoveredMeshes() ScanWithRaycastInDirectionAndUpdateMeshesAndMaterials(rayStartPos + stepVector, rayDirection, rayDistance, offsetSecondProtectionRaycast); } } - - // disable gameobjectGeometry so player movement won't be affected by geometry colliders of automap level geometry - gameobjectGeometry.SetActive(false); } // entrance marker discovery check - only do as long as undiscovered @@ -1281,7 +1267,7 @@ IEnumerator CoroutineCheckForNewlyDiscoveredMeshes() { while (true) { - // only proceed if automap is not opened (otherwise command gameobjectGeometry.SetActive(false); will mess with automap rendering when scheduling is a bitch and overwrites changes from UpdateAutomapStateOnWindowPush() + // only update discovery while automap is closed if (!isOpenAutomap) { CheckForNewlyDiscoveredMeshes(); @@ -1315,25 +1301,6 @@ private void UpdateSlicingPositionY() // material.renderQueue = 3000; //} - /// - /// sets active state of map GameObjects like geometry, beacons, user note markers and teleporter markers - /// used on automap open to enable (show) objects and hide them on automap close - /// it is important to set them inactive when closing the map - so that ingame raycasts won't hit colliders of map objects - /// - /// the desired activation state for the map objects to be set - private void SetActivationStateOfMapObjects(bool active) - { - gameobjectGeometry.SetActive(active); - - gameobjectBeacons.SetActive(active); - - if (gameObjectUserNoteMarkers != null) - gameObjectUserNoteMarkers.SetActive(active); - - if (gameobjectTeleporterMarkers != null) - gameobjectTeleporterMarkers.SetActive(active); - } - /// /// setup beacons: lazy creation of player marker arrow and beacons including /// player position beacon, dungeon entrance position beacon and rotation pivot axis position beacon @@ -1622,8 +1589,6 @@ private void AddTeleporterMarkerOnMap(TeleporterTransform startPoint, Teleporter gameobjectTeleporterMarkers.layer = layerAutomap; } - gameobjectTeleporterMarkers.SetActive(false); - string teleporterEntranceName = NameGameobjectTeleporterSubStringStart + dictkey + NameGameobjectTeleporterEntranceSubStringEnd; if (gameobjectTeleporterMarkers.transform.Find(teleporterEntranceName) == null) { @@ -2484,16 +2449,12 @@ void InitWhenInInteriorOrDungeon(StaticDoor? door = null, bool initFromLoadingSa CreateIndoorGeometryForAutomap(door.Value); RestoreStateAutomapDungeon(true); resetAutomapSettingsFromExternalScript = true; // set flag so external script (DaggerfallAutomapWindow) can pull flag and reset automap values on next window push - - SetActivationStateOfMapObjects(false); } else if ((GameManager.Instance.IsPlayerInsideDungeon) || (GameManager.Instance.IsPlayerInsideCastle)) { CreateDungeonGeometryForAutomap(); RestoreStateAutomapDungeon(!initFromLoadingSave); // if a save game was loaded, do not reset the revisited state (don't set parameter forceNotVisitedInThisRun to true) resetAutomapSettingsFromExternalScript = true; // set flag so external script (DaggerfallAutomapWindow) can pull flag and reset automap values on next window push - - SetActivationStateOfMapObjects(false); } else { @@ -2525,12 +2486,22 @@ private void OnTransitionToExterior(PlayerEnterExit.TransitionEventArgs args) { SaveStateAutomapInterior(); DestroyBeacons(); + if (gameobjectGeometry != null) + { + UnityEngine.Object.Destroy(gameobjectGeometry); + gameobjectGeometry = null; + } } private void OnTransitionToDungeonExterior(PlayerEnterExit.TransitionEventArgs args) { SaveStateAutomapDungeon(true); DestroyBeacons(); + if (gameobjectGeometry != null) + { + UnityEngine.Object.Destroy(gameobjectGeometry); + gameobjectGeometry = null; + } } void OnLoadEvent(SaveData_v1 saveData) @@ -2731,4 +2702,4 @@ public static int AddNext(this SortedList sortedList, T item) } #endregion -} \ No newline at end of file +} diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset index 072072799c..5a17e6497b 100644 --- a/ProjectSettings/DynamicsManager.asset +++ b/ProjectSettings/DynamicsManager.asset @@ -17,7 +17,7 @@ PhysicsManager: m_ClothInterCollisionDistance: 0 m_ClothInterCollisionStiffness: 0 m_ContactsGeneration: 1 - m_LayerCollisionMatrix: fffffefffffffeffffbffefffffffffffffffefffffffefffffffffffffffffffffffefffffffefffffffefffffffefffffffefffffffefffbbffefffffffeffc800fe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffefffffffefffffffeff + m_LayerCollisionMatrix: fffbfefffffbfeffffbbfefffffffffffffbfefffffbfefffffffffffffffffffffbfefffffbfeffc804fe0ffffbfefffffbfefffffbfefffbbbfefffffbfeffc800fe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfefffffbfefffffbfefffffbfeff m_AutoSimulation: 1 m_AutoSyncTransforms: 1 m_ReuseCollisionCallbacks: 0