コード例 #1
0
        public int3 WorldPositionToTilePosition(Vector3 worldPos, TileAtlas.TagLayer layer)
        {
            var rasterSize = layer.rasterSize;
            var localP     = transform.InverseTransformPoint(worldPos);

            return(new int3(Mathf.FloorToInt(localP.x / rasterSize.x), Mathf.RoundToInt(localP.y / rasterSize.y), Mathf.FloorToInt(localP.z / rasterSize.z)));
        }
コード例 #2
0
 public PlacedTile(string guid, int3 position, TileObject tileObject, GameObject placedObject, TileAtlas.TagLayer layer)
 {
     this.guid         = guid;
     this.position     = position;
     this.tileObject   = tileObject;
     this.placedObject = placedObject;
     this.layer        = layer;
 }
コード例 #3
0
 public void ChangeFloorBoundaries(int3 floorSize, TileAtlas.TagLayer layer)
 {
     floorBoundaries = new Vector3(
         floorSize.x * layer.rasterSize.x,
         floorSize.y * layer.rasterSize.y,
         floorSize.z * layer.rasterSize.z
         );
 }
コード例 #4
0
        public Vector3 TilePositionToLocalPosition(int3 tilePos, int3 size, TileAtlas.TagLayer layer)
        {
            var rasterSize = layer.rasterSize;

            return(new Vector3(
                       tilePos.x * rasterSize.x + rasterSize.x * 0.5f * size.x,
                       tilePos.y * rasterSize.y,
                       tilePos.z * rasterSize.z + rasterSize.z * 0.5f * size.z
                       ));
        }
コード例 #5
0
        void AddTileToLayerMenu(TileAtlas atlas, TileAtlas.TagLayer layer, Event e)
        {
            GenericMenu menu = new GenericMenu();

            menu.AddDisabledItem(new GUIContent("Tile from other layer [Not Implemented]"));
            menu.AddDisabledItem(new GUIContent("Tile from project files [Not Implemented]"));
            menu.AddDisabledItem(new GUIContent("Generate Tile from Gameobject [Not Implemented]"));
            menu.AddItem(new GUIContent("Drag and Drop files here!"), true, () => { });
            menu.ShowAsContext();
            e.Use();
        }
コード例 #6
0
 public void UpdateTilePositionsOnLayer(TileAtlas.TagLayer layer, int index)
 {
     if (index == -1)
     {
         return;              // there should be no tiles on defaultlayer
     }
     Debug.Log("[LevelBuilder] Update Position called on layer " + layer.name + " and index " + index);
     foreach (var placed in layers[index].Values)
     {
         placed.placedObject.transform.localPosition = TilePositionToLocalPosition(placed.position, layer);
     }
 }
コード例 #7
0
        public bool TilePositionInFloorSize(int3 tilePos, TileAtlas.TagLayer layer)
        {
            var floorSize  = FloorSize(layer);
            var rasterSize = layer.rasterSize;
            int halfX      = Mathf.FloorToInt(floorSize.x / 2f); // * rasterSize.x / 2f);
            int halfZ      = Mathf.FloorToInt(floorSize.z / 2f); // * rasterSize.z / 2f);

            if (tilePos.x < -halfX || tilePos.x >= halfX)
            {
                return(false);
            }
            if (tilePos.y < -floorSize.y || tilePos.y > floorSize.y)
            {
                return(false);
            }
            if (tilePos.z < -halfZ || tilePos.z >= halfZ)
            {
                return(false);
            }
            return(true);
        }
コード例 #8
0
        void DrawOnScreenPalette()
        {
            bool      guiChangedBefore = GUI.changed;
            TileAtlas atlas            = t.tileSet;

            TileAtlas.TagLayer activeLayer = layerIndex == -1 ? atlas.defaultLayer : (layerIndex < atlas.layers.Count) ? atlas.layers[layerIndex] : atlas.defaultLayer;
            if (activeLayer == atlas.defaultLayer)
            {
                return;
            }

            float scrollBarSize = GUI.skin.verticalScrollbar.fixedWidth;

            ChangeVerticalScrollbar(6);

            onScreenPaletteScroll = EditorGUILayout.BeginScrollView(onScreenPaletteScroll, GUILayout.Width(52));
            List <GUIContent> paletteIcons = new List <GUIContent>();

            int maximumPreviewImages = 60;

            for (int i = 0; i < atlas.layers.Count; i++)
            {
                var layer = atlas.layers[i];
                if (paletteVisibility == null || paletteVisibility.Length == 0)
                {
                    _paletteVis = new bool[t.tileSet.layers.Count];
                }
                if (paletteVisibility[i] || layer == activeLayer)
                {
                    foreach (var atlasTile in layer.layerObjects)
                    {
                        // Get a preview for the prefab
                        if (!atlasTile || atlasTile.prefabs.Length == 0)
                        {
                            continue;
                        }
                        if (layer.layerObjects.Count > maximumPreviewImages)
                        {
                            paletteIcons.Add(new GUIContent(atlasTile.name));
                        }
                        else
                        {
                            Texture2D texture = AssetPreview.GetAssetPreview(atlasTile.prefabs[0]);
                            paletteIcons.Add(new GUIContent(texture));
                        }
                    }
                }
            }
            Rect    screenPaletteBox   = GUILayoutUtility.GetRect(40, paletteIcons.Count * 40, "CN Box");
            int     previousItems      = 0;
            Vector2 layerIndicatorSize = new Vector2(5, 40);

            for (int i = 0; i < atlas.layers.Count; i++)
            {
                if (paletteVisibility[i] || i == layerIndex)
                {
                    for (int j = 0; j < atlas.layers[i].layerObjects.Count; j++)
                    {
                        if (i == layerIndex && j == paletteIndex)
                        {
                            EditorGUI.DrawRect(new Rect(screenPaletteBox.position + Vector2.up * previousItems * 40, layerIndicatorSize), atlas.layers[i].color + Color.gray);
                        }
                        else
                        {
                            EditorGUI.DrawRect(new Rect(screenPaletteBox.position + Vector2.up * previousItems * 40, layerIndicatorSize), atlas.layers[i].color);
                        }
                        previousItems++;
                    }
                }
            }
            screenPaletteBox.position += Vector2.right * 5;
            int gridIndex = GUI.SelectionGrid(screenPaletteBox, GetIndexFromPaletteIndex(paletteIndex), paletteIcons.ToArray(), 1, "CN Box");
            int layerIndexFromPalette;

            EditorGUILayout.EndScrollView();
            ChangeVerticalScrollbar(scrollBarSize);
            if (!guiChangedBefore && GUI.changed)
            {
                paletteIndex = GetPaletteIndexFromIndex(gridIndex, out layerIndexFromPalette);
                layerIndex   = layerIndexFromPalette;
                Repaint();
            }

            int GetPaletteIndexFromIndex(int i, out int newLayerIndex)
            {
                int indexInPalette = 0;
                int itemsBefore    = 0;

                for (int layer = 0; layer < paletteVisibility.Length; layer++)
                {
                    if (paletteVisibility[layer] || layer == layerIndex)
                    {
                        itemsBefore += atlas.layers[layer].layerObjects.Count;
                        if (itemsBefore > i)
                        {
                            indexInPalette = i - (itemsBefore - atlas.layers[layer].layerObjects.Count);
                            newLayerIndex  = layer;
                            //Debug.Log(newLayerIndex);
                            return(indexInPalette);
                        }
                    }
                }
                newLayerIndex = 0;
                return(0);
            }

            int GetIndexFromPaletteIndex(int pIndex)
            {
                int offset = 0;

                for (int i = 0; i < layerIndex; i++)
                {
                    if (paletteVisibility[i])
                    {
                        offset += atlas.layers[i].layerObjects.Count;
                    }
                }
                return(pIndex + offset);
            }
        }
コード例 #9
0
        void DrawPalette(TileAtlas atlas, Event e)
        {
            TileAtlas.TagLayer activeLayer = layerIndex == -1 ? atlas.defaultLayer : (layerIndex < atlas.layers.Count) ? atlas.layers[layerIndex] : atlas.defaultLayer;
            //DragTest
            //Rect myRect = GUILayoutUtility.GetRect(100, 40, GUILayout.ExpandWidth(true));
            //GUI.Box(myRect, "Drag and Drop Prefabs to this Box!");
            //if (myRect.Contains(e.mousePosition))
            //{
            //    if (e.type == EventType.DragUpdated)
            //    {
            //        DragAndDrop.visualMode = DragAndDropVisualMode.Move;
            //        //Debug.Log("Drag Updated!");
            //        e.Use();
            //    }
            //    else if (e.type == EventType.DragPerform)
            //    {
            //        DragAndDrop.AcceptDrag();
            //        Debug.Log("Drag Perform!");
            //        Debug.Log(DragAndDrop.objectReferences.Length);
            //        if (atlas.layers.Count > 0)
            //            for (int i = 0; i < DragAndDrop.objectReferences.Length; i++)
            //            {
            //                atlas.layers[0].layerObjects.Add(DragAndDrop.objectReferences[i] as TileObject);
            //            }
            //        e.Use();
            //    }
            //}
            //if (e.type == EventType.DragExited || e.type == EventType.MouseUp)
            //{
            //    //Debug.Log("Drag exited");
            //    DragAndDrop.PrepareStartDrag();
            //}
            //------
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.BeginVertical();
            Color guiColor = GUI.color;

            //EditorGUIUtility.IconContent("Settings")
            if (GUILayout.Button("Ξ", GUILayout.Width(18), GUILayout.Height(activeLayer == atlas.defaultLayer ? 60 : 30)))
            {
                layerIndex = -1;
            }
            for (int i = 0; i < atlas.layers.Count; i++)
            {
                int index = i;
                GUI.color = atlas.layers[i].color;
                Rect buttonRect = GUILayoutUtility.GetRect(new GUIContent(i.ToString()), "Button", GUILayout.Width(18), GUILayout.Height(activeLayer == atlas.layers[i] ? 60 : 30));
                if (GUI.Button(buttonRect, i.ToString()))
                {
                    layerIndex = i;
                    if (e.button == 1)
                    {
                        LayerRightClickMenu(e, index, atlas);
                    }
                }
            }
            GUI.color = guiColor;
            if (GUILayout.Button("+", GUILayout.Width(18), GUILayout.Height(18)))
            {
                atlas.AddTagLayer();
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.BeginVertical();
            if (activeLayer != atlas.defaultLayer)
            {
                bool changedBefore = GUI.changed;
                activeLayer.name = EditorGUILayout.TextField(activeLayer.name);
                if (!changedBefore && GUI.changed)
                {
                    UnityEditor.EditorUtility.SetDirty(atlas);
                }
            }
            else
            {
                EditorGUILayout.HelpBox("Unsorted objects, rightclick and move to a layer to use.", MessageType.Info, true);
            }

            if (layerIndex >= 0 && layerIndex < atlas.layers.Count)
            {
                //activeLayer.rasterSize = EditorGUILayout.Vector3Field("raster ", activeLayer.rasterSize);
                bool changedBefore = GUI.changed;
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Rastersize");
                activeLayer.rasterSize.x = EditorGUILayout.DelayedFloatField(activeLayer.rasterSize.x);
                activeLayer.rasterSize.y = EditorGUILayout.DelayedFloatField(activeLayer.rasterSize.y);
                activeLayer.rasterSize.z = EditorGUILayout.DelayedFloatField(activeLayer.rasterSize.z);
                EditorGUILayout.EndHorizontal();
                if (!changedBefore && GUI.changed)
                {
                    t.UpdateTilePositionsOnLayer(activeLayer, layerIndex);
                }
            }

            if (activeLayer != atlas.defaultLayer && activeLayer.layerObjects.Count == 0)
            {
                EditorGUILayout.HelpBox("Drag and Drop Tiles here.", MessageType.Info, true); return;
            }

            //-----
            EditorGUILayout.Vector2Field("scroll", paletteScroll);
            float columnCount = 4f;
            float panelSize   = (position.width - 60) / columnCount;

            paletteScroll = EditorGUILayout.BeginScrollView(paletteScroll);
            List <GUIContent> paletteIcons     = new List <GUIContent>();
            float             enumerationCount = 0;

            if (activeLayer == atlas.defaultLayer)
            {
                foreach (var atlasTile in atlas.TileFromGuid.Values)
                {
                    // Get a preview for the prefab
                    if (!atlasTile)
                    {
                        continue;
                    }

                    Vector2 yValues = new Vector2(Mathf.Floor(enumerationCount / columnCount) * panelSize,
                                                  Mathf.Floor(enumerationCount / columnCount) * panelSize + panelSize);
                    if (yValues.x < paletteScroll.y - panelSize || yValues.y > paletteScroll.y + panelSize * 4 + panelSize) //(atlas.tiles.Count > maximumPreviewImages)
                    {
                        paletteIcons.Add(new GUIContent(atlasTile.name));
                    }
                    else
                    {
                        Texture2D texture = null;
                        if (atlasTile.prefabs.Length != 0)
                        {
                            texture = AssetPreview.GetAssetPreview(atlasTile.prefabs[0]);
                        }
                        paletteIcons.Add(texture ? new GUIContent(texture) : new GUIContent("No Preview Available"));
                    }
                    enumerationCount++;
                }
                if (paletteIcons.Count == 0)
                {
                    EditorGUILayout.HelpBox("No unsorted tiles in atlas", MessageType.Info);
                }
            }
            else
            {
                foreach (var atlasTile in activeLayer.layerObjects)
                {
                    // Get a preview for the prefab
                    if (!atlasTile)
                    {
                        continue;
                    }
                    Vector2 yValues = new Vector2(Mathf.Floor(enumerationCount / columnCount) * panelSize,
                                                  Mathf.Floor(enumerationCount / columnCount) * panelSize + panelSize);
                    if (yValues.x < paletteScroll.y - panelSize || yValues.y > paletteScroll.y + panelSize * 4 + panelSize)
                    {
                        paletteIcons.Add(new GUIContent(atlasTile.name));
                        //paletteIcons.Add(new GUIContent($"{enumerationCount} : {yValues}"));
                    }
                    else
                    {
                        Texture2D texture = null;
                        if (atlasTile.prefabs.Length != 0)
                        {
                            texture = AssetPreview.GetAssetPreview(atlasTile.prefabs[0]);
                        }
                        paletteIcons.Add(texture ? new GUIContent(texture) : new GUIContent("No Preview Available"));
                    }
                    enumerationCount++;
                }
            }

            if (activeLayer != atlas.defaultLayer)
            {
                paletteIcons.Add(EditorGUIUtility.IconContent("Toolbar Plus"));
            }
            // Display the grid

            //paletteIndex = GUILayout.SelectionGrid(paletteIndex, paletteIcons.ToArray(), 4, GUILayout.Width(position.width-38));

            EditorGUILayout.BeginHorizontal();
            GUIStyle iconLabel = new GUIStyle("Label");

            iconLabel.alignment        = TextAnchor.UpperCenter;
            iconLabel.normal.textColor = Color.grey;
            for (int i = 0; i < paletteIcons.Count; i++)
            {
                Rect       buttonRect       = GUILayoutUtility.GetRect(paletteIcons[i], "Button", GUILayout.Width(panelSize), GUILayout.Height(panelSize));
                TileObject buttonTileObject = activeLayer == atlas.defaultLayer ? atlas.tiles[i] : i < activeLayer.layerObjects.Count ? activeLayer.layerObjects[i] : null;
                bool       clickHere        = false;
                if (buttonRect.Contains(e.mousePosition))
                {
                    switch (e.type)
                    {
                    //case EventType.MouseDrag:
                    //    DragAndDrop.PrepareStartDrag();

                    //    DragAndDrop.SetGenericData("TileObject", buttonTileObject);
                    //    DragAndDrop.objectReferences = new Object[] { buttonTileObject };
                    //    DragAndDrop.StartDrag("Drag");
                    //    break;
                    //case EventType.DragExited:
                    //    clickHere = true;
                    //    break;
                    case EventType.MouseDown:
                        clickHere = true;
                        break;
                    }
                }
                TileAtlas.TagLayer tileLayer = null;
                foreach (var layer in atlas.layers)
                {
                    if (layer.layerObjects.Contains(buttonTileObject))
                    {
                        tileLayer = layer;
                        break;
                    }
                }

                GUI.backgroundColor = tileLayer != null?tileLayer.color:guiColor;
                GUI.Toggle(buttonRect, paletteIndex == i, paletteIcons[i], "Button");
                if (buttonTileObject)
                {
                    GUI.Label(buttonRect, buttonTileObject.name, iconLabel);
                }
                if (clickHere)
                {
                    paletteIndex = i;
                    if (activeLayer == atlas.defaultLayer)
                    {
                        Selection.activeObject = buttonTileObject;
                    }
                    if (activeLayer != atlas.defaultLayer && i == paletteIcons.Count - 1)
                    {
                        AddTileToLayerMenu(atlas, activeLayer, e);
                        paletteIndex = 0;
                    }
                    else if (e.button == 1)  // rightclick
                    {
                        TileRightClickMenu(e, buttonTileObject, atlas);
                    }
                }
                if (i % (int)(columnCount) == columnCount - 1)// && i != 0)
                {
                    EditorGUILayout.EndHorizontal();
                    EditorGUILayout.BeginHorizontal();
                }
            }
            EditorGUILayout.EndHorizontal();

            if (activeLayer == atlas.defaultLayer)
            {
                selectedTileGuid = atlas.tiles[paletteIndex].guid;
            }
            else
            {
                if (paletteIndex >= activeLayer.layerObjects.Count)
                {
                    paletteIndex = 0;
                }
                if (activeLayer.layerObjects[paletteIndex])
                {
                    selectedTileGuid = activeLayer.layerObjects[paletteIndex].guid;
                }
                else
                {
                    selectedTileGuid = "";
                }
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndScrollView();
            EditorGUILayout.EndHorizontal();
            GUI.backgroundColor = guiColor;
        }
コード例 #10
0
 void DrawBrushGizmo(int3 brushPosition, int3 brushSize, TileAtlas.TagLayer activeLayer)
 {
     Handles.DrawWireCube(
         t.TilePositionToLocalPosition(brushPosition, brushSize, activeLayer) + Vector3.up * brushSize.y * 0.5f * activeLayer.rasterSize.y,
         new Vector3(brushSize.x * activeLayer.rasterSize.x, brushSize.y * activeLayer.rasterSize.y, brushSize.z * activeLayer.rasterSize.z));
 }
コード例 #11
0
        void OnSceneGridBrush(Event e, SceneView sceneView, TileAtlas.TagLayer activeLayer)
        {
            if (painting && activeLayer != t.tileSet.defaultLayer)
            {
                int controlId = GUIUtility.GetControlID(FocusType.Passive);
                if (e.control && (e.type == EventType.MouseDown ||
                                  e.type == EventType.MouseDrag ||
                                  e.type == EventType.ScrollWheel))
                {
                    GUIUtility.hotControl = controlId;
                    if (e.type == EventType.ScrollWheel)
                    {
                        if (e.delta.y > 0)
                        {
                            targetHeigth -= 1;
                        }
                        else
                        {
                            targetHeigth += 1;
                        }
                        e.Use();
                        GUIUtility.hotControl = 0;
                    }
                }
                if (e.isMouse)
                {
                    Ray   guiRay = HandleUtility.GUIPointToWorldRay(e.mousePosition);
                    float d;
                    floorPlane.Raycast(guiRay, out d);
                    Vector3 worldPos = guiRay.GetPoint(d);
                    //Debug.Log("worldPos: " + worldPos+"; mousePos: "+tileMousePosition);
                    var newTileMousePosition = t.WorldPositionToTilePosition(worldPos, activeLayer);
                    if (t.TilePositionInFloorSize(newTileMousePosition, activeLayer))
                    {
                        tileMousePosition = newTileMousePosition;
                    }
                }
                //Handles.DrawWireDisc(t.TilePositionToLocalPosition(tileMousePosition, selectedTile.size), Vector3.up, 0.5f * selectedTile.size.x);
                Handles.color = activeLayer.color + Color.gray;
                if (t.GetTile(tileMousePosition, layerIndex) != null)
                {
                    if (e.modifiers == EventModifiers.Control && !tileMousePosition.Equals(lastTileMousePos))
                    {
                        tileMousePosition = StackedPosition(tileMousePosition, layerIndex);
                    }
                    else
                    {
                        Handles.color = new Color(1f, 0.1f, 0f);
                    }
                }
                if (e.type == EventType.MouseUp)
                {
                    stackingHeight = null;
                }
                int3 brushSize = selectedTile ? selectedTile.GetSize(activeLayer.rasterSize) : new int3(1, 1, 1);
                DrawBrushGizmo(tileMousePosition, brushSize, activeLayer);
                if (rectStartTile != null && !rectStartTile.Value.Equals(tileMousePosition)) // rectbrush
                {
                    for (int x = 0; x <= Mathf.Abs(Mathf.FloorToInt((tileMousePosition.x - rectStartTile.Value.x) / brushSize.x)); x++)
                    {
                        for (int z = 0; z <= Mathf.Abs(Mathf.FloorToInt((tileMousePosition.z - rectStartTile.Value.z) / brushSize.z)); z++)
                        {
                            DrawBrushGizmo(rectStartTile.Value
                                           + new int3(
                                               tileMousePosition.x > rectStartTile.Value.x ? x : -x,
                                               0,
                                               tileMousePosition.z > rectStartTile.Value.z ? z : -z), brushSize, activeLayer);
                        }
                    }
                }
                if ((e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && e.button == 0 && (e.modifiers == EventModifiers.None || e.modifiers == EventModifiers.Control))
                {
                    if (!tileMousePosition.Equals(lastTileMousePos) || e.type == EventType.MouseDown)
                    {
                        DrawTiles(sceneView, e, tileMousePosition, true);
                    }
                    else
                    {
                        DrawTiles(sceneView, e, tileMousePosition, false);
                    }
                }
                else if ((e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && e.button == 1 &&
                         (e.modifiers == EventModifiers.None || e.modifiers == EventModifiers.Control))
                {
                    var pos = tileMousePosition;
                    if (e.modifiers == EventModifiers.Control)
                    {
                        int startY = pos.y;
                        pos = StackedPosition(tileMousePosition, layerIndex, false);
                        while (pos.y > startY)
                        {
                            EraseTiles(sceneView, e, tileMousePosition);
                            pos.y -= 1;
                        }
                    }
                    EraseTiles(sceneView, e, tileMousePosition);
                }
                else if (e.type == EventType.MouseDown && (e.button == 0 || e.button == 1) && e.modifiers == EventModifiers.Shift)
                {
                    rectStartTile         = tileMousePosition;
                    GUIUtility.hotControl = 0;
                    e.Use();
                }
                else if (e.type == EventType.MouseDrag && (e.button == 0 || e.button == 1) && rectStartTile != null && e.modifiers == EventModifiers.Shift)
                {
                    GUIUtility.hotControl = 0;
                    e.Use();
                }
                else if ((e.type == EventType.MouseUp) && (e.button == 0 || e.button == 1) && rectStartTile != null)
                {
                    GUIUtility.hotControl = 0;
                    e.Use();
                    if (e.button == 0)
                    {
                        DrawMultipleTiles(rectStartTile.Value, tileMousePosition, selectedTile, activeLayer);
                    }
                    else if (e.button == 1)
                    {
                        EraseMultipleTiles(rectStartTile.Value, tileMousePosition);
                    }
                    rectStartTile = null;
                }
                //else if (e.type == EventType.MouseMove && e.button == 0 && e.modifiers == EventModifiers.Control)
                //{
                //    brushRotation += new Vector3(0, e.delta.x, 0);
                //    GUIUtility.hotControl = 0;
                //    e.Use();
                //    Repaint();
                //}

                lastTileMousePos = tileMousePosition;
            }
        }
コード例 #12
0
        void DrawMultipleTiles(int3 startPosition, int3 endPosition, TileObject tile, TileAtlas.TagLayer layer)
        {
            int3 brushSize   = tile.GetSize(layer.rasterSize);
            int3 minPosition = math.min(startPosition, endPosition);
            int3 maxPosition = math.max(startPosition, endPosition);
            int  widthX      = Mathf.FloorToInt((maxPosition.x - minPosition.x) / brushSize.x);
            int  widthZ      = Mathf.FloorToInt((maxPosition.z - minPosition.z) / brushSize.z);

            for (int x = 0; x <= widthX; x++)
            {
                for (int z = 0; z <= widthZ; z++)
                {
                    t.PlaceTile(tile.guid,
                                minPosition + new int3(
                                    x * brushSize.x,
                                    0,
                                    z * brushSize.z),
                                brushRotation,
                                layerIndex, layer, true); // <-- turn to false if performance becomes problematic
                }
            }
            //t.UpdateMultiple(minPosition - new int3(1, 0, 1), maxPosition + new int3(2,0,2), layerIndex);
        }
コード例 #13
0
 public int3 FloorSize(TileAtlas.TagLayer layer)
 {
     return(FloorSize(layer.rasterSize));
 }
コード例 #14
0
        public void PlaceTile(string guid, int3 position, Vector3 euler, int layerIndex, TileAtlas.TagLayer tagLayer, bool updateNeighbours = true)
        {
            Undo.RegisterCompleteObjectUndo(this, "Created New Tile Object");
            TileObject atlasTile;

            tileSet.TileFromGuid.TryGetValue(guid, out atlasTile);
            if (!atlasTile)
            {
                Debug.LogError("No Tile with guid [" + guid + "] found in atlas " + tileSet.name, tileSet); return;
            }
            var go = (GameObject)PrefabUtility.InstantiatePrefab(atlasTile.prefab) as GameObject;

            if (!go)
            {
                Debug.LogError("No GameObject found at Tile with guid " + guid); return;
            }

            if (layerIndex >= layers.Count)
            {
                for (int i = 0; i <= layerIndex - layers.Count; i++)
                {
                    layers.Add(new IntTileDictionary());
                }
            }

            int3 tileSize = atlasTile.GetSize(tagLayer.rasterSize);

            go.transform.SetParent(transform);
            if (!hierarchyVisibility)
            {
                go.hideFlags |= HideFlags.HideInHierarchy;
            }

            //atlasTile.size

            go.transform.localPosition = TilePositionToLocalPosition(position, tileSize, tileSet.layers[layerIndex]) + atlasTile.offset;
            go.transform.localRotation = Quaternion.Euler(euler);
            var placedTile = new PlacedTile(guid, position, atlasTile, go, tagLayer);

            for (int x = 0; x < tileSize.x; x++)
            {
                for (int y = 0; y < tileSize.y; y++)
                {
                    for (int z = 0; z < tileSize.z; z++)
                    {
                        var        pos = position + new int3(x, y, z);
                        PlacedTile alreadyPlaced;
                        if (layers[layerIndex].TryGetValue(pos, out alreadyPlaced))
                        {
                            RemoveTile(alreadyPlaced, layerIndex);
                        }
                        if (layers[layerIndex].ContainsKey(pos))
                        {
                            layers[layerIndex].Remove(pos);
                        }
                        layers[layerIndex].Add(pos, placedTile);
                    }
                }
            }
            var neighbs = GetNeighbours(placedTile, layerIndex);

            atlasTile.PlaceBehaviour(placedTile, neighbs);
            if (updateNeighbours)
            {
                foreach (var neighb in neighbs)
                {
                    //Undo.RecordObject(neighb.placedObject, "Before Updating Object");
                    neighb.tileObject.UpdateBehaviour(neighb, GetNeighbours(neighb, layerIndex));
                }
            }

            Undo.RegisterCreatedObjectUndo(placedTile.placedObject, "Created New Tile Object");
            EditorUtility.SetDirty(gameObject);
        }