< Summary

Class:DCL.Controllers.ParcelScene
Assembly:DCL.Runtime
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ParcelScene.cs
Covered lines:215
Uncovered lines:38
Coverable lines:253
Total lines:564
Line coverage:84.9% (215 of 253)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ParcelScene()0%110100%
Awake()0%110100%
OnDestroy()0%330100%
OnDisable()0%220100%
Update()0%330100%
SetData(...)0%330100%
OnWorldReposition(...)0%110100%
SetUpdateData(...)0%110100%
InitializeDebugPlane()0%440100%
RemoveDebugPlane()0%6200%
Cleanup(...)0%66095%
ToString()0%12300%
GetSceneName()0%6200%
IsInsideSceneBoundaries(...)0%330100%
IsInsideSceneBoundaries(...)0%3.333066.67%
IsInsideSceneBoundaries(...)0%8.338082.76%
GetEntityById(...)0%2100%
GetSceneTransform()0%110100%
CreateEntity(...)0%440100%
RemoveEntity(...)0%4.014090.91%
CleanUpEntityRecursively(...)0%550100%
RemoveAllEntities(...)0%770100%
RemoveAllEntitiesImmediate()0%110100%
SetEntityParent(...)0%14.7114084.62%
SendMetricsEvent()0%220100%
GetEntityById(...)0%4.594066.67%
GetStateString()0%13.048057.14%
RefreshLoadingState()0%2.032080%
GetWaitingComponentsDebugInfo()0%6200%
CalculateSceneLoadingState()0%4.134080%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ParcelScene.cs

#LineLine coverage
 1using DCL.Components;
 2using DCL.Configuration;
 3using DCL.Helpers;
 4using DCL.Models;
 5using DCL.Controllers.ParcelSceneDebug;
 6using System.Collections.Generic;
 7using DCL.CRDT;
 8using DCL.Interface;
 9using UnityEngine;
 10using UnityEngine.Assertions;
 11
 12namespace DCL.Controllers
 13{
 14    public class ParcelScene : MonoBehaviour, IParcelScene
 15    {
 93016        public Dictionary<long, IDCLEntity> entities { get; private set; } = new Dictionary<long, IDCLEntity>();
 315317        public IECSComponentsManagerLegacy componentsManagerLegacy { get; private set; }
 294818        public LoadParcelScenesMessage.UnityParcelScene sceneData { get; protected set; }
 19
 56420        public HashSet<Vector2Int> parcels = new HashSet<Vector2Int>();
 4921        public ISceneMetricsCounter metricsCounter { get; set; }
 22        public event System.Action<IDCLEntity> OnEntityAdded;
 23        public event System.Action<IDCLEntity> OnEntityRemoved;
 24        public event System.Action<LoadParcelScenesMessage.UnityParcelScene> OnSetData;
 25        public event System.Action<float> OnLoadingStateUpdated;
 26
 14827        public ContentProvider contentProvider { get; set; }
 28
 029        public bool isTestScene { get; set; } = false;
 57530        public bool isPersistent { get; set; } = false;
 031        public float loadingProgress { get; private set; }
 32
 33        [System.NonSerialized]
 34        public string sceneName;
 35
 36        [System.NonSerialized]
 56437        public bool unloadWithDistance = true;
 38
 39        SceneDebugPlane sceneDebugPlane = null;
 40
 41        public SceneLifecycleHandler sceneLifecycleHandler;
 42
 043        public ICRDTExecutor crdtExecutor { get; private set; }
 44
 045        public bool isReleased { get; private set; }
 46
 47        public void Awake()
 48        {
 56449            CommonScriptableObjects.worldOffset.OnChange += OnWorldReposition;
 56450            componentsManagerLegacy = new ECSComponentsManagerLegacy(this);
 56451            sceneLifecycleHandler = new SceneLifecycleHandler(this);
 56452            metricsCounter = new SceneMetricsCounter(DataStore.i.sceneWorldObjects);
 56453            crdtExecutor = new CRDTExecutor(this);
 56454        }
 55
 56        private void OnDestroy()
 57        {
 56458            CommonScriptableObjects.worldOffset.OnChange -= OnWorldReposition;
 56459            metricsCounter?.Dispose();
 56460            crdtExecutor?.Dispose();
 56461        }
 62
 113663        void OnDisable() { metricsCounter?.Disable(); }
 64
 65        private void Update()
 66        {
 1478867            if (sceneLifecycleHandler.state == SceneLifecycleHandler.State.READY
 68                && CommonScriptableObjects.rendererState.Get())
 1415169                SendMetricsEvent();
 1478870        }
 71
 108272        protected virtual string prettyName => sceneData.basePosition.ToString();
 73
 74        public virtual void SetData(LoadParcelScenesMessage.UnityParcelScene data)
 75        {
 55776            Assert.IsTrue( !string.IsNullOrEmpty(data.id), "Scene must have an ID!" );
 77
 55778            this.sceneData = data;
 79
 55780            contentProvider = new ContentProvider();
 55781            contentProvider.baseUrl = data.baseUrl;
 55782            contentProvider.contents = data.contents;
 55783            contentProvider.BakeHashes();
 84
 55785            parcels.Clear();
 86
 226087            for (int i = 0; i < sceneData.parcels.Length; i++)
 88            {
 57389                parcels.Add(sceneData.parcels[i]);
 90            }
 91
 55792            gameObject.transform.position =
 93                PositionUtils.WorldToUnityPosition(Utils.GridToWorldPosition(data.basePosition.x, data.basePosition.y));
 94
 55795            DataStore.i.sceneWorldObjects.AddScene(sceneData.id);
 96
 55797            metricsCounter.Configure(sceneData.id, sceneData.basePosition, sceneData.parcels.Length);
 55798            metricsCounter.Enable();
 99
 557100            OnSetData?.Invoke(data);
 557101        }
 102
 103        void OnWorldReposition(Vector3 current, Vector3 previous)
 104        {
 2105            Vector3 sceneWorldPos = Utils.GridToWorldPosition(sceneData.basePosition.x, sceneData.basePosition.y);
 2106            gameObject.transform.position = PositionUtils.WorldToUnityPosition(sceneWorldPos);
 2107        }
 108
 109        public virtual void SetUpdateData(LoadParcelScenesMessage.UnityParcelScene data)
 110        {
 15111            contentProvider = new ContentProvider();
 15112            contentProvider.baseUrl = data.baseUrl;
 15113            contentProvider.contents = data.contents;
 15114            contentProvider.BakeHashes();
 15115        }
 116
 117        public void InitializeDebugPlane()
 118        {
 403119            if (EnvironmentSettings.DEBUG && sceneData.parcels != null && sceneDebugPlane == null)
 120            {
 401121                sceneDebugPlane = new SceneDebugPlane(sceneData, gameObject.transform);
 122            }
 403123        }
 124
 125        public void RemoveDebugPlane()
 126        {
 0127            if (sceneDebugPlane != null)
 128            {
 0129                sceneDebugPlane.Dispose();
 0130                sceneDebugPlane = null;
 131            }
 0132        }
 133
 134        public void Cleanup(bool immediate)
 135        {
 458136            if (isReleased || gameObject == null)
 0137                return;
 138
 458139            if (sceneDebugPlane != null)
 140            {
 401141                sceneDebugPlane.Dispose();
 401142                sceneDebugPlane = null;
 143            }
 144
 458145            componentsManagerLegacy.DisposeAllSceneComponents();
 146
 458147            if (immediate) //!CommonScriptableObjects.rendererState.Get())
 148            {
 420149                RemoveAllEntitiesImmediate();
 420150                PoolManager.i.Cleanup(true, true);
 420151                DataStore.i.sceneWorldObjects.RemoveScene(sceneData.id);
 420152            }
 153            else
 154            {
 38155                if (entities.Count > 0)
 156                {
 20157                    this.gameObject.transform.position = EnvironmentSettings.MORDOR;
 20158                    this.gameObject.SetActive(false);
 159
 20160                    RemoveAllEntities();
 20161                }
 162                else
 163                {
 18164                    Destroy(this.gameObject);
 18165                    DataStore.i.sceneWorldObjects.RemoveScene(sceneData.id);
 166                }
 167            }
 168
 458169            isReleased = true;
 458170        }
 171
 0172        public override string ToString() { return "Parcel Scene: " + base.ToString() + "\n" + sceneData; }
 173
 174        public string GetSceneName()
 175        {
 0176            return string.IsNullOrEmpty(sceneName) ? "Unnamed" : sceneName;
 177        }
 178
 179        public bool IsInsideSceneBoundaries(Bounds objectBounds)
 180        {
 150181            if (!IsInsideSceneBoundaries(objectBounds.min + CommonScriptableObjects.worldOffset, objectBounds.max.y))
 112182                return false;
 38183            if (!IsInsideSceneBoundaries(objectBounds.max + CommonScriptableObjects.worldOffset, objectBounds.max.y))
 14184                return false;
 185
 24186            return true;
 187        }
 188
 189        public virtual bool IsInsideSceneBoundaries(Vector2Int gridPosition, float height = 0f)
 190        {
 155191            if (parcels.Count == 0)
 0192                return false;
 193
 155194            float heightLimit = metricsCounter.maxCount.sceneHeight;
 195
 155196            if (height > heightLimit)
 0197                return false;
 198
 155199            return parcels.Contains(gridPosition);
 200        }
 201
 202        public virtual bool IsInsideSceneBoundaries(Vector3 worldPosition, float height = 0f)
 203        {
 226204            if (parcels.Count == 0)
 0205                return false;
 206
 226207            float heightLimit = metricsCounter.maxCount.sceneHeight;
 226208            if (height > heightLimit)
 22209                return false;
 210
 204211            int noThresholdZCoordinate = Mathf.FloorToInt(worldPosition.z / ParcelSettings.PARCEL_SIZE);
 204212            int noThresholdXCoordinate = Mathf.FloorToInt(worldPosition.x / ParcelSettings.PARCEL_SIZE);
 213
 214            // We check the target world position
 204215            Vector2Int targetCoordinate = new Vector2Int(noThresholdXCoordinate, noThresholdZCoordinate);
 204216            if (parcels.Contains(targetCoordinate))
 87217                return true;
 218
 219            // We need to check using a threshold from the target point, in order to cover correctly the parcel "border/
 117220            Vector2Int coordinateMin = new Vector2Int();
 117221            coordinateMin.x = Mathf.FloorToInt((worldPosition.x - ParcelSettings.PARCEL_BOUNDARIES_THRESHOLD) / ParcelSe
 117222            coordinateMin.y = Mathf.FloorToInt((worldPosition.z - ParcelSettings.PARCEL_BOUNDARIES_THRESHOLD) / ParcelSe
 223
 117224            Vector2Int coordinateMax = new Vector2Int();
 117225            coordinateMax.x = Mathf.FloorToInt((worldPosition.x + ParcelSettings.PARCEL_BOUNDARIES_THRESHOLD) / ParcelSe
 117226            coordinateMax.y = Mathf.FloorToInt((worldPosition.z + ParcelSettings.PARCEL_BOUNDARIES_THRESHOLD) / ParcelSe
 227
 228            // We check the east/north-threshold position
 117229            targetCoordinate.Set(coordinateMax.x, coordinateMax.y);
 117230            if (parcels.Contains(targetCoordinate))
 0231                return true;
 232
 233            // We check the east/south-threshold position
 117234            targetCoordinate.Set(coordinateMax.x, coordinateMin.y);
 117235            if (parcels.Contains(targetCoordinate))
 0236                return true;
 237
 238            // We check the west/north-threshold position
 117239            targetCoordinate.Set(coordinateMin.x, coordinateMax.y);
 117240            if (parcels.Contains(targetCoordinate))
 0241                return true;
 242
 243            // We check the west/south-threshold position
 117244            targetCoordinate.Set(coordinateMin.x, coordinateMin.y);
 117245            if (parcels.Contains(targetCoordinate))
 0246                return true;
 247
 117248            return false;
 249        }
 250
 0251        public IDCLEntity GetEntityById(string entityId) { throw new System.NotImplementedException(); }
 58252        public Transform GetSceneTransform() { return transform; }
 253
 254        public IDCLEntity CreateEntity(long id)
 255        {
 601256            if (entities.ContainsKey(id))
 257            {
 2258                return entities[id];
 259            }
 260
 599261            var newEntity = new DecentralandEntity();
 599262            newEntity.entityId = id;
 263
 599264            PoolManagerFactory.EnsureEntityPool(false);
 265
 266            // As we know that the pool already exists, we just get one gameobject from it
 599267            PoolableObject po = PoolManager.i.Get(PoolManagerFactory.EMPTY_GO_POOL_NAME);
 268
 599269            newEntity.meshesInfo.innerGameObject = po.gameObject;
 599270            newEntity.gameObject = po.gameObject;
 271
 272#if UNITY_EDITOR
 599273            newEntity.gameObject.name = "ENTITY_" + id;
 274#endif
 599275            newEntity.gameObject.transform.SetParent(gameObject.transform, false);
 599276            newEntity.gameObject.SetActive(true);
 599277            newEntity.scene = this;
 278
 599279            newEntity.OnCleanupEvent += po.OnCleanup;
 280
 599281            if (Environment.i.world.sceneBoundsChecker.enabled)
 446282                newEntity.OnShapeUpdated += Environment.i.world.sceneBoundsChecker.AddEntityToBeChecked;
 283
 599284            entities.Add(id, newEntity);
 285
 599286            DataStore.i.sceneWorldObjects.sceneData[sceneData.id].owners.Add(id);
 287
 599288            OnEntityAdded?.Invoke(newEntity);
 289
 599290            return newEntity;
 291        }
 292
 293        public void RemoveEntity(long id, bool removeImmediatelyFromEntitiesList = true)
 294        {
 520295            if (entities.ContainsKey(id))
 296            {
 520297                IDCLEntity entity = entities[id];
 298
 520299                if (!entity.markedForCleanup)
 300                {
 301                    // This will also cleanup its children
 520302                    CleanUpEntityRecursively(entity, removeImmediatelyFromEntitiesList);
 303                }
 304
 520305                entities.Remove(id);
 306
 520307                var data = DataStore.i.sceneWorldObjects.sceneData;
 308
 520309                if (data.ContainsKey(sceneData.id))
 310                {
 74311                    data[sceneData.id].owners.Remove(id);
 312                }
 74313            }
 314#if UNITY_EDITOR || DEVELOPMENT_BUILD
 315            else
 316            {
 0317                Debug.LogWarning($"Couldn't remove entity with ID: {id} as it doesn't exist.");
 318            }
 319#endif
 446320        }
 321
 322        void CleanUpEntityRecursively(IDCLEntity entity, bool removeImmediatelyFromEntitiesList)
 323        {
 324            // Iterate through all entity children
 528325            using (var iterator = entity.children.GetEnumerator())
 326            {
 536327                while (iterator.MoveNext())
 328                {
 8329                    CleanUpEntityRecursively(iterator.Current.Value, removeImmediatelyFromEntitiesList);
 330                }
 528331            }
 332
 528333            OnEntityRemoved?.Invoke(entity);
 334
 528335            if (Environment.i.world.sceneBoundsChecker.enabled)
 336            {
 443337                entity.OnShapeUpdated -= Environment.i.world.sceneBoundsChecker.AddEntityToBeChecked;
 443338                Environment.i.world.sceneBoundsChecker.RemoveEntityToBeChecked(entity);
 339            }
 340
 528341            if (removeImmediatelyFromEntitiesList)
 342            {
 343                // Every entity ends up being removed through here
 527344                entity.Cleanup();
 527345                entities.Remove(entity.entityId);
 527346            }
 347            else
 348            {
 1349                Environment.i.platform.parcelScenesCleaner.MarkForCleanup(entity);
 350            }
 1351        }
 352
 353        void RemoveAllEntities(bool instant = false)
 354        {
 355            //NOTE(Brian): We need to remove only the rootEntities.
 356            //             If we don't, duplicated entities will get removed when destroying
 357            //             recursively, making this more complicated than it should.
 440358            List<IDCLEntity> rootEntities = new List<IDCLEntity>();
 359
 440360            using (var iterator = entities.GetEnumerator())
 361            {
 949362                while (iterator.MoveNext())
 363                {
 509364                    if (iterator.Current.Value.parent == null)
 365                    {
 502366                        if (instant)
 482367                            rootEntities.Add(iterator.Current.Value);
 368                        else
 20369                            Environment.i.platform.parcelScenesCleaner.MarkRootEntityForCleanup(this, iterator.Current.V
 370                    }
 371                }
 440372            }
 373
 440374            if (instant)
 375            {
 420376                int rootEntitiesCount = rootEntities.Count;
 1804377                for (int i = 0; i < rootEntitiesCount; i++)
 378                {
 482379                    IDCLEntity entity = rootEntities[i];
 482380                    RemoveEntity(entity.entityId, instant);
 381                }
 382
 420383                entities.Clear();
 384
 420385                if (gameObject != null)
 420386                    Destroy(gameObject);
 387            }
 440388        }
 389
 840390        private void RemoveAllEntitiesImmediate() { RemoveAllEntities(instant: true); }
 391
 392        public void SetEntityParent(long entityId, long parentId)
 393        {
 16394            if (entityId == parentId)
 395            {
 0396                return;
 397            }
 398
 16399            IDCLEntity me = GetEntityById(entityId);
 400
 16401            if (me == null)
 0402                return;
 403
 16404            Environment.i.platform.cullingController.MarkDirty();
 16405            Environment.i.platform.physicsSyncController.MarkDirty();
 406
 16407            DataStore_World worldData = DataStore.i.Get<DataStore_World>();
 16408            Transform avatarTransform = worldData.avatarTransform.Get();
 16409            Transform firstPersonCameraTransform = worldData.fpsTransform.Get();
 410
 411            // CONST_THIRD_PERSON_CAMERA_ENTITY_REFERENCE is for compatibility purposes
 16412            if (parentId == (long) SpecialEntityId.FIRST_PERSON_CAMERA_ENTITY_REFERENCE ||
 413                parentId == (long) SpecialEntityId.THIRD_PERSON_CAMERA_ENTITY_REFERENCE)
 414            {
 415
 1416                if (firstPersonCameraTransform == null)
 417                {
 0418                    Debug.LogError("FPS transform is null when trying to set parent! " + sceneData.id);
 0419                    return;
 420                }
 421
 422
 423                // In this case, the entity will attached to the first person camera
 424                // On first person mode, the entity will rotate with the camera. On third person mode, the entity will r
 1425                me.SetParent(null);
 1426                me.gameObject.transform.SetParent(firstPersonCameraTransform, false);
 1427                Environment.i.world.sceneBoundsChecker.RemoveEntityToBeChecked(me);
 1428                Environment.i.world.sceneBoundsChecker.AddPersistent(me);
 1429                return;
 430            }
 431
 15432            if (parentId == (long) SpecialEntityId.AVATAR_ENTITY_REFERENCE ||
 433                parentId == (long) SpecialEntityId
 434                    .AVATAR_POSITION_REFERENCE) // AvatarPositionEntityReference is for compatibility purposes
 435            {
 1436                if (avatarTransform == null)
 437                {
 0438                    Debug.LogError("Avatar transform is null when trying to set parent! " + sceneData.id);
 0439                    return;
 440                }
 441
 442                // In this case, the entity will be attached to the avatar
 443                // It will simply rotate with the avatar, regardless of where the camera is pointing
 1444                me.SetParent(null);
 1445                me.gameObject.transform.SetParent(avatarTransform, false);
 1446                Environment.i.world.sceneBoundsChecker.RemoveEntityToBeChecked(me);
 1447                Environment.i.world.sceneBoundsChecker.AddPersistent(me);
 1448                return;
 449            }
 450
 451            // Remove from persistent checks if it was formerly added as child of avatarTransform or fpsTransform
 14452            if (me.gameObject.transform.parent == avatarTransform ||
 453                me.gameObject.transform.parent == firstPersonCameraTransform)
 454            {
 2455                if (Environment.i.world.sceneBoundsChecker.WasAddedAsPersistent(me))
 2456                    Environment.i.world.sceneBoundsChecker.RemovePersistent(me);
 457            }
 458
 14459            if (parentId == (long) SpecialEntityId.SCENE_ROOT_ENTITY)
 460            {
 461                // The entity will be child of the scene directly
 2462                me.SetParent(null);
 2463                me.gameObject.transform.SetParent(gameObject.transform, false);
 2464            }
 465            else
 466            {
 12467                IDCLEntity myParent = GetEntityById(parentId);
 468
 12469                if (myParent != null)
 470                {
 12471                    me.SetParent(myParent);
 472                }
 473            }
 474
 12475        }
 476
 477        protected virtual void SendMetricsEvent()
 478        {
 14151479            if (Time.frameCount % 10 == 0)
 1394480                metricsCounter.SendEvent();
 14151481        }
 482
 483        public IDCLEntity GetEntityById(long entityId)
 484        {
 948485            if (!entities.TryGetValue(entityId, out IDCLEntity entity))
 486            {
 2487                return null;
 488            }
 489
 490            //NOTE(Brian): This is for removing stray null references? This should never happen.
 491            //             Maybe move to a different 'clean-up' method to make this method have a single responsibility?
 946492            if (entity == null || entity.gameObject == null)
 493            {
 0494                entities.Remove(entityId);
 0495                return null;
 496            }
 497
 946498            return entity;
 499        }
 500
 501        public string GetStateString()
 502        {
 1082503            string baseState = isPersistent ? "global-scene" : "scene";
 1082504            switch (sceneLifecycleHandler.state)
 505            {
 506                case SceneLifecycleHandler.State.NOT_READY:
 0507                    return $"{baseState}:{prettyName} - not ready...";
 508                case SceneLifecycleHandler.State.WAITING_FOR_INIT_MESSAGES:
 557509                    return $"{baseState}:{prettyName} - waiting for init messages...";
 510                case SceneLifecycleHandler.State.WAITING_FOR_COMPONENTS:
 0511                    return $"{baseState}:{prettyName} - {sceneLifecycleHandler.sceneResourcesLoadTracker.GetStateString(
 512                case SceneLifecycleHandler.State.READY:
 525513                    return $"{baseState}:{prettyName} - ready!";
 514            }
 515
 0516            return $"scene:{prettyName} - no state?";
 517        }
 518
 519        public void RefreshLoadingState()
 520        {
 521#if UNITY_STANDALONE || UNITY_EDITOR
 1082522            if (DataStore.i.common.isApplicationQuitting.Get())
 0523                return;
 524#endif
 525
 1082526            CalculateSceneLoadingState();
 527
 528#if UNITY_EDITOR
 1082529            gameObject.name = GetStateString();
 530#endif
 1082531        }
 532
 533        [ContextMenu("Get Waiting Components Debug Info")]
 534        public void GetWaitingComponentsDebugInfo()
 535        {
 0536            switch (sceneLifecycleHandler.state)
 537            {
 538                case SceneLifecycleHandler.State.WAITING_FOR_COMPONENTS:
 0539                    sceneLifecycleHandler.sceneResourcesLoadTracker.PrintWaitingResourcesDebugInfo();
 0540                    break;
 541
 542                default:
 0543                    Debug.Log("This scene is not waiting for any components. Its current state is " + sceneLifecycleHand
 544                    break;
 545            }
 0546        }
 547
 548        /// <summary>
 549        /// Calculates the current loading progress of the scene and raise the event OnLoadingStateUpdated with the perc
 550        /// </summary>
 551        public void CalculateSceneLoadingState()
 552        {
 1082553            loadingProgress = 0f;
 554
 1082555            if (sceneLifecycleHandler.state == SceneLifecycleHandler.State.WAITING_FOR_COMPONENTS ||
 556                sceneLifecycleHandler.state == SceneLifecycleHandler.State.READY)
 557            {
 525558                loadingProgress = sceneLifecycleHandler.loadingProgress;
 559            }
 560
 1082561            OnLoadingStateUpdated?.Invoke(loadingProgress);
 0562        }
 563    }
 564}

Methods/Properties

entities()
entities(System.Collections.Generic.Dictionary[Int64,IDCLEntity])
ParcelScene()
componentsManagerLegacy()
componentsManagerLegacy(DCL.IECSComponentsManagerLegacy)
sceneData()
sceneData(DCL.Models.LoadParcelScenesMessage/UnityParcelScene)
metricsCounter()
metricsCounter(DCL.ISceneMetricsCounter)
contentProvider()
contentProvider(DCL.ContentProvider)
isTestScene()
isTestScene(System.Boolean)
isPersistent()
isPersistent(System.Boolean)
loadingProgress()
loadingProgress(System.Single)
crdtExecutor()
crdtExecutor(DCL.CRDT.ICRDTExecutor)
isReleased()
isReleased(System.Boolean)
Awake()
OnDestroy()
OnDisable()
Update()
prettyName()
SetData(DCL.Models.LoadParcelScenesMessage/UnityParcelScene)
OnWorldReposition(UnityEngine.Vector3, UnityEngine.Vector3)
SetUpdateData(DCL.Models.LoadParcelScenesMessage/UnityParcelScene)
InitializeDebugPlane()
RemoveDebugPlane()
Cleanup(System.Boolean)
ToString()
GetSceneName()
IsInsideSceneBoundaries(UnityEngine.Bounds)
IsInsideSceneBoundaries(UnityEngine.Vector2Int, System.Single)
IsInsideSceneBoundaries(UnityEngine.Vector3, System.Single)
GetEntityById(System.String)
GetSceneTransform()
CreateEntity(System.Int64)
RemoveEntity(System.Int64, System.Boolean)
CleanUpEntityRecursively(DCL.Models.IDCLEntity, System.Boolean)
RemoveAllEntities(System.Boolean)
RemoveAllEntitiesImmediate()
SetEntityParent(System.Int64, System.Int64)
SendMetricsEvent()
GetEntityById(System.Int64)
GetStateString()
RefreshLoadingState()
GetWaitingComponentsDebugInfo()
CalculateSceneLoadingState()