From f47b985d3ef0bc9c388a694867af7e4b49c01d67 Mon Sep 17 00:00:00 2001 From: Patricio Guerra Date: Thu, 14 Dec 2023 16:47:27 -0300 Subject: [PATCH] fix: teleport not properly working --- .../ProfileDataSourceSettings.asset.meta | 8 +++ .../Assets/DCL/Character/CharacterObject.cs | 6 --- .../Assets/DCL/Character/ICharacterObject.cs | 2 - .../Components/CharacterRigidTransform.cs | 3 ++ .../Components/PlayerTeleportIntent.cs | 14 ++++++ .../Components/PlayerTeleportIntent.cs.meta | 3 ++ .../Platforms/PlatformRaycast.cs | 38 ++++++++++++++ .../Platforms/PlatformRaycast.cs.meta | 3 ++ .../Systems/CharacterPlatformSystem.cs | 38 +++----------- .../Systems/InterpolateCharacterSystem.cs | 22 +++++++-- .../ParcelsService/DCL.ParcelsService.asmdef | 49 ++++++++++--------- .../DCL/ParcelsService/IRetrieveScene.cs | 2 +- .../RetrieveSceneFromFixedRealm.cs | 2 +- .../RetrieveSceneFromVolatileWorld.cs | 2 +- .../DCL/ParcelsService/TeleportController.cs | 28 ++++++++--- .../Global/Dynamic/DynamicSceneLoader.cs | 8 +-- .../Global/Dynamic/IRealmController.cs | 11 +++-- .../Scripts/Global/Dynamic/RealmController.cs | 17 +++++-- 18 files changed, 166 insertions(+), 90 deletions(-) create mode 100644 Explorer/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta create mode 100644 Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs create mode 100644 Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs.meta create mode 100644 Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs create mode 100644 Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs.meta diff --git a/Explorer/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta b/Explorer/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta new file mode 100644 index 0000000000..761988bff9 --- /dev/null +++ b/Explorer/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ebe2a662356314f05b03623e66ea7c24 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/Character/CharacterObject.cs b/Explorer/Assets/DCL/Character/CharacterObject.cs index 04eebfea2f..70627f8a22 100644 --- a/Explorer/Assets/DCL/Character/CharacterObject.cs +++ b/Explorer/Assets/DCL/Character/CharacterObject.cs @@ -7,12 +7,6 @@ public class CharacterObject : MonoBehaviour, ICharacterObject [field: SerializeField] public CharacterController Controller { get; private set; } - public void Move(Vector3 globalPosition) - { - Vector3 delta = globalPosition - transform.position; - Controller.Move(delta); - } - [field: SerializeField] public Transform CameraFocus { get; private set; } diff --git a/Explorer/Assets/DCL/Character/ICharacterObject.cs b/Explorer/Assets/DCL/Character/ICharacterObject.cs index c919d632f2..f2626fe922 100644 --- a/Explorer/Assets/DCL/Character/ICharacterObject.cs +++ b/Explorer/Assets/DCL/Character/ICharacterObject.cs @@ -6,8 +6,6 @@ public interface ICharacterObject { CharacterController Controller { get; } - void Move(Vector3 globalPosition); - Transform CameraFocus { get; } Transform Transform { get; } diff --git a/Explorer/Assets/DCL/CharacterMotion/Components/CharacterRigidTransform.cs b/Explorer/Assets/DCL/CharacterMotion/Components/CharacterRigidTransform.cs index b103ea31b1..c9b74bed84 100644 --- a/Explorer/Assets/DCL/CharacterMotion/Components/CharacterRigidTransform.cs +++ b/Explorer/Assets/DCL/CharacterMotion/Components/CharacterRigidTransform.cs @@ -43,6 +43,9 @@ public class CharacterRigidTransform // Current Normal of the slope public Vector3 CurrentSlopeNormal; + // The last calculated platform delta + public Vector3 PlatformDelta; + // This flag is set when the rigidTransform is between 2 slopes public bool IsStuck; diff --git a/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs b/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs new file mode 100644 index 0000000000..a2866dcaca --- /dev/null +++ b/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +namespace DCL.CharacterMotion.Components +{ + public struct PlayerTeleportIntent + { + public Vector3 Position; + + public PlayerTeleportIntent(Vector3 position) + { + Position = position; + } + } +} diff --git a/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs.meta b/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs.meta new file mode 100644 index 0000000000..4c14996c16 --- /dev/null +++ b/Explorer/Assets/DCL/CharacterMotion/Components/PlayerTeleportIntent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3693f1c0eec34dcd8f821dbbc8c2f458 +timeCreated: 1702579022 \ No newline at end of file diff --git a/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs b/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs new file mode 100644 index 0000000000..4536273396 --- /dev/null +++ b/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs @@ -0,0 +1,38 @@ +using CrdtEcsBridge.Physics; +using DCL.CharacterMotion.Components; +using DCL.CharacterMotion.Settings; +using System.Runtime.CompilerServices; +using UnityEngine; + +namespace DCL.CharacterMotion.Platforms +{ + public static class PlatformRaycast + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Execute(CharacterPlatformComponent platformComponent, float radius, Transform transform, ICharacterControllerSettings settings) + { + float rayDistance = settings.PlatformRaycastLength; + float halfDistance = (rayDistance * 0.5f) + radius; + + var ray = new Ray + { + origin = transform.position + (Vector3.up * halfDistance), + direction = Vector3.down, + }; + + bool hasHit = Physics.SphereCast(ray, radius, out RaycastHit hitInfo, rayDistance + radius, PhysicsLayers.CHARACTER_ONLY_MASK); + + if (hasHit) + { + if (platformComponent.CurrentPlatform != hitInfo.collider.transform) + { + platformComponent.CurrentPlatform = hitInfo.collider.transform; + platformComponent.LastPosition = platformComponent.CurrentPlatform.InverseTransformPoint(transform.position); + platformComponent.LastRotation = platformComponent.CurrentPlatform.InverseTransformDirection(transform.forward); + } + } + else + platformComponent.CurrentPlatform = null; + } + } +} diff --git a/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs.meta b/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs.meta new file mode 100644 index 0000000000..17a6b8b144 --- /dev/null +++ b/Explorer/Assets/DCL/CharacterMotion/Platforms/PlatformRaycast.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e9f9653dcfa74b71bb9b44a5166f6026 +timeCreated: 1702581300 \ No newline at end of file diff --git a/Explorer/Assets/DCL/CharacterMotion/Systems/CharacterPlatformSystem.cs b/Explorer/Assets/DCL/CharacterMotion/Systems/CharacterPlatformSystem.cs index db52a12c95..5278ca52e2 100644 --- a/Explorer/Assets/DCL/CharacterMotion/Systems/CharacterPlatformSystem.cs +++ b/Explorer/Assets/DCL/CharacterMotion/Systems/CharacterPlatformSystem.cs @@ -2,12 +2,11 @@ using Arch.System; using Arch.SystemGroups; using Arch.SystemGroups.DefaultSystemGroups; -using CrdtEcsBridge.Physics; using DCL.CharacterMotion.Components; +using DCL.CharacterMotion.Platforms; using DCL.CharacterMotion.Settings; using DCL.Diagnostics; using ECS.Abstract; -using System.Runtime.CompilerServices; using UnityEngine; namespace DCL.CharacterMotion.Systems @@ -26,12 +25,15 @@ protected override void Update(float t) } [Query] + [None(typeof(PlayerTeleportIntent))] private void ResolvePlatformMovement( in ICharacterControllerSettings settings, ref CharacterPlatformComponent platformComponent, ref CharacterRigidTransform rigidTransform, ref CharacterController characterController) { + rigidTransform.PlatformDelta = Vector3.zero; + if (!rigidTransform.IsGrounded) { platformComponent.CurrentPlatform = null; @@ -40,7 +42,7 @@ private void ResolvePlatformMovement( Transform transform = characterController.transform; - CheckPlatform(platformComponent, transform, settings); + PlatformRaycast.Execute(platformComponent, characterController.radius, transform, settings); if (platformComponent.CurrentPlatform == null) return; @@ -49,36 +51,8 @@ private void ResolvePlatformMovement( Vector3 newGroundWorldPos = platformTransform.TransformPoint(platformComponent.LastPosition); Vector3 newCharacterForward = platformTransform.TransformDirection(platformComponent.LastRotation); - Vector3 deltaPosition = newGroundWorldPos - transform.position; - characterController.Move(deltaPosition); + rigidTransform.PlatformDelta = newGroundWorldPos - transform.position; transform.forward = newCharacterForward; } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void CheckPlatform(CharacterPlatformComponent platformComponent, Transform transform, ICharacterControllerSettings settings) - { - float rayDistance = settings.PlatformRaycastLength; - float halfDistance = rayDistance * 0.5f; - - var ray = new Ray - { - origin = transform.position + (Vector3.up * halfDistance), - direction = Vector3.down, - }; - - bool hasHit = Physics.Raycast(ray, out RaycastHit hitInfo, rayDistance, PhysicsLayers.CHARACTER_ONLY_MASK); - - if (hasHit) - { - if (platformComponent.CurrentPlatform != hitInfo.collider.transform) - { - platformComponent.CurrentPlatform = hitInfo.collider.transform; - platformComponent.LastPosition = platformComponent.CurrentPlatform.InverseTransformPoint(transform.position); - platformComponent.LastRotation = platformComponent.CurrentPlatform.InverseTransformDirection(transform.forward); - } - } - else - platformComponent.CurrentPlatform = null; - } } } diff --git a/Explorer/Assets/DCL/CharacterMotion/Systems/InterpolateCharacterSystem.cs b/Explorer/Assets/DCL/CharacterMotion/Systems/InterpolateCharacterSystem.cs index 2f6290ac40..ed90559691 100644 --- a/Explorer/Assets/DCL/CharacterMotion/Systems/InterpolateCharacterSystem.cs +++ b/Explorer/Assets/DCL/CharacterMotion/Systems/InterpolateCharacterSystem.cs @@ -29,9 +29,23 @@ private InterpolateCharacterSystem(World world) : base(world) { } protected override void Update(float t) { InterpolateQuery(World, t); + TeleportPlayerQuery(World); } [Query] + private void TeleportPlayer(in Entity entity, in CharacterController controller, ref CharacterPlatformComponent platformComponent, in PlayerTeleportIntent teleportIntent) + { + // Teleport the character + controller.transform.position = teleportIntent.Position; + + // Reset the current platform so we dont bounce back if we are touching the world plane + platformComponent.CurrentPlatform = null; + + World.Remove(entity); + } + + [Query] + [None(typeof(PlayerTeleportIntent))] private void Interpolate( [Data] float dt, in ICharacterControllerSettings settings, @@ -50,19 +64,19 @@ private void Interpolate( Vector3 movementDelta = rigidTransform.MoveVelocity.Velocity * dt; Vector3 finalGravity = rigidTransform.IsOnASteepSlope && !rigidTransform.IsStuck ? rigidTransform.SlopeGravity : rigidTransform.GravityVelocity; Vector3 gravityDelta = finalGravity * dt; + Vector3 platformDelta = rigidTransform.PlatformDelta; // In order for some systems to work correctly we move the character horizontally and then vertically - CollisionFlags horizontalCollisionFlags = characterController.Move(movementDelta); Vector3 prevPos = transform.position; - CollisionFlags verticalCollisionFlags = characterController.Move(gravityDelta + slopeModifier); + CollisionFlags collisionFlags = characterController.Move(movementDelta + gravityDelta + slopeModifier + platformDelta); Vector3 deltaMovement = transform.position - prevPos; - bool hasGroundedFlag = deltaMovement.y <= 0 && (EnumUtils.HasFlag(verticalCollisionFlags, CollisionFlags.Below) || EnumUtils.HasFlag(horizontalCollisionFlags, CollisionFlags.Below)); + bool hasGroundedFlag = deltaMovement.y <= 0 && EnumUtils.HasFlag(collisionFlags, CollisionFlags.Below); if (!Mathf.Approximately(gravityDelta.y, 0f)) rigidTransform.IsGrounded = hasGroundedFlag || characterController.isGrounded; - rigidTransform.IsCollidingWithWall = EnumUtils.HasFlag(horizontalCollisionFlags, CollisionFlags.Sides); + rigidTransform.IsCollidingWithWall = EnumUtils.HasFlag(collisionFlags, CollisionFlags.Sides); // If we are on a platform we save our local position PlatformSaveLocalPosition.Execute(ref platformComponent, transform.position); diff --git a/Explorer/Assets/DCL/ParcelsService/DCL.ParcelsService.asmdef b/Explorer/Assets/DCL/ParcelsService/DCL.ParcelsService.asmdef index d030de672e..fcc1419e26 100644 --- a/Explorer/Assets/DCL/ParcelsService/DCL.ParcelsService.asmdef +++ b/Explorer/Assets/DCL/ParcelsService/DCL.ParcelsService.asmdef @@ -1,26 +1,27 @@ { - "name": "DCL.ParcelsService", - "rootNamespace": "", - "references": [ - "GUID:f51ebe6a0ceec4240a699833d6309b23", - "GUID:1d2c76eb8b48e0b40940e8b31a679ce1", - "GUID:8322ea9340a544c59ddc56d4793eac74", - "GUID:4794e238ed0f65142a4aea5848b513e5", - "GUID:fa7b3fdbb04d67549916da7bd2af58ab", - "GUID:e0eedfa2deb9406daf86fd8368728e39", - "GUID:d8b63aba1907145bea998dd612889d6b", - "GUID:9e314663ce958b746873cb22d57ede55", - "GUID:c80c82a8f4e04453b85fbab973d6774a", - "GUID:4725c02394ab4ce19f889e4e8001f989", - "GUID:3640f3c0b42946b0b8794a1ed8e06ca5" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false + "name": "DCL.ParcelsService", + "rootNamespace": "", + "references": [ + "GUID:f51ebe6a0ceec4240a699833d6309b23", + "GUID:1d2c76eb8b48e0b40940e8b31a679ce1", + "GUID:8322ea9340a544c59ddc56d4793eac74", + "GUID:4794e238ed0f65142a4aea5848b513e5", + "GUID:fa7b3fdbb04d67549916da7bd2af58ab", + "GUID:e0eedfa2deb9406daf86fd8368728e39", + "GUID:d8b63aba1907145bea998dd612889d6b", + "GUID:9e314663ce958b746873cb22d57ede55", + "GUID:c80c82a8f4e04453b85fbab973d6774a", + "GUID:4725c02394ab4ce19f889e4e8001f989", + "GUID:3640f3c0b42946b0b8794a1ed8e06ca5", + "GUID:007bff6000804d90ac597452fb69a4ee" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Explorer/Assets/DCL/ParcelsService/IRetrieveScene.cs b/Explorer/Assets/DCL/ParcelsService/IRetrieveScene.cs index 201f7a69d7..58f85aadcc 100644 --- a/Explorer/Assets/DCL/ParcelsService/IRetrieveScene.cs +++ b/Explorer/Assets/DCL/ParcelsService/IRetrieveScene.cs @@ -17,6 +17,6 @@ public interface IRetrieveScene /// Null if the parcel does not belong to the real scene UniTask ByParcelAsync(Vector2Int parcel, CancellationToken ct); - World World { set; } + World World { get; set; } } } diff --git a/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromFixedRealm.cs b/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromFixedRealm.cs index aeeaa14dfa..9ee3580984 100644 --- a/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromFixedRealm.cs +++ b/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromFixedRealm.cs @@ -15,7 +15,7 @@ public partial class RetrieveSceneFromFixedRealm : IRetrieveScene /// /// World should be set when the realm is [re-]loaded /// - public World World { private get; set; } + public World World { get; set; } public async UniTask ByParcelAsync(Vector2Int parcel, CancellationToken ct) { diff --git a/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromVolatileWorld.cs b/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromVolatileWorld.cs index c17e3c4359..682d349af8 100644 --- a/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromVolatileWorld.cs +++ b/Explorer/Assets/DCL/ParcelsService/RetrieveSceneFromVolatileWorld.cs @@ -23,7 +23,7 @@ public class RetrieveSceneFromVolatileWorld : IRetrieveScene private readonly IRealmData realmData; - public World World { private get; set; } + public World World { get; set; } public RetrieveSceneFromVolatileWorld(IRealmData realmData) { diff --git a/Explorer/Assets/DCL/ParcelsService/TeleportController.cs b/Explorer/Assets/DCL/ParcelsService/TeleportController.cs index 598d3dff04..90400d30cf 100644 --- a/Explorer/Assets/DCL/ParcelsService/TeleportController.cs +++ b/Explorer/Assets/DCL/ParcelsService/TeleportController.cs @@ -1,6 +1,9 @@ using Arch.Core; +using Arch.System; using Cysharp.Threading.Tasks; using DCL.Character; +using DCL.Character.Components; +using DCL.CharacterMotion.Components; using Ipfs; using System.Collections.Generic; using System.Threading; @@ -9,11 +12,11 @@ namespace DCL.ParcelsService { - public class TeleportController : ITeleportController + public partial class TeleportController : ITeleportController { private readonly ICharacterObject characterObject; - private IRetrieveScene retrieveScene; + private World world; public TeleportController(ICharacterObject characterObject) { @@ -25,7 +28,12 @@ public void InvalidateRealm() retrieveScene = null; } - public void OnRealmLoaded(IRetrieveScene retrieveScene, World world) + public void OnWorldLoaded(World world) + { + this.world = world; + } + + public void OnRealmLoaded(IRetrieveScene retrieveScene) { this.retrieveScene = retrieveScene; this.retrieveScene.World = world; @@ -76,12 +84,9 @@ public async UniTask TeleportToSceneSpawnPointAsync(Vector2Int parcel, Cancellat else targetPosition = ParcelMathHelper.GetPositionByParcelPosition(parcel); - // Prevent conflict with Interpolation System - // TODO move this to the system - await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate); - characterObject.Move(targetPosition); + AddTeleportIntentQuery(retrieveScene.World, targetPosition); } private static Vector3 GetOffsetFromSpawnPoint(IpfsTypes.SceneMetadata.SpawnPoint spawnPoint) @@ -115,7 +120,14 @@ static float GetMidPoint(float[] coordArray) public void TeleportToParcel(Vector2Int parcel) { Vector3 characterPos = ParcelMathHelper.GetPositionByParcelPosition(parcel); - characterObject.Move(characterPos); + AddTeleportIntentQuery(world, characterPos); + } + + [Query] + [All(typeof(PlayerComponent))] + private void AddTeleportIntent([Data] Vector3 position, in Entity entity) + { + world.Add(entity, new PlayerTeleportIntent(position)); } } } diff --git a/Explorer/Assets/Scripts/Global/Dynamic/DynamicSceneLoader.cs b/Explorer/Assets/Scripts/Global/Dynamic/DynamicSceneLoader.cs index cf2fe1f399..7d7c5efe54 100644 --- a/Explorer/Assets/Scripts/Global/Dynamic/DynamicSceneLoader.cs +++ b/Explorer/Assets/Scripts/Global/Dynamic/DynamicSceneLoader.cs @@ -57,7 +57,7 @@ async UniTaskVoid DisposeAsync() } if (globalWorld != null) - await dynamicWorldContainer.RealmController.DisposeGlobalWorldAsync(globalWorld).SuppressCancellationThrow(); + await dynamicWorldContainer.RealmController.DisposeGlobalWorldAsync().SuppressCancellationThrow(); await UniTask.SwitchToMainThread(); @@ -133,6 +133,8 @@ void SetRealm(string selectedRealm) } realmLauncher.OnRealmSelected += SetRealm; + + dynamicWorldContainer.RealmController.SetupWorld(globalWorld); } catch (OperationCanceledException) { @@ -149,7 +151,7 @@ void SetRealm(string selectedRealm) private async UniTask ChangeRealmAsync(StaticContainer globalContainer, CancellationToken ct, string selectedRealm) { if (globalWorld != null) - await dynamicWorldContainer.RealmController.UnloadCurrentRealmAsync(globalWorld); + await dynamicWorldContainer.RealmController.UnloadCurrentRealmAsync(); await UniTask.SwitchToMainThread(); @@ -158,7 +160,7 @@ private async UniTask ChangeRealmAsync(StaticContainer globalContainer, Cancella globalContainer.CharacterObject.Controller.transform.position = characterPos; - await dynamicWorldContainer.RealmController.SetRealmAsync(globalWorld, URLDomain.FromString(selectedRealm), ct); + await dynamicWorldContainer.RealmController.SetRealmAsync(URLDomain.FromString(selectedRealm), ct); } } } diff --git a/Explorer/Assets/Scripts/Global/Dynamic/IRealmController.cs b/Explorer/Assets/Scripts/Global/Dynamic/IRealmController.cs index 17ae7ee0b3..0526b115c8 100644 --- a/Explorer/Assets/Scripts/Global/Dynamic/IRealmController.cs +++ b/Explorer/Assets/Scripts/Global/Dynamic/IRealmController.cs @@ -6,19 +6,24 @@ namespace Global.Dynamic { public interface IRealmController { + /// + /// Setup the GlobalWorld + /// + void SetupWorld(GlobalWorld world); + /// /// Unload the current realm and load the new one /// - UniTask SetRealmAsync(GlobalWorld globalWorld, URLDomain realm, CancellationToken ct); + UniTask SetRealmAsync(URLDomain realm, CancellationToken ct); /// /// Gracefully unload the current realm /// - UniTask UnloadCurrentRealmAsync(GlobalWorld globalWorld); + UniTask UnloadCurrentRealmAsync(); /// /// Dispose everything on application quit /// - UniTask DisposeGlobalWorldAsync(GlobalWorld globalWorld); + UniTask DisposeGlobalWorldAsync(); } } diff --git a/Explorer/Assets/Scripts/Global/Dynamic/RealmController.cs b/Explorer/Assets/Scripts/Global/Dynamic/RealmController.cs index 7805eebd86..0f34b2e279 100644 --- a/Explorer/Assets/Scripts/Global/Dynamic/RealmController.cs +++ b/Explorer/Assets/Scripts/Global/Dynamic/RealmController.cs @@ -38,6 +38,7 @@ public class RealmController : IRealmController private readonly RetrieveSceneFromFixedRealm retrieveSceneFromFixedRealm; private readonly RetrieveSceneFromVolatileWorld retrieveSceneFromVolatileWorld; private readonly TeleportController teleportController; + private GlobalWorld globalWorld; public RealmController(IWebRequestController webRequestController, TeleportController teleportController, RetrieveSceneFromFixedRealm retrieveSceneFromFixedRealm, RetrieveSceneFromVolatileWorld retrieveSceneFromVolatileWorld, int sceneLoadRadius, IReadOnlyList staticLoadPositions, RealmData realmData) @@ -51,16 +52,22 @@ public RealmController(IWebRequestController webRequestController, TeleportContr this.retrieveSceneFromVolatileWorld = retrieveSceneFromVolatileWorld; } + public void SetupWorld(GlobalWorld globalWorld) + { + this.globalWorld = globalWorld; + teleportController.OnWorldLoaded(globalWorld.EcsWorld); + } + /// /// it is an async process so it should be executed before ECS kicks in /// - public async UniTask SetRealmAsync(GlobalWorld globalWorld, URLDomain realm, CancellationToken ct) + public async UniTask SetRealmAsync(URLDomain realm, CancellationToken ct) { World world = globalWorld.EcsWorld; // Show loading screen - await UnloadCurrentRealmAsync(globalWorld); + await UnloadCurrentRealmAsync(); IpfsTypes.ServerAbout result = await (await webRequestController.GetAsync(new CommonArguments(realm.Append(new URLPath("/about"))), ct, ReportCategory.REALM)) .OverwriteFromJsonAsync(serverAbout, WRJsonParser.Unity); @@ -76,7 +83,7 @@ public async UniTask SetRealmAsync(GlobalWorld globalWorld, URLDomain realm, Can if (!ComplimentWithStaticPointers(world, realmEntity) && !realmComp.ScenesAreFixed) ComplimentWithVolatilePointers(world, realmEntity); - teleportController.OnRealmLoaded(realmData.ScenesAreFixed ? retrieveSceneFromFixedRealm : retrieveSceneFromVolatileWorld, globalWorld.EcsWorld); + teleportController.OnRealmLoaded(realmData.ScenesAreFixed ? retrieveSceneFromFixedRealm : retrieveSceneFromVolatileWorld); // Hide loading screen } @@ -98,7 +105,7 @@ private bool ComplimentWithStaticPointers(World world, Entity realmEntity) return false; } - public async UniTask UnloadCurrentRealmAsync(GlobalWorld globalWorld) + public async UniTask UnloadCurrentRealmAsync() { World world = globalWorld.EcsWorld; @@ -122,7 +129,7 @@ public async UniTask UnloadCurrentRealmAsync(GlobalWorld globalWorld) GC.Collect(); } - public async UniTask DisposeGlobalWorldAsync(GlobalWorld globalWorld) + public async UniTask DisposeGlobalWorldAsync() { World world = globalWorld.EcsWorld; FindLoadedScenes(world);