示例#1
0
    void CreateNewSubMesh(LevelBase originalLevelBase, LevelCreatorUtils.WallsBounds roomWallbounds, Vector3 pDirection)
    {
        LevelBase subMesh = Instantiate(levelBasePrefab);

        AddNewObject(subMesh.gameObject);
        subMesh.transform.position = originalLevelBase.transform.position;

        float zOffset = 0;

        LevelCreatorUtils.WallsBounds originalBounds = LevelCreatorUtils.BoxColliderToWallbounds(originalLevelBase.transform.position, originalLevelBase.GetComponent <BoxCollider>());
        float xScale = originalLevelBase.transform.localScale.x;
        float zScale = originalLevelBase.transform.localScale.z;

        if (pDirection.x != 0)
        {
            xScale = pDirection.x == 1 ? originalBounds.maxWallsX - roomWallbounds.maxWallsX : originalBounds.minWallsX - roomWallbounds.minWallsX;
            float topReduction    = 0;
            float bottomReduction = 0;
            //Delete top scale
            if (roomWallbounds.maxWallsZ < originalBounds.maxWallsZ)
            {
                topReduction = originalBounds.maxWallsZ - roomWallbounds.maxWallsZ;
            }
            //Delete bottom
            if (roomWallbounds.minWallsZ > originalBounds.minWallsZ)
            {
                bottomReduction = roomWallbounds.minWallsZ - originalBounds.minWallsZ;
            }
            zScale -= (topReduction + bottomReduction);
            //set to correct z pos
            if (originalBounds.maxWallsZ > roomWallbounds.maxWallsZ)
            {
                zOffset -= (originalBounds.maxWallsZ - roomWallbounds.maxWallsZ) / 2;
            }
            if (roomWallbounds.minWallsZ > originalBounds.minWallsZ)
            {
                zOffset += (roomWallbounds.minWallsZ - originalBounds.minWallsZ) / 2;
            }

            //zOffset = (((originalBounds.maxWallsZ - pUpdatedRoom.wallBounds.maxWallsZ) / 2) - ((pUpdatedRoom.wallBounds.minWallsZ - originalBounds.minWallsZ) / 2)) * -1;
            subMesh.transform.position = new Vector3(roomWallbounds.center.x, 0, originalLevelBase.transform.position.z + zOffset);
        }
        else
        {
            zScale = pDirection.z == 1 ? originalBounds.maxWallsZ - roomWallbounds.maxWallsZ : originalBounds.minWallsZ - roomWallbounds.minWallsZ;
            subMesh.transform.position = new Vector3(originalLevelBase.transform.position.x, 0, roomWallbounds.center.z);
        }
        subMesh.transform.localScale = new Vector3(Mathf.Abs(xScale), levelCreatorInfo.wallHeight, Mathf.Abs(zScale));

        subMesh.transform.position += new Vector3(((subMesh.transform.localScale.x / 2 + (roomWallbounds.maxWallsX - roomWallbounds.minWallsX) / 2) * pDirection.x),
                                                  0,
                                                  ((subMesh.transform.localScale.z / 2 + (roomWallbounds.maxWallsZ - roomWallbounds.minWallsZ) / 2) * pDirection.z));
        newLevelBases.Add(subMesh);
        subMesh.transform.parent = levelBaseMain.transform;
    }
示例#2
0
    public void ConfirmDoorPlacement()
    {
        tempUndoList = new Dictionary <GameObject, UndoRedoState>();
        Vector3 leftWallPos  = doorBeingMade.transform.Find("WallSideLeft").position;
        Vector3 rightWallPos = doorBeingMade.transform.Find("WallSideRight").position;

        doors.Add(doorBeingMade);
        AddNewObject(doorBeingMade.gameObject);
        if (doorDirection.x != 0)
        {
            LevelBase topWall    = Instantiate(levelBasePrefab);
            LevelBase bottomWall = Instantiate(levelBasePrefab);

            AddNewObject(topWall.gameObject);
            AddNewObject(bottomWall.gameObject);
            //Create top mesh to max
            float topScale    = Mathf.Abs(levelCreatorInfo.baseLenght / 2 - leftWallPos.z);
            float bottomScale = Mathf.Abs(rightWallPos.z - levelCreatorInfo.baseLenght / 2);
            topWall.transform.localScale    = new Vector3(1, levelCreatorInfo.wallHeight, topScale);
            bottomWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, bottomScale);
            topWall.transform.position      = doorBeingMade.transform.position + new Vector3(0, 0, topWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2);
            bottomWall.transform.position   = doorBeingMade.transform.position - new Vector3(0, 0, bottomWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2);

            BoxCollider firstBoxcollider    = topWall.GetComponent <BoxCollider>();
            BoxCollider secondBoxCollider   = bottomWall.GetComponent <BoxCollider>();
            float       firstSmallestScale  = topWall.transform.localScale.z;
            float       secondSmallestScale = bottomWall.transform.localScale.z;
            for (int i = 0; i < levelBases.Count; i++)
            {
                BoxCollider levelBaseBoxCollider = levelBases[i].GetComponent <BoxCollider>();
                LevelCreatorUtils.WallsBounds levelBaseBounds = LevelCreatorUtils.BoxColliderToWallbounds(levelBases[i].transform.position, levelBaseBoxCollider);
                if (firstBoxcollider.bounds.Intersects(levelBaseBoxCollider.bounds)) //Top box
                {
                    if (levelBaseBounds.minWallsZ < leftWallPos.z)
                    {
                        continue;
                    }
                    float zDistanceToWall = levelBaseBounds.minWallsZ - leftWallPos.z;
                    if (zDistanceToWall < firstSmallestScale)
                    {
                        firstSmallestScale = zDistanceToWall;
                    }
                }
                if (secondBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) // Bottom box
                {
                    if (levelBaseBounds.maxWallsZ > rightWallPos.z)
                    {
                        Debug.LogWarning("Corner of door is in a wall");
                        continue;
                    }
                    float zDistanceToWall = rightWallPos.z - levelBaseBounds.maxWallsZ;
                    if (zDistanceToWall < secondSmallestScale)
                    {
                        secondSmallestScale = zDistanceToWall;
                    }
                }
            }

            topWall.transform.localScale    = new Vector3(1, levelCreatorInfo.wallHeight, firstSmallestScale);
            bottomWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, -secondSmallestScale);
            topWall.transform.position      = doorBeingMade.transform.position + new Vector3(0, 0, topWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2);
            bottomWall.transform.position   = doorBeingMade.transform.position + new Vector3(0, 0, bottomWall.transform.localScale.z / 2) - new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2);
            topWall.transform.parent        = levelBaseMain.transform;
            bottomWall.transform.parent     = levelBaseMain.transform;


            levelBases.Add(topWall);
            levelBases.Add(bottomWall);
        }
        else
        {
            LevelBase leftWall  = Instantiate(levelBasePrefab);
            LevelBase rightWall = Instantiate(levelBasePrefab);

            AddNewObject(leftWall.gameObject);
            AddNewObject(rightWall.gameObject);

            float leftScale  = Mathf.Abs(levelCreatorInfo.baseWidth / 2 - leftWallPos.x);
            float rightScale = Mathf.Abs(leftWallPos.x - levelCreatorInfo.baseWidth / 2);
            leftWall.transform.localScale  = new Vector3(leftScale, levelCreatorInfo.wallHeight, 1);
            rightWall.transform.localScale = new Vector3(rightScale, levelCreatorInfo.wallHeight, 1);
            leftWall.transform.position    = doorBeingMade.transform.position - new Vector3(leftWall.transform.localScale.x / 2, 0, 0) - new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0);
            rightWall.transform.position   = doorBeingMade.transform.position + new Vector3(rightWall.transform.localScale.x / 2, 0, 0) + new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0);

            BoxCollider leftBoxCollider    = leftWall.GetComponent <BoxCollider>();
            BoxCollider rightBoxCollider   = rightWall.GetComponent <BoxCollider>();
            float       leftSmallestScale  = leftWall.transform.localScale.x;
            float       rightSmallestScale = rightWall.transform.localScale.x;
            for (int i = 0; i < levelBases.Count; i++)
            {
                if (levelBases[i] == null)
                {
                    continue;
                }
                BoxCollider levelBaseBoxCollider = levelBases[i].GetComponent <BoxCollider>();
                LevelCreatorUtils.WallsBounds levelBaseBounds = LevelCreatorUtils.BoxColliderToWallbounds(levelBases[i].transform.position, levelBaseBoxCollider);
                if (leftBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) //Top box
                {
                    if (levelBaseBounds.maxWallsX > leftWallPos.x)
                    {
                        Debug.LogWarning("Corner of door is in a wall");
                        continue;
                    }
                    float xDistanceToWall = leftWallPos.x - levelBaseBounds.maxWallsX;
                    if (xDistanceToWall < leftSmallestScale)
                    {
                        leftSmallestScale = xDistanceToWall;
                    }
                }
                if (rightBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) // Bottom box
                {
                    if (levelBaseBounds.minWallsX < rightWallPos.x)
                    {
                        Debug.LogWarning("Corner of door is in a wall");
                        continue;
                    }
                    float xDistanceToWall = levelBaseBounds.minWallsX - rightWallPos.x;
                    if (xDistanceToWall < rightSmallestScale)
                    {
                        rightSmallestScale = xDistanceToWall;
                    }
                }
            }

            leftWall.transform.localScale  = new Vector3(leftSmallestScale, levelCreatorInfo.wallHeight, 1);
            rightWall.transform.localScale = new Vector3(rightSmallestScale, levelCreatorInfo.wallHeight, 1);
            leftWall.transform.position    = doorBeingMade.transform.position - new Vector3(leftWall.transform.localScale.x / 2, 0, 0) - new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0);
            rightWall.transform.position   = doorBeingMade.transform.position + new Vector3(rightWall.transform.localScale.x / 2, 0, 0) + new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0);
            leftWall.transform.parent      = levelBaseMain.transform;
            rightWall.transform.parent     = levelBaseMain.transform;

            leftWall.transform.name  = "leftWall";
            rightWall.transform.name = "rightWall";
            levelBases.Add(leftWall);
            levelBases.Add(rightWall);
        }

        AddToUndo(tempUndoList);
    }
示例#3
0
    void SpliceUpMesh(Room pUpdatedRoom, LevelBase pSpliceMesh)
    {
        LevelCreatorUtils.WallsBounds levelBaseWallBounds = LevelCreatorUtils.BoxColliderToWallbounds(pSpliceMesh.transform.position, pSpliceMesh.GetComponent <BoxCollider>());
        //Check if room corners are intersecting
        int cornersInLevelbase = (pUpdatedRoom.wallBounds.TotalCornersInBound(levelBaseWallBounds));

        if (cornersInLevelbase > 0)
        {
            if (cornersInLevelbase > 3) // Splice in 4
            {
                CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1));
                CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0));
            }
            else
            {
                //Check wich corner is intersecting
                if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopLeft(), levelBaseWallBounds))
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1));
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0));
                    if (cornersInLevelbase == 2)
                    {
                        if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds))
                        {
                            CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                        }
                        else //Bottom left
                        {
                            CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                        }
                    }
                }
                else if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerBottomRight(), levelBaseWallBounds))
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                    if (cornersInLevelbase == 2)
                    {
                        if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds))
                        {
                            CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1));
                        }
                        else //Bottom left
                        {
                            CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0));
                        }
                    }
                }
                else if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds))
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1));
                }
                else //Bottom left solo
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0));
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                }
            }
        }
        else // Check wich
        {
            int cornersInRoom = levelBaseWallBounds.TotalCornersInBound(pUpdatedRoom.wallBounds);
            if (cornersInRoom > 3)// All corners are in room, delete mesh
            {
                Debug.Log("more than 3 corners in base. not making a new one");
                return;
            }
            else // Move mesh to side
            {
                if (pUpdatedRoom.wallBounds.minWallsX > levelBaseWallBounds.minWallsX) //Left
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0));
                    if (pUpdatedRoom.wallBounds.maxWallsX < levelBaseWallBounds.maxWallsX)
                    {
                        CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                    }
                }
                else if (pUpdatedRoom.wallBounds.maxWallsZ < levelBaseWallBounds.maxWallsZ) //Top
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1));
                    if (pUpdatedRoom.wallBounds.minWallsZ > levelBaseWallBounds.minWallsZ)
                    {
                        CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                    }
                }
                else if (pUpdatedRoom.wallBounds.maxWallsX < levelBaseWallBounds.maxWallsX) //Right
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0));
                }
                else //Bottom
                {
                    CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1));
                }
            }
        }
    }