//State Methods: private void Restore_Enter() { //deserialize previous session: string[] sessionData = PlayerPrefs.GetString(_sessionDataKey).Split('|'); Walls = SerializationUtilities.Deserialize <PlayspaceWall[]>(sessionData[1]); _playspaceCenter = JsonUtility.FromJson <Vector3>(sessionData[2]); PrimaryWall = int.Parse(sessionData[3]); RightWall = int.Parse(sessionData[4]); RearWall = int.Parse(sessionData[5]); LeftWall = int.Parse(sessionData[6]); _playspaceCorners = SerializationUtilities.Deserialize <Vector3[]>(sessionData[7]).ToList <Vector3>(); Height = float.Parse(sessionData[8]); //determine restore success: if (PrimaryWall == -1 || RightWall == -1 || RearWall == -1 || LeftWall == -1) { //something is not right with this room so let's force a reset: PlayerPrefs.DeleteKey(_sessionMeshKey); PlayerPrefs.DeleteKey(_sessionDataKey); Create(); } else { //locate pcf: StartCoroutine("Restore_Relocalize", sessionData[0]); } }
private IEnumerator Restore_Relocalize(string pcfCFUID) { MagicLeapNativeBindings.MLCoordinateFrameUID cfuid = SerializationUtilities.StringToCFUID(pcfCFUID); while (true) { MLPersistentCoordinateFrames.FindPCFByCFUID(cfuid, out pcfAnchor); if (pcfAnchor == null) { //we didn't find the pcf we needed this time: _restoreAttempt++; if (_restoreAttempt < _maxRestoreAttempts) { //retry: Debug.Log($"Previous PCF not located. Trying again. Attempt: {_restoreAttempt}/{_maxRestoreAttempts}"); yield return(new WaitForSeconds(_restoreRetryDelay)); } else { //failed: Debug.Log($"Failed to locate PCF attempt: {_restoreAttempt}/{_maxRestoreAttempts}. Creating new Playspace."); ChangeState(State.FindPCF); yield break; } yield return(null); } else { //deserialize meshes: string[] meshData = PlayerPrefs.GetString(_sessionMeshKey).Split('|'); Vector3[] wallVerts = SerializationUtilities.Deserialize <Vector3[]>(meshData[0]); int[] wallTris = SerializationUtilities.Deserialize <int[]>(meshData[1]); Vector3[] floorVerts = SerializationUtilities.Deserialize <Vector3[]>(meshData[2]); int[] floorTris = SerializationUtilities.Deserialize <int[]>(meshData[3]); Vector3[] ceilingVerts = SerializationUtilities.Deserialize <Vector3[]>(meshData[4]); BuildGeometry(wallVerts, wallTris, floorVerts, floorTris, ceilingVerts); ChangeState(State.ConfirmAreaReload); yield break; } } }