public static bool MarkDynamicObjectAsDestroyed(Either <DynamicObject, DynamicObjectSave> dynamicObject, string sceneName)
        {
            string id = dynamicObject.Match(
                dynamicObj => dynamicObj.ID,
                dynamicObjSave => dynamicObjSave.ID
                );

            if (!allDynamicObjectRecords.ContainsKey(id))
            {
                Debug.LogError($"Trying to mark DynamicObject {dynamicObject} as destroyed, but allDynamicObjectRecords contains no entry for {id}");
                return(false);
            }

            if (allDynamicObjectRecords[id].sceneName != sceneName)
            {
                Debug.LogError($"Trying to mark DynamicObject {dynamicObject} in scene {sceneName} as destroyed, but existing entry for id {id} is in a different scene: {allDynamicObjectRecords[id].sceneName}");
                return(false);
            }

            DynamicObjectRecord record = allDynamicObjectRecords[id];

            record.isDestroyed          = true;
            allDynamicObjectRecords[id] = record;
            return(true);
        }
        public static bool ChangeDynamicObjectScene(DynamicObject dynamicObject, string newScene)
        {
            string id = dynamicObject.ID;

            if (!allDynamicObjectRecords.ContainsKey(id))
            {
                Debug.LogError($"Trying to change scene for DynamicObject {dynamicObject}, but there is no entry for id {id}");
                return(false);
            }

            if (allDynamicObjectRecords[id].sceneName == newScene)
            {
                Debug.LogWarning($"Trying to change scene for DynamicObject {dynamicObject}, but existing entry for id {id} is already in {newScene}. Nothing to do.");
                return(true);
            }

            DynamicObjectRecord record = allDynamicObjectRecords[id];

            record.sceneName            = newScene;
            allDynamicObjectRecords[id] = record;
            return(true);
        }