// todo figure out a way to call messages on all objects... // so we can get actorstate.GameValue("Health") for instance... public static ObjectLoadState AddNewObject(PrefabReference prefabRef, string scene, Vector3 pos, Quaternion rot, bool permanent, out object obj, out string id) { bool sceneIsLoaded = SceneLoading.currentLoadedScenes.Contains(scene); id = GetNewGUID(); DynamicObjectState objectState = new DynamicObjectState(id, scene, prefabRef, permanent); id2ObjectState.Add(id, objectState); if (sceneIsLoaded) { DynamicObject dynamicObject = GetAvailableInstance(prefabRef, pos, rot, id, false, false, false); MoveDynamicObjectToTransform(dynamicObject, pos, rot.eulerAngles, false); dynamicObject.AdjustState(objectState, scene, pos, rot.eulerAngles, false); obj = dynamicObject; } // add an unloaded representation, instantiate later when the scene is loaded else { if (!prefabRef.isEmpty) { DynamicObject basePrefab = PrefabReferenceCollection.GetPrefabReference <DynamicObject>(prefabRef); obj = basePrefab.AdjustState(objectState, scene, pos, rot.eulerAngles, true); } else { obj = objectState; } } return(objectState.isLoaded ? ObjectLoadState.Loaded : ObjectLoadState.Unloaded); }
static void MoveObject(ObjectLoadState state, object obj, string scene, MiniTransform target) { bool sceneIsLoaded = SceneLoading.currentLoadedScenes.Contains(scene); if (state == ObjectLoadState.Loaded) { DynamicObject dynamicObject = (DynamicObject)obj; // moving loaded DO to a scene and position thats already loaded if (sceneIsLoaded) { MoveDynamicObjectToTransform(dynamicObject, target.position, target.rotation, false); } // moving loaded DO to an unloaded scene/position else { if (dynamicObject.isPlayer) { MovePlayerToUnloadedScene(scene, target); } else { DynamicObjectState objState = GetStateByID(dynamicObject.GetID()); dynamicObject.AdjustState(objState, scene, target.position, target.rotation, false); objState.loadedVersion = null; // give to pool again dynamicObject.gameObject.SetActive(false); } } } else if (state == ObjectLoadState.Unloaded) { DynamicObjectState objState = (DynamicObjectState)obj; if (objState.id == alias2ID[PLAYER_ALIAS]) { Debug.Log("Cant Move Player When Player Is Unloaded..."); return; } objState.scene = scene; objState.position = target.position; objState.rotation = target.rotation; objState.isUntouched = false; //moving an unloaded object to a loaded scene if (sceneIsLoaded) { LoadNewDynamicObjectWithState(objState, false); } } }
public static DynamicObject GetAvailableInstance(DynamicObject prefab, Vector3 position, Quaternion rotation, string gUID, bool createState, bool createID, bool permanentState) { DynamicObject inst = pool.GetAvailable(prefab, null, true, position, rotation, DynamicObject.onPoolCreateAction, null); if (createID) { gUID = GetNewGUID(); } inst.SetID(gUID); if (createState) { DynamicObjectState objectState = new DynamicObjectState(gUID, null, inst.prefabRef, permanentState); id2ObjectState.Add(gUID, objectState); inst.AdjustState(objectState, null, position, rotation.eulerAngles, false); } return(inst); }
void GetObjectStatesInScene(string scene, bool isUnloading, bool justDisable) { // get all the loaded objects in the current scene, that are active and available // (for instance an equipped item is not considered available, that shold be saved by the inventory component...) List <DynamicObject> dynamicObjects = FilterObjectsForScene(scene, DynamicObject.GetInstancesAvailableForLoad()); if (dynamicObjects.Count > 0) { // teh list of saved objects to populate for (int i = 0; i < dynamicObjects.Count; i++) { DynamicObject dynamicObject = dynamicObjects[i]; if (!justDisable) { DynamicObjectState state = GetStateByID(dynamicObject.GetID()); if (state != null) { dynamicObject.AdjustState(state, scene, dynamicObject.transform.position, dynamicObject.transform.rotation.eulerAngles, false); if (isUnloading) { state.loadedVersion = null; } } } // TODO: add prevent disable on scene transfer (e.g. companions following...) // disabling the scene our object is in // give to pool again (if disabling scene) if (isUnloading) { dynamicObject.gameObject.SetActive(false); } } } }