Fix una
This commit is contained in:
@@ -11,6 +11,7 @@ GameObject:
|
|||||||
- component: {fileID: 778714341242745966}
|
- component: {fileID: 778714341242745966}
|
||||||
- component: {fileID: 8799689663269280170}
|
- component: {fileID: 8799689663269280170}
|
||||||
- component: {fileID: 4504513483669768543}
|
- component: {fileID: 4504513483669768543}
|
||||||
|
- component: {fileID: 6514842037794050245}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: ServerRack
|
m_Name: ServerRack
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -90,3 +91,24 @@ MeshRenderer:
|
|||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
m_AdditionalVertexStreams: {fileID: 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}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ GameObject:
|
|||||||
- component: {fileID: 6589306329274510902}
|
- component: {fileID: 6589306329274510902}
|
||||||
- component: {fileID: 796089597655267569}
|
- component: {fileID: 796089597655267569}
|
||||||
- component: {fileID: 4133317196450489684}
|
- component: {fileID: 4133317196450489684}
|
||||||
|
- component: {fileID: 6659858383691917042}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Base
|
m_Name: Base
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -90,6 +91,28 @@ MeshRenderer:
|
|||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
m_AdditionalVertexStreams: {fileID: 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
|
--- !u!1 &3399853437845071380
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -101,6 +124,7 @@ GameObject:
|
|||||||
- component: {fileID: 1860836164064319882}
|
- component: {fileID: 1860836164064319882}
|
||||||
- component: {fileID: 761315074788654726}
|
- component: {fileID: 761315074788654726}
|
||||||
- component: {fileID: 7177216591892795590}
|
- component: {fileID: 7177216591892795590}
|
||||||
|
- component: {fileID: 8158249036517933301}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Door
|
m_Name: Door
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -180,6 +204,28 @@ MeshRenderer:
|
|||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
m_AdditionalVertexStreams: {fileID: 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
|
--- !u!1 &7844949156060570581
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public sealed class PortalExitMarker : MonoBehaviour
|
|||||||
}
|
}
|
||||||
private void LateUpdate()
|
private void LateUpdate()
|
||||||
{
|
{
|
||||||
if (!meadow || !meadow.Following || period <= 0) return;
|
if (!meadow || !meadow.Endless || period <= 0) return;
|
||||||
float poolPeriod = period * 3;
|
float poolPeriod = period * 3;
|
||||||
foreach (Transform marker in markers)
|
foreach (Transform marker in markers)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ public sealed class PortalMeadow : MonoBehaviour
|
|||||||
[SerializeField, Min(1)] private float boundsPadding = 128;
|
[SerializeField, Min(1)] private float boundsPadding = 128;
|
||||||
[Tooltip("Rendering layers of every generated PortalB renderer, so lights can be restricted to this world.")]
|
[Tooltip("Rendering layers of every generated PortalB renderer, so lights can be restricted to this world.")]
|
||||||
[SerializeField] private RenderingLayerMask renderingLayers = 1u;
|
[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) " +
|
[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, so it stays aligned and still behind the portal.")]
|
"instead of the camera, and the disk is centred on it, so everything stays aligned and still behind the portal.")]
|
||||||
[SerializeField] private Transform bendAnchor;
|
[SerializeField] private Transform bendAnchor;
|
||||||
[Tooltip("Blend from the anchor frame to the camera once the player follows.")]
|
[Tooltip("Blend from the anchor frame to the camera once the player follows.")]
|
||||||
[SerializeField, Min(0)] private float bendFadeDuration = 1.5f;
|
[SerializeField, Min(0)] private float bendFadeDuration = 1.5f;
|
||||||
@@ -65,7 +65,7 @@ public sealed class PortalMeadow : MonoBehaviour
|
|||||||
public bool Endless => endless && Application.isPlaying;
|
public bool Endless => endless && Application.isPlaying;
|
||||||
/// <summary>Endless and currently recentering on the player (see SetFollowPlayer).</summary>
|
/// <summary>Endless and currently recentering on the player (see SetFollowPlayer).</summary>
|
||||||
public bool Following => Endless && followPlayer;
|
public bool Following => Endless && followPlayer;
|
||||||
public Vector3 SurfaceCenter => Following && capturedPlayer ? surfaceCenter : Center;
|
public Vector3 SurfaceCenter => Endless ? surfaceCenter : Center;
|
||||||
|
|
||||||
public void ConfigureRegion(Material target)
|
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;
|
frameBlend = !Following ? 0 : bendFadeDuration > 0 ? Mathf.MoveTowards(frameBlend, 1, Time.deltaTime / bendFadeDuration) : 1;
|
||||||
surfaceCenter = Center;
|
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;
|
surfaceCenter.x = p.x; surfaceCenter.z = p.z;
|
||||||
}
|
}
|
||||||
if (groundCollider) groundCollider.center = SurfaceCenter + Vector3.down * (colliderThickness * 0.5f);
|
if (groundCollider) groundCollider.center = SurfaceCenter + Vector3.down * (colliderThickness * 0.5f);
|
||||||
@@ -129,7 +131,7 @@ public sealed class PortalMeadow : MonoBehaviour
|
|||||||
{
|
{
|
||||||
Transform tile = tiles[i];
|
Transform tile = tiles[i];
|
||||||
Vector3 p = tile.localPosition;
|
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.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;
|
p.z += Mathf.Floor((SurfaceCenter.z - p.z - tileSize.y * 0.5f + patchSize.y * 0.5f) / patchSize.y) * patchSize.y;
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
private bool rebuild;
|
private bool rebuild;
|
||||||
private readonly Dictionary<Material, Material> curvedMaterials = new Dictionary<Material, Material>();
|
private readonly Dictionary<Material, Material> curvedMaterials = new Dictionary<Material, Material>();
|
||||||
private readonly List<Transform> servers = new List<Transform>();
|
private readonly List<Transform> servers = new List<Transform>();
|
||||||
|
private readonly List<Collider> colliders = new List<Collider>();
|
||||||
|
private bool collidersEnabled = true;
|
||||||
private float wrapExtent;
|
private float wrapExtent;
|
||||||
// Distance between the centres of two repeated server clusters.
|
// Distance between the centres of two repeated server clusters.
|
||||||
public float RepetitionPeriod => wrapExtent * 2;
|
public float RepetitionPeriod => wrapExtent * 2;
|
||||||
@@ -63,6 +65,8 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
if (!meadow) meadow = GetComponent<PortalMeadow>();
|
if (!meadow) meadow = GetComponent<PortalMeadow>();
|
||||||
if (!meadow) return;
|
if (!meadow) return;
|
||||||
SyncBend();
|
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;
|
if (!rebuild && lastSize == meadow.Size && lastCenter == meadow.Center && lastEndless == meadow.Endless) return;
|
||||||
rebuild = false;
|
rebuild = false;
|
||||||
lastSize = meadow.Size;
|
lastSize = meadow.Size;
|
||||||
@@ -77,7 +81,7 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
}
|
}
|
||||||
private void LateUpdate()
|
private void LateUpdate()
|
||||||
{
|
{
|
||||||
if (!meadow || !meadow.Following || wrapExtent <= 0) return;
|
if (!meadow || !meadow.Endless || wrapExtent <= 0) return;
|
||||||
Vector3 centre = meadow.SurfaceCenter;
|
Vector3 centre = meadow.SurfaceCenter;
|
||||||
float period = wrapExtent * 2;
|
float period = wrapExtent * 2;
|
||||||
foreach (Transform server in servers)
|
foreach (Transform server in servers)
|
||||||
@@ -89,6 +93,12 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
server.localPosition = p;
|
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")]
|
[ContextMenu("Regenerate server rings")]
|
||||||
private void Regenerate() { rebuild = true; }
|
private void Regenerate() { rebuild = true; }
|
||||||
|
|
||||||
@@ -104,6 +114,7 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
foreach (Material material in curvedMaterials.Values) if (material) Release(material);
|
foreach (Material material in curvedMaterials.Values) if (material) Release(material);
|
||||||
curvedMaterials.Clear();
|
curvedMaterials.Clear();
|
||||||
servers.Clear();
|
servers.Clear();
|
||||||
|
colliders.Clear();
|
||||||
}
|
}
|
||||||
private GameObject CreateServer()
|
private GameObject CreateServer()
|
||||||
{
|
{
|
||||||
@@ -182,6 +193,9 @@ public sealed class PortalServerGrid : MonoBehaviour
|
|||||||
servers.Add(server.transform);
|
servers.Add(server.transform);
|
||||||
}
|
}
|
||||||
if (count == 0) { Clear(); return; }
|
if (count == 0) { Clear(); return; }
|
||||||
|
colliders.AddRange(generated.GetComponentsInChildren<Collider>(true));
|
||||||
|
collidersEnabled = true; // As instantiated from the prefab.
|
||||||
|
SetCollidersEnabled(!meadow.Endless || meadow.Following);
|
||||||
SyncBend();
|
SyncBend();
|
||||||
generated.SetActive(true);
|
generated.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user