public void LoadMap(Dictionary <string, SceneGameObject> loadedData) { CreateRoot(); Dictionary <string, SceneGameObject> parentsGO = new Dictionary <string, SceneGameObject>(); Dictionary <string, List <SceneGameObject> > childsGO = new Dictionary <string, List <SceneGameObject> >(); foreach (var item in loadedData) { SceneGameObject prefabElement = item.Value; GameObject prefabElementGO = null; SceneObject prefabElementSO = SessionManager.Instance.sceneObjects.GetObject(prefabElement.data.sceneObjectGUID); if (prefabElementSO == null) { Debug.LogWarning("Broken prefab!!!"); continue; } prefabElementGO = prefabElementSO.GetPreviewGameObject(); SceneGameObject prefabElementSCGO = prefabElementGO.GetComponent <SceneGameObject>(); if (prefabElementSCGO == null) { prefabElementSCGO = prefabElementGO.AddComponent <SceneGameObject>(); } prefabElementSCGO.sceneObject = prefabElementSO; SceneGameObjectData prefabElementInstanceData = prefabElement.data; prefabElementInstanceData.childs = new List <string>(); prefabElementInstanceData.parent = ""; prefabElementSCGO.LoadFromData(prefabElementInstanceData); if (childsGO.ContainsKey(prefabElement.data.id)) { List <SceneGameObject> childsOfElement = childsGO[prefabElement.data.id]; foreach (SceneGameObject childOfElement in childsOfElement) { childOfElement.transform.SetParent(prefabElementGO.transform); childOfElement.RestoreTransform(); prefabElementSCGO.HoldItem(childOfElement, false); childOfElement.data.parent = prefabElementSCGO.data.id; prefabElementSCGO.data.childs.Add(childOfElement.data.id); } childsGO.Remove(prefabElement.data.id); } if (string.IsNullOrEmpty(prefabElement.data.parent)) { prefabElementGO.transform.SetParent(items.transform); prefabElementSCGO.RestoreTransform(); } else if (parentsGO.ContainsKey(prefabElement.data.parent)) { SceneGameObject parent = parentsGO[prefabElement.data.parent]; parent.data.childs.Add(prefabElementSCGO.data.id); prefabElementSCGO.data.parent = parent.data.id; prefabElementSCGO.transform.SetParent(parent.transform); prefabElementSCGO.RestoreTransform(); parent.HoldItem(prefabElementSCGO, false); } else { if (childsGO.ContainsKey(prefabElement.data.parent)) { List <SceneGameObject> parentChilds = childsGO[prefabElement.data.parent]; parentChilds.Add(prefabElementSCGO); childsGO[prefabElement.data.parent] = parentChilds; } else { List <SceneGameObject> parentChilds = new List <SceneGameObject>() { prefabElementSCGO }; childsGO.Add(prefabElement.data.parent, parentChilds); } } SessionManager.Instance.AddSceneGameObject(prefabElementSCGO); parentsGO.Add(prefabElement.data.id, prefabElementSCGO); } }
private void PlaceObject() { if (current == null) { return; } if (previewGO == null) { previewGO = current.GetPreviewGameObject(); previewGO.transform.localRotation = Quaternion.Euler(lastRotation); previewSceneGameObject = previewGO.GetComponent <SceneGameObject>(); if (previewSceneGameObject == null) { previewSceneGameObject = previewGO.AddComponent <SceneGameObject>(); } previewSceneGameObject.isPlacingMode = true; currentObjectLayer = previewGO.layer; previewGO.RunOnChildrenRecursive((GameObject g) => { g.layer = placementLayer; }); } if (Input.GetKeyDown(KeyCode.Q)) { previewGO.transform.Rotate(new Vector3(0, 1, 0), 90); } if (Input.GetKeyDown(KeyCode.E)) { previewGO.transform.Rotate(new Vector3(0, 1, 0), -90); } if (Input.GetKeyDown(KeyCode.Escape)) { ResetCurrent(true); return; } if (TryRaycastFromScreen(current.GetLayerMask(), out RaycastHit hit)) { Transform objectHit = hit.transform; Vector3 hitPointOnPlane = hit.point; float x = hitPointOnPlane.x - hitPointOnPlane.x % gridSize; float z = hitPointOnPlane.z - hitPointOnPlane.z % gridSize; float y = hitPointOnPlane.y - hitPointOnPlane.y % gridSize; previewGO.transform.position = hitPointOnPlane; SceneGameObject sco = objectHit.GetComponentInParent <SceneGameObject>(); if (sco != null) { if (sco.CanHoldItem(previewSceneGameObject)) { previewGO.SetActive(false); SessionManager.Instance.SetSelected(sco.data.id); } } else { previewGO.SetActive(true); SessionManager.Instance.SetSelected(null); } if (Input.GetMouseButtonDown(0) && (!previewSceneGameObject.isColliding || sco != null)) { Transform p = sco != null ? sco.transform : items.transform; previewGO.transform.parent = p; previewGO.RunOnChildrenRecursive((GameObject g) => { g.layer = currentObjectLayer; }); previewSceneGameObject.isPlacingMode = false; lastRotation = previewSceneGameObject.transform.localRotation.eulerAngles; SceneGameObject instanced = current.Instantiate(p, previewGO.transform.localPosition, previewGO.transform.localRotation); SessionManager.Instance.AddSceneGameObject(instanced); if (sco != null) { sco.HoldItem(instanced); } Destroy(previewGO); previewGO = null; } } }
public GameObject CraftPrefab(Transform rootParent) { SceneGameObject root = null; Dictionary <string, SceneGameObject> parentsGO = new Dictionary <string, SceneGameObject>(); Dictionary <string, List <SceneGameObject> > childsGO = new Dictionary <string, List <SceneGameObject> >(); foreach (SceneGameObject prefabElement in prefab.prefabObjects) { GameObject prefabElementGO = null; SceneObject prefabElementSO = SessionManager.Instance.sceneObjects.GetObject(prefabElement.data.sceneObjectGUID); if (prefabElementSO == null) { Debug.LogWarning("Broken prefab!!!"); continue; } prefabElementGO = prefabElementSO.GetPreviewGameObject(); SceneGameObject prefabElementSCGO = prefabElementGO.GetComponent <SceneGameObject>(); if (prefabElementSCGO == null) { prefabElementSCGO = prefabElementGO.AddComponent <SceneGameObject>(); } prefabElementSCGO.sceneObject = prefabElementSO; SceneGameObjectData prefabElementInstanceData = prefabElement.data; prefabElementInstanceData.id = prefabElementSO.name + Guid.NewGuid().ToString(); prefabElementInstanceData.childs = new List <string>(); prefabElementInstanceData.parent = ""; prefabElementSCGO.LoadFromData(prefabElementInstanceData); if (childsGO.ContainsKey(prefabElement.data.id)) { List <SceneGameObject> childsOfElement = childsGO[prefabElement.data.id]; foreach (SceneGameObject childOfElement in childsOfElement) { childOfElement.transform.SetParent(prefabElementGO.transform); childOfElement.RestoreTransform(); prefabElementSCGO.HoldItem(childOfElement); childOfElement.data.parent = prefabElementSCGO.data.id; prefabElementSCGO.data.childs.Add(childOfElement.data.id); } childsGO.Remove(prefabElement.data.id); } if (prefabElement.data.id == prefab.root) { root = prefabElementSCGO; this.sceneGameObject.canBePlacedOver = prefabElementSO.GetLayerMask(); } else if (parentsGO.ContainsKey(prefabElement.data.parent)) { SceneGameObject parent = parentsGO[prefabElement.data.parent]; parent.data.childs.Add(prefabElementSCGO.data.id); prefabElementSCGO.data.parent = parent.data.id; prefabElementSCGO.transform.SetParent(parent.transform); prefabElementSCGO.RestoreTransform(); parent.HoldItem(prefabElementSCGO); } else { if (childsGO.ContainsKey(prefabElement.data.parent)) { List <SceneGameObject> parentChilds = childsGO[prefabElement.data.parent]; parentChilds.Add(prefabElementSCGO); childsGO[prefabElement.data.parent] = parentChilds; } else { List <SceneGameObject> parentChilds = new List <SceneGameObject>() { prefabElementSCGO }; childsGO.Add(prefabElement.data.parent, parentChilds); } } parentsGO.Add(prefabElement.data.id, prefabElementSCGO); } if (rootParent != null) { root.transform.SetParent(rootParent); root.RestoreTransform(); } return(root.gameObject); }