From b0c6111d57904220b8e7e255a8414e2780127c39 Mon Sep 17 00:00:00 2001 From: TIBOfdg Date: Mon, 28 Sep 2026 16:11:10 +0200 Subject: [PATCH] Fix una --- .../ServerRack/Prefabs/ServerRack.prefab | 22 +++++++++ .../WoodenCabin/Prefabs/cabin.prefab | 46 +++++++++++++++++++ Assets/_Content/Scripts/PortalExitMarker.cs | 2 +- Assets/_Content/Scripts/PortalMeadow.cs | 14 +++--- Assets/_Content/Scripts/PortalServerGrid.cs | 16 ++++++- 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/Assets/_Content/Models/Environments/Unabomber/ServerRack/Prefabs/ServerRack.prefab b/Assets/_Content/Models/Environments/Unabomber/ServerRack/Prefabs/ServerRack.prefab index 11510d5e..9cbd218c 100644 --- a/Assets/_Content/Models/Environments/Unabomber/ServerRack/Prefabs/ServerRack.prefab +++ b/Assets/_Content/Models/Environments/Unabomber/ServerRack/Prefabs/ServerRack.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 778714341242745966} - component: {fileID: 8799689663269280170} - component: {fileID: 4504513483669768543} + - component: {fileID: 6514842037794050245} m_Layer: 0 m_Name: ServerRack m_TagString: Untagged @@ -90,3 +91,24 @@ MeshRenderer: m_SortingOrder: 0 m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6514842037794050245 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3796740323206560363} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 0.00647058, y: 0.02, z: 0.0064705997} + m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/_Content/Models/Environments/Unabomber/WoodenCabin/Prefabs/cabin.prefab b/Assets/_Content/Models/Environments/Unabomber/WoodenCabin/Prefabs/cabin.prefab index 90209450..99649d64 100644 --- a/Assets/_Content/Models/Environments/Unabomber/WoodenCabin/Prefabs/cabin.prefab +++ b/Assets/_Content/Models/Environments/Unabomber/WoodenCabin/Prefabs/cabin.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 6589306329274510902} - component: {fileID: 796089597655267569} - component: {fileID: 4133317196450489684} + - component: {fileID: 6659858383691917042} m_Layer: 0 m_Name: Base m_TagString: Untagged @@ -90,6 +91,28 @@ MeshRenderer: m_SortingOrder: 0 m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &6659858383691917042 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2974699667103267937} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 3909233067320746374, guid: 9ed825523b5b29b41b3c33635d4bd7f7, type: 3} --- !u!1 &3399853437845071380 GameObject: m_ObjectHideFlags: 0 @@ -101,6 +124,7 @@ GameObject: - component: {fileID: 1860836164064319882} - component: {fileID: 761315074788654726} - component: {fileID: 7177216591892795590} + - component: {fileID: 8158249036517933301} m_Layer: 0 m_Name: Door m_TagString: Untagged @@ -180,6 +204,28 @@ MeshRenderer: m_SortingOrder: 0 m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &8158249036517933301 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3399853437845071380} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 2619086233303812490, guid: 9ed825523b5b29b41b3c33635d4bd7f7, type: 3} --- !u!1 &7844949156060570581 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Content/Scripts/PortalExitMarker.cs b/Assets/_Content/Scripts/PortalExitMarker.cs index 11ea1fd0..58a0be44 100644 --- a/Assets/_Content/Scripts/PortalExitMarker.cs +++ b/Assets/_Content/Scripts/PortalExitMarker.cs @@ -57,7 +57,7 @@ public sealed class PortalExitMarker : MonoBehaviour } private void LateUpdate() { - if (!meadow || !meadow.Following || period <= 0) return; + if (!meadow || !meadow.Endless || period <= 0) return; float poolPeriod = period * 3; foreach (Transform marker in markers) { diff --git a/Assets/_Content/Scripts/PortalMeadow.cs b/Assets/_Content/Scripts/PortalMeadow.cs index 80d38bae..00f4130f 100644 --- a/Assets/_Content/Scripts/PortalMeadow.cs +++ b/Assets/_Content/Scripts/PortalMeadow.cs @@ -29,8 +29,8 @@ public sealed class PortalMeadow : MonoBehaviour [SerializeField, Min(1)] private float boundsPadding = 128; [Tooltip("Rendering layers of every generated PortalB renderer, so lights can be restricted to this world.")] [SerializeField] private RenderingLayerMask renderingLayers = 1u; - [Tooltip("While not following the player, the bend is computed from this frame (e.g. the portal, looking along its forward axis) " + - "instead of the camera, so it stays aligned and still behind the portal.")] + [Tooltip("Entrance (e.g. the portal). While not following the player, the bend is computed from this frame (looking along its forward axis) " + + "instead of the camera, and the disk is centred on it, so everything stays aligned and still behind the portal.")] [SerializeField] private Transform bendAnchor; [Tooltip("Blend from the anchor frame to the camera once the player follows.")] [SerializeField, Min(0)] private float bendFadeDuration = 1.5f; @@ -65,7 +65,7 @@ public sealed class PortalMeadow : MonoBehaviour public bool Endless => endless && Application.isPlaying; /// Endless and currently recentering on the player (see SetFollowPlayer). public bool Following => Endless && followPlayer; - public Vector3 SurfaceCenter => Following && capturedPlayer ? surfaceCenter : Center; + public Vector3 SurfaceCenter => Endless ? surfaceCenter : Center; public void ConfigureRegion(Material target) { @@ -112,9 +112,11 @@ public sealed class PortalMeadow : MonoBehaviour { frameBlend = !Following ? 0 : bendFadeDuration > 0 ? Mathf.MoveTowards(frameBlend, 1, Time.deltaTime / bendFadeDuration) : 1; surfaceCenter = Center; - if (Following && capturedPlayer) + // Before the crossing, the disk is already centred on the entrance, so following the player does not jump. + Transform focus = !Endless ? null : Following ? capturedPlayer : bendAnchor; + if (focus) { - Vector3 p = transform.InverseTransformPoint(capturedPlayer.position); + Vector3 p = transform.InverseTransformPoint(focus.position); surfaceCenter.x = p.x; surfaceCenter.z = p.z; } if (groundCollider) groundCollider.center = SurfaceCenter + Vector3.down * (colliderThickness * 0.5f); @@ -129,7 +131,7 @@ public sealed class PortalMeadow : MonoBehaviour { Transform tile = tiles[i]; Vector3 p = tile.localPosition; - if (Following) + if (Endless) { p.x += Mathf.Floor((SurfaceCenter.x - p.x - tileSize.x * 0.5f + patchSize.x * 0.5f) / patchSize.x) * patchSize.x; p.z += Mathf.Floor((SurfaceCenter.z - p.z - tileSize.y * 0.5f + patchSize.y * 0.5f) / patchSize.y) * patchSize.y; diff --git a/Assets/_Content/Scripts/PortalServerGrid.cs b/Assets/_Content/Scripts/PortalServerGrid.cs index 04066d34..c9c9f8e3 100644 --- a/Assets/_Content/Scripts/PortalServerGrid.cs +++ b/Assets/_Content/Scripts/PortalServerGrid.cs @@ -32,6 +32,8 @@ public sealed class PortalServerGrid : MonoBehaviour private bool rebuild; private readonly Dictionary curvedMaterials = new Dictionary(); private readonly List servers = new List(); + private readonly List colliders = new List(); + private bool collidersEnabled = true; private float wrapExtent; // Distance between the centres of two repeated server clusters. public float RepetitionPeriod => wrapExtent * 2; @@ -63,6 +65,8 @@ public sealed class PortalServerGrid : MonoBehaviour if (!meadow) meadow = GetComponent(); if (!meadow) return; SyncBend(); + // Servers are invisible until the player crossed the portal, so they only block once the meadow follows the player. + SetCollidersEnabled(!meadow.Endless || meadow.Following); if (!rebuild && lastSize == meadow.Size && lastCenter == meadow.Center && lastEndless == meadow.Endless) return; rebuild = false; lastSize = meadow.Size; @@ -77,7 +81,7 @@ public sealed class PortalServerGrid : MonoBehaviour } private void LateUpdate() { - if (!meadow || !meadow.Following || wrapExtent <= 0) return; + if (!meadow || !meadow.Endless || wrapExtent <= 0) return; Vector3 centre = meadow.SurfaceCenter; float period = wrapExtent * 2; foreach (Transform server in servers) @@ -89,6 +93,12 @@ public sealed class PortalServerGrid : MonoBehaviour server.localPosition = p; } } + private void SetCollidersEnabled(bool enabled) + { + if (collidersEnabled == enabled) return; + collidersEnabled = enabled; + foreach (Collider collider in colliders) if (collider) collider.enabled = enabled; + } [ContextMenu("Regenerate server rings")] private void Regenerate() { rebuild = true; } @@ -104,6 +114,7 @@ public sealed class PortalServerGrid : MonoBehaviour foreach (Material material in curvedMaterials.Values) if (material) Release(material); curvedMaterials.Clear(); servers.Clear(); + colliders.Clear(); } private GameObject CreateServer() { @@ -182,6 +193,9 @@ public sealed class PortalServerGrid : MonoBehaviour servers.Add(server.transform); } if (count == 0) { Clear(); return; } + colliders.AddRange(generated.GetComponentsInChildren(true)); + collidersEnabled = true; // As instantiated from the prefab. + SetCollidersEnabled(!meadow.Endless || meadow.Following); SyncBend(); generated.SetActive(true); }