private void ConstructLevel()
    {
        LevelAsset myTarget = (LevelAsset)target;

        rootContainer = new GameObject();
        rootContainer.transform.position = new Vector3(0, 0, 0);

        cameraGameObject = new GameObject();
        cameraGameObject.transform.position = new Vector3(0, 0, -100);
        var camera = cameraGameObject.AddComponent <Camera> ();

        cameraGameObject.hideFlags = HideFlags.HideAndDontSave;
        camera.orthographic        = true;
        camera.clearFlags          = CameraClearFlags.Color;
        camera.backgroundColor     = windowBackgroundColor;
        editorRenderTexture        = Resources.Load("EditorRenderTexture") as RenderTexture;
        camera.targetTexture       = editorRenderTexture;

        levelEditorNode        = Resources.Load("LevelEditorNode") as GameObject;
        levelEditorPuzzlePivot = Resources.Load("levelEditorPuzzlePivot") as GameObject;

        nodeAssetDictionary = LevelAssetHelper.ConstructDictionary(myTarget.subPuzzleNodes);
        nodeDictionary      = new Dictionary <string, LevelEditorNode>();
        var rootNode = nodeAssetDictionary [""][0];

        SpawnNode(rootNode, new Vector2(0, 4));

        LevelEditorNode selectedNode;

        if (!string.IsNullOrEmpty(selectableNodeId))
        {
            nodeDictionary.TryGetValue(selectableNodeId, out selectedNode);
            if (selectedNode != null)
            {
                var pivot        = selectedNode.puzzlePivots [selectablePuzzlePivotId];
                var renderer     = pivot.GetComponent <MeshRenderer> ();
                var tempMaterial = new Material(renderer.sharedMaterial);
                tempMaterial.color      = Color.green;
                renderer.sharedMaterial = tempMaterial;
            }
        }
    }
Beispiel #2
0
    void Start()
    {
        if (Director.Instance.IsAlternativeLevel)
        {
            additionalPieces = 1;
        }
        if (levelOverride == null)
        {
            level = Director.LevelDatabase.levels [Director.Instance.LevelIndex];
        }
        else
        {
            level = levelOverride;
        }

        numberOfPieces = level.numberOfPieces + new Vector2(additionalPieces, additionalPieces);

        ZoomScale = numberOfPieces.x;

        startScale          = transform.localScale;
        nodeAssetDictionary = LevelAssetHelper.ConstructDictionary(level.subPuzzleNodes);

        StartCoroutine(SpawnInitialSubPuzzle());
    }
Beispiel #3
0
    private IEnumerator SpawnExtraPivots(GameObject pivot, int numberOfPivots)
    {
        var newPuzzlePivots = new List <PuzzlePivot>();

        for (int i = 0; i < numberOfPivots; i++)
        {
            var additionalPieces = 0;
            if (Director.Instance.IsAlternativeLevel)
            {
                additionalPieces = 1;
            }
            var numberOfPieces = nodeAsset.puzzlePivots[i].numberOfPieces + new Vector2(1, 1) * additionalPieces;

            var newPuzzlePivot = SpawnExtraPivot(pivot, nodeAsset.puzzlePivots[i].type, numberOfPieces);



            newPuzzlePivot.subPuzzle = this;
            newPuzzlePivots.Add(newPuzzlePivot);

            if (nodeAsset.collectable.isActive && i == numberOfPivots - 1)
            {
                collectableHelper.SpawnCollectable(newPuzzlePivot, nodeAsset.collectable.position, nodeAsset.collectable.scale);
            }
        }

        // Wait 3 frames
        for (int i = 0; i < 3; i++)
        {
            yield return(null);
        }

        foreach (var newPuzzlePivot in newPuzzlePivots)
        {
            yield return(SetupExtraPivot(newPuzzlePivot));

            yield return(null);
        }

        var childrenNodes = LevelAssetHelper.GetChildrenNodes(gameBoard.nodeAssetDictionary, id);

        if (childrenNodes.Count > 0)
        {
            var newSubPuzzleLayer = subPuzzleLayer + 1;
            ArrangePiecePosition(activePuzzlePivot.pieces);
            gameBoard.ZoomToLayer(newSubPuzzleLayer);

            int n = 0;
            foreach (var childrenNode in childrenNodes)
            {
                var piece       = activePuzzlePivot.pieces[n];
                var scale       = 4;
                var aspectRatio = piece.transform.localScale.y / piece.transform.localScale.x;
                var pictureSize = new Vector2(scale, scale * aspectRatio);

                var subPuzzle = GameObject.Instantiate(gameBoard.subPuzzlePrefab).GetComponent <SubPuzzle> ();
                subPuzzle.Initialize(gameBoard, childrenNode.id, newSubPuzzleLayer, pictureSize);
                subPuzzle.transform.parent        = piece.transform.parent;
                subPuzzle.transform.localPosition = piece.transform.localPosition;
                subPuzzle.parentSubPuzzle         = this;
                subPuzzle.SpawnSubPuzzle();
                subPuzzle.ActivateSubPuzzle();
                subPuzzle.completedSubPuzzle += () => {
                    piece.gameObject.SetActive(true);

                    if (AlllSubPuzzlesComplete())
                    {
                        backgroundQuad.GetComponent <MeshRenderer> ().enabled = true;
                    }
                    SetActiveSubPuzzle(subPuzzle);
                };
                subPuzzles.Add(subPuzzle);
                n++;
            }

            // Wait 3 frames
            for (int i = 0; i < 3; i++)
            {
                yield return(null);
            }
            for (int i = 0; i < n; i++)
            {
                activePuzzlePivot.pieces[i].gameObject.SetActive(false);
            }
            backgroundQuad.GetComponent <MeshRenderer> ().enabled = false;


            var camera = GameObject.Find("CameraPivot/Main Camera");
            var newPos = camera.transform.position - subPuzzles [0].gameObject.transform.position;
            newPos.z = 0;
            gameBoard.transform.position += newPos;
            SetActiveSubPuzzle(subPuzzles [0], false);
        }
    }
    public override void OnInspectorGUI()
    {
        if (EditorApplication.isPlaying)
        {
            return;
        }
        bool       reconstruct = false;
        LevelAsset myTarget    = (LevelAsset)target;

        var editorModeCached = editorMode;

        string[] editorModeOptions = { "Select", "Add" };
        if (GUILayout.Button("Play Level"))
        {
            DestroyLevel();
            EditorApplication.isPlaying = false;
            EditorSceneManager.OpenScene("Assets/Scenes/LevelScene.unity");
            var gameBoard = GameObject.Find("GameBoard").GetComponent <GameBoard> ();
            gameBoard.levelOverride     = myTarget;
            EditorApplication.isPlaying = true;
        }
        myTarget.isMasterPuzzle = EditorGUILayout.Toggle("IsMasterPuzzle:", myTarget.isMasterPuzzle);
        editorMode       = (EditorMode)EditorGUILayout.Popup("Mode", (int)editorMode, editorModeOptions);
        myTarget.picture = EditorGUILayout.ObjectField("GoalTexture", myTarget.picture, typeof(Texture), false) as Texture;
        if (GUILayout.Button("Clear Nodes"))
        {
            myTarget.subPuzzleNodes.Clear();
            myTarget.subPuzzleNodes.Add(new LevelAsset.SubPuzzleNode("0"));
            reconstruct = true;
        }

        if (editorModeCached != editorMode)
        {
            reconstruct = true;
        }

        if (cameraGameObject != null)
        {
            EditorGUI.DrawPreviewTexture(new Rect(0 + windowOffset.x, 0 + windowOffset.y, windowSize.x, windowSize.y), editorRenderTexture);
        }

        var selectionId = "0";

        if (editorMode == EditorMode.Select && !string.IsNullOrEmpty(selectableNodeId))
        {
            selectionId = selectableNodeId;
        }
        if (!string.IsNullOrEmpty(selectableNodeId))
        {
            EditorGUILayout.BeginVertical();
            GUILayout.Space(windowOffset.y + windowSize.y);

            var selectedNodeAsset = LevelAssetHelper.GetNodeAsset(nodeAssetDictionary, selectableNodeId);
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("SelectionId:");
            EditorGUILayout.LabelField(selectionId);
            EditorGUILayout.EndHorizontal();

            var puzzlePivotAsset = selectedNodeAsset.puzzlePivots [selectablePuzzlePivotId];
            puzzlePivotAsset.numberOfPieces        = EditorGUILayout.Vector2Field("Number of Pieces:", puzzlePivotAsset.numberOfPieces);
            puzzlePivotAsset.type                  = (PuzzlePivotType)EditorGUILayout.EnumPopup("Type:", puzzlePivotAsset.type);
            selectedNodeAsset.collectable.isActive = EditorGUILayout.Toggle("Has Collectable:", selectedNodeAsset.collectable.isActive);
            if (selectedNodeAsset.collectable.isActive)
            {
                selectedNodeAsset.collectable.position = EditorGUILayout.Vector2Field("Position of collectable:", selectedNodeAsset.collectable.position);
                selectedNodeAsset.collectable.scale    = EditorGUILayout.Vector2Field("Scale of collectable:", selectedNodeAsset.collectable.scale);
            }

            EditorGUILayout.EndVertical();
            if (GUILayout.Button("Add PuzzlePivot"))
            {
                selectedNodeAsset.puzzlePivots.Add(new LevelAsset.PuzzlePivot());
                reconstruct = true;
            }
            if (GUILayout.Button("Add Node"))
            {
                myTarget.subPuzzleNodes.Add(new LevelAsset.SubPuzzleNode(selectedNodeAsset.id + "-" + LevelAssetHelper.GetChildrenNodes(nodeAssetDictionary, selectedNodeAsset.id).Count));
                reconstruct = true;
            }
        }

        var tmpMousePos = Event.current.mousePosition;

        tmpMousePos -= windowOffset;
        tmpMousePos -= windowSize * 0.5f;
        if (Event.current.type == EventType.MouseDown && IsPositionWithinWindow(Event.current.mousePosition))
        {
            if (editorMode == EditorMode.Select)
            {
                var mousePosInWindow = new Vector3(tmpMousePos.x / 50, -tmpMousePos.y / 50, 0);
                var hits             = Physics.RaycastAll(cameraGameObject.transform.position + mousePosInWindow, Vector3.forward, 200);
                selectableNodeId = String.Empty;
                if (hits.Length > 0)
                {
                    if (hits [0].collider.gameObject.GetComponent <LevelEditorNode> () != null)
                    {
                        selectableNodeId = hits[0].collider.gameObject.GetComponent <LevelEditorNode>().nodeId;
                    }
                    if (hits [0].collider.gameObject.GetComponent <LevelEditorPuzzlePivot> () != null)
                    {
                        var levelEditorPuzzlePivot = hits [0].collider.gameObject.GetComponent <LevelEditorPuzzlePivot> ();
                        selectableNodeId        = levelEditorPuzzlePivot.parent.nodeId;
                        selectablePuzzlePivotId = levelEditorPuzzlePivot.parent.puzzlePivots.IndexOf(levelEditorPuzzlePivot);
                    }
                }
                reconstruct = true;
            }
        }

        if (Event.current.button == 2)
        {
            if (Event.current.type == EventType.MouseDown)
            {
                mousePos = Event.current.mousePosition;
            }
            if (Event.current.type == EventType.MouseDrag)
            {
                var mouseDir = (mousePos - Event.current.mousePosition) * 0.02f;
                cameraGameObject.transform.position += new Vector3(mouseDir.x, -mouseDir.y, 0);
                mousePos = Event.current.mousePosition;
            }
        }

        if (reconstruct)
        {
            DestroyLevel();
            ConstructLevel();
        }

        EditorUtility.SetDirty(myTarget);
    }