Example #1
0
        private void DisplayPrefab()
        {
            if (Tileset.SelectedBrushId != Tileset.k_BrushId_Default)
            {
                EditorGUILayout.LabelField("Brush tile editing not allowed", EditorStyles.boldLabel);
            }
            else
            {
                bool isMultiselection = Tileset.TileSelection != null;
                Tile selectedTile     = isMultiselection ? Tileset.Tiles[(int)(Tileset.TileSelection.selectionData[0] & Tileset.k_TileDataMask_TileId)] : Tileset.SelectedTile;
                GUILayoutUtility.GetRect(1, 1, GUILayout.Width(Tileset.VisualTileSize.x), GUILayout.Height(Tileset.VisualTileSize.y));
                Rect tileUV = selectedTile.uv;
                GUI.color = Tileset.BackgroundColor;
                GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), EditorGUIUtility.whiteTexture, tileUV, true);
                GUI.color = Color.white;
                GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), Tileset.AtlasTexture, tileUV, true);

                if (isMultiselection)
                {
                    EditorGUILayout.LabelField("* Multi-selection Edition", EditorStyles.boldLabel);
                }
                EditorGUI.BeginChangeCheck();
                TilePrefabData prefabData      = selectedTile.prefabData;
                float          savedLabelWidth = EditorGUIUtility.labelWidth;
                EditorGUIUtility.labelWidth = 80;
                prefabData.offset           = EditorGUILayout.Vector3Field("Offset", prefabData.offset);
                prefabData.offsetMode       = (TilePrefabData.eOffsetMode)EditorGUILayout.EnumPopup("Offset Mode", prefabData.offsetMode);
                prefabData.prefab           = (GameObject)EditorGUILayout.ObjectField("Prefab", prefabData.prefab, typeof(GameObject), false);
                EditorGUIUtility.labelWidth = savedLabelWidth;

                Texture2D prefabPreview = AssetPreview.GetAssetPreview(selectedTile.prefabData.prefab);
                GUILayout.Box(prefabPreview, prefabPreview != null? (GUIStyle)"Box" : GUIStyle.none);

                if (prefabData.prefab)
                {
                    prefabData.showTileWithPrefab = EditorGUILayout.Toggle("Show Tile With Prefab", prefabData.showTileWithPrefab);
                }

                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(Tileset, "Tile Prefab Data Changed");
                    if (isMultiselection)
                    {
                        for (int i = 0; i < Tileset.TileSelection.selectionData.Count; ++i)
                        {
                            Tile tile = Tileset.Tiles[(int)(Tileset.TileSelection.selectionData[i] & Tileset.k_TileDataMask_TileId)];
                            tile.prefabData = prefabData;
                        }
                    }
                    else
                    {
                        selectedTile.prefabData = prefabData;
                    }
                    EditorUtility.SetDirty(Tileset);
                }
            }
        }
        private GameObject CreateTileObject(int tileIdx, TilePrefabData tilePrefabData)
        {
            if (tilePrefabData.prefab != null)
            {
                TileObjData tileObjData = m_tileObjList.Find(x => x.tilePos == tileIdx);
                GameObject  tileObj     = null;
                int         gx          = tileIdx % m_width;
                int         gy          = tileIdx / m_width;
                if (tileObjData == null || tileObjData.tilePrefabData != tilePrefabData || tileObjData.obj == null)
                {
#if UNITY_EDITOR
                    tileObj = (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab(tilePrefabData.prefab);
                    // allow destroy the object with undo operations
                    if (ParentTilemap.IsUndoEnabled)
                    {
                        UnityEditor.Undo.RegisterCreatedObjectUndo(tileObj, Tilemap.k_UndoOpName + ParentTilemap.name);
                    }
#else
                    tileObj = (GameObject)Instantiate(tilePrefabData.prefab, Vector3.zero, transform.rotation);
#endif
                    _SetTileObjTransform(tileObj, gx, gy, tilePrefabData, m_tileDataList[tileIdx]);
                    if (tileObjData != null)
                    {
                        m_tileObjToBeRemoved.Add(tileObjData.obj);
                        tileObjData.obj            = tileObj;
                        tileObjData.tilePrefabData = tilePrefabData;
                    }
                    else
                    {
                        m_tileObjList.Add(new TileObjData()
                        {
                            tilePos = tileIdx, obj = tileObj, tilePrefabData = tilePrefabData
                        });
                    }
                    tileObj.SendMessage(k_OnTilePrefabCreation,
                                        new OnTilePrefabCreationData()
                    {
                        ParentTilemap = ParentTilemap,
                        GridX         = GridPosX + gx, GridY = GridPosY + gy
                    }, SendMessageOptions.DontRequireReceiver);
                    return(tileObj);
                }
                else if (tileObjData.obj != null)
                {
                    _SetTileObjTransform(tileObjData.obj, gx, gy, tilePrefabData, m_tileDataList[tileIdx]);
                    tileObjData.obj.SendMessage(k_OnTilePrefabCreation,
                                                new OnTilePrefabCreationData()
                    {
                        ParentTilemap = ParentTilemap,
                        GridX         = GridPosX + gx,
                        GridY         = GridPosY + gy
                    }, SendMessageOptions.DontRequireReceiver);
                    return(tileObjData.obj);
                }
            }
            return(null);
        }
 private GameObject CreateTileObject(int locGridX, int locGridY, TilePrefabData tilePrefabData)
 {
     if (locGridX >= 0 && locGridX < m_width && locGridY >= 0 && locGridY < m_height)
     {
         int tileIdx = locGridY * m_width + locGridX;
         return(CreateTileObject(tileIdx, tilePrefabData));
     }
     else
     {
         return(null);
     }
 }
Example #4
0
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return(false);
            }
            if (obj.GetType() != this.GetType())
            {
                return(false);
            }

            TilePrefabData other = (TilePrefabData)obj;

            return((other.prefab == this.prefab) && (other.offset == this.offset) && (other.offsetMode == this.offsetMode));
        }
        private void _SetTileObjTransform(GameObject tileObj, int gx, int gy, TilePrefabData tilePrefabData, uint tileData)
        {
            Vector3 chunkLocPos = new Vector3((gx + .5f) * CellSize.x, (gy + .5f) * CellSize.y, tilePrefabData.prefab.transform.position.z);

            if (tilePrefabData.offsetMode == TilePrefabData.eOffsetMode.Pixels)
            {
                float ppu = Tileset.TilePxSize.x / CellSize.x;
                chunkLocPos += tilePrefabData.offset / ppu;
            }
            else //if (tilePrefabData.offsetMode == TilePrefabData.eOffsetMode.Units)
            {
                chunkLocPos += tilePrefabData.offset;
            }
            Vector3 worldPos = transform.TransformPoint(chunkLocPos);

            tileObj.transform.position      = worldPos;
            tileObj.transform.rotation      = transform.rotation;
            tileObj.transform.parent        = transform.parent;
            tileObj.transform.localRotation = tilePrefabData.prefab.transform.localRotation;
            tileObj.transform.localScale    = tilePrefabData.prefab.transform.localScale;
            //+++ Apply tile flags
            Vector3 localScale = tileObj.transform.localScale;

            if ((tileData & Tileset.k_TileFlag_Rot90) != 0)
            {
                tileObj.transform.localRotation *= Quaternion.Euler(0, 0, -90);
            }
            //For Rot180 and Rot270 avoid changing the scale
            if (((tileData & Tileset.k_TileFlag_FlipH) != 0) && ((tileData & Tileset.k_TileFlag_FlipV) != 0))
            {
                tileObj.transform.localRotation *= Quaternion.Euler(0, 0, -180);
            }
            else
            {
                if ((tileData & Tileset.k_TileFlag_FlipH) != 0)
                {
                    localScale.x = -tileObj.transform.localScale.x;
                }
                if ((tileData & Tileset.k_TileFlag_FlipV) != 0)
                {
                    localScale.y = -tileObj.transform.localScale.y;
                }
            }
            tileObj.transform.localScale = localScale;
            //---
        }
        private void _SetTileObjTransform(GameObject tileObj, int gx, int gy, TilePrefabData tilePrefabData)
        {
            Vector3 chunkLocPos = new Vector3((gx + .5f) * CellSize.x, (gy + .5f) * CellSize.y);

            if (tilePrefabData.offsetMode == TilePrefabData.eOffsetMode.Pixels)
            {
                float ppu = Tileset.TilePxSize.x / CellSize.x;
                chunkLocPos += tilePrefabData.offset / ppu;
            }
            else //if (tilePrefabData.offsetMode == TilePrefabData.eOffsetMode.Units)
            {
                chunkLocPos += tilePrefabData.offset;
            }
            Vector3 worldPos = transform.TransformPoint(chunkLocPos);

            tileObj.transform.position      = worldPos;
            tileObj.transform.rotation      = transform.rotation;
            tileObj.transform.parent        = transform.parent;
            tileObj.transform.localRotation = tilePrefabData.prefab.transform.localRotation;
            tileObj.transform.localScale    = tilePrefabData.prefab.transform.localScale;
        }
Example #7
0
        private GameObject CreateTileObject(int tileIdx, TilePrefabData tilePrefabData)
        {
            if (tilePrefabData.prefab != null)
            {
                TileObjData tileObjData = FindTileObjDataByTileIdx(tileIdx);
                GameObject  tileObj     = null;
                int         gx          = tileIdx % m_width;
                int         gy          = tileIdx / m_width;
                if (tileObjData == null || tileObjData.tilePrefabData != tilePrefabData || tileObjData.obj == null)
                {
#if UNITY_EDITOR
                    GameObject sourcePrefabInstance = null;
                    if (BrushBehaviour.TileObjSourceTilemap)
                    {
                        // Use the brush instance to copy also the modified parameters
                        Vector2Int copyLoc = new Vector2Int(GridPosX + gx + BrushBehaviour.TileObjSourceTilemapOffset.x, GridPosY + gy + BrushBehaviour.TileObjSourceTilemapOffset.y);
                        sourcePrefabInstance = BrushBehaviour.TileObjSourceTilemap.GetTileObject(copyLoc.x, copyLoc.y);
                    }
                    if (sourcePrefabInstance && !EditorCompatibilityUtils.IsPrefab(sourcePrefabInstance))
                    {
                        tileObj      = (GameObject)Instantiate(sourcePrefabInstance, Vector3.zero, transform.rotation);
                        tileObj.name = tilePrefabData.prefab.name;
                    }
                    else
                    {
                        tileObj = (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab(tilePrefabData.prefab);
                        if (sourcePrefabInstance)
                        {
                            UnityEditor.PropertyModification[] modifications = UnityEditor.PrefabUtility.GetPropertyModifications(sourcePrefabInstance);
                            UnityEditor.PrefabUtility.SetPropertyModifications(tileObj, modifications);
                        }
                    }

                    // allow destroy the object with undo operations
                    if (ParentTilemap.IsUndoEnabled)
                    {
                        UnityEditor.Undo.RegisterCreatedObjectUndo(tileObj, STETilemap.k_UndoOpName + ParentTilemap.name);
                    }
#else
                    tileObj = (GameObject)Instantiate(tilePrefabData.prefab, Vector3.zero, transform.rotation);
#endif
                    _SetTileObjTransform(tileObj, gx, gy, tilePrefabData, m_tileDataList[tileIdx]);
                    if (tileObjData != null)
                    {
                        m_tileObjToBeRemoved.Add(tileObjData.obj);
                        tileObjData.obj            = tileObj;
                        tileObjData.tilePrefabData = tilePrefabData;
                    }
                    else
                    {
                        m_tileObjList.Add(new TileObjData()
                        {
                            tilePos = tileIdx, obj = tileObj, tilePrefabData = tilePrefabData
                        });
                    }
                    tileObj.SendMessage(k_OnTilePrefabCreation,
                                        new OnTilePrefabCreationData()
                    {
                        ParentTilemap = ParentTilemap,
                        GridX         = GridPosX + gx, GridY = GridPosY + gy
                    }, SendMessageOptions.DontRequireReceiver);
                    return(tileObj);
                }
                else if (tileObjData.obj != null)
                {
#if UNITY_EDITOR && !UNITY_2018_3_OR_NEWER
                    //+++ Break tilemap prefab and restore tile prefab link
                    GameObject parentPrefab = UnityEditor.PrefabUtility.FindRootGameObjectWithSameParentPrefab(tileObjData.obj);
                    if (parentPrefab != tileObjData.obj)
                    {
                        DestroyImmediate(tileObjData.obj);
                        tileObjData.obj = UnityEditor.PrefabUtility.InstantiatePrefab(tileObjData.tilePrefabData.prefab) as GameObject;
                    }
                    ///---
#endif
                    _SetTileObjTransform(tileObjData.obj, gx, gy, tilePrefabData, m_tileDataList[tileIdx]);
                    tileObjData.obj.SendMessage(k_OnTilePrefabCreation,
                                                new OnTilePrefabCreationData()
                    {
                        ParentTilemap = ParentTilemap,
                        GridX         = GridPosX + gx,
                        GridY         = GridPosY + gy
                    }, SendMessageOptions.DontRequireReceiver);
                    return(tileObjData.obj);
                }
            }
            return(null);
        }
Example #8
0
        private void DisplayPrefab()
        {
            if (Tileset.SelectedBrushId != Tileset.k_BrushId_Default)
            {
                EditorGUILayout.LabelField("Brush tile editing not allowed", EditorStyles.boldLabel);
            }
            else
            {
                bool isMultiselection = Tileset.TileSelection != null;
                Tile selectedTile     = isMultiselection ? Tileset.Tiles[(int)(Tileset.TileSelection.selectionData[0] & Tileset.k_TileDataMask_TileId)] : Tileset.SelectedTile;
                GUILayoutUtility.GetRect(1, 1, GUILayout.Width(Tileset.VisualTileSize.x), GUILayout.Height(Tileset.VisualTileSize.y));
                Rect tileUV = selectedTile.uv;
                GUI.color = Tileset.BackgroundColor;
                GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), EditorGUIUtility.whiteTexture, tileUV, true);
                GUI.color = Color.white;
                GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), Tileset.AtlasTexture, tileUV, true);

                if (isMultiselection)
                {
                    EditorGUILayout.LabelField("* Multi-selection Edition", EditorStyles.boldLabel);
                }
                EditorGUI.BeginChangeCheck();
                TilePrefabData prefabData      = selectedTile.prefabData;
                float          savedLabelWidth = EditorGUIUtility.labelWidth;
                EditorGUIUtility.labelWidth = 80;
                prefabData.offset           = EditorGUILayout.Vector3Field("Offset", prefabData.offset);
                prefabData.offsetMode       = (TilePrefabData.eOffsetMode)EditorGUILayout.EnumPopup("Offset Mode", prefabData.offsetMode);
                prefabData.rotation         = EditorGUILayout.Vector3Field("Rotation", prefabData.rotation);
                EditorGUI.BeginChangeCheck();
                GameObject prevPrefab = prefabData.prefab;
                prefabData.prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefabData.prefab, typeof(GameObject), false);
                bool isPrefabChanged = EditorGUI.EndChangeCheck();
                // Special case for 3D tiles where tilemap will be rotated over the plane XZ
                if (isPrefabChanged && !prevPrefab && prefabData.rotation == Vector3.zero && prefabData.prefab && prefabData.prefab.GetComponentInChildren <MeshRenderer>())
                {
                    prefabData.rotation = new Vector3(-90, 0, 0);
                    prefabData.showPrefabPreviewInTilePalette = true;
                }

                GUILayout.BeginHorizontal();
                Texture2D prefabPreview = AssetPreview.GetAssetPreview(selectedTile.prefabData.prefab);
                GUILayout.Box(prefabPreview, prefabPreview != null? (GUIStyle)"Box" : GUIStyle.none);
                GUILayout.EndHorizontal();

                if (prefabData.prefab)
                {
                    EditorGUIUtility.labelWidth = 260;
                    if (prefabPreview)
                    {
                        prefabData.showPrefabPreviewInTilePalette = EditorGUILayout.Toggle("Display the prefab preview in the tile palette", prefabData.showPrefabPreviewInTilePalette);
                    }
                    EditorGUIUtility.labelWidth   = savedLabelWidth;
                    prefabData.showTileWithPrefab = EditorGUILayout.Toggle("Show Tile With Prefab", prefabData.showTileWithPrefab);
                }

                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(Tileset, "Tile Prefab Data Changed");
                    if (isMultiselection)
                    {
                        for (int i = 0; i < Tileset.TileSelection.selectionData.Count; ++i)
                        {
                            Tile       tile        = Tileset.Tiles[(int)(Tileset.TileSelection.selectionData[i] & Tileset.k_TileDataMask_TileId)];
                            GameObject savedPrefab = tile.prefabData.prefab;
                            tile.prefabData = prefabData;
                            if (!isPrefabChanged)
                            {
                                tile.prefabData.prefab = savedPrefab;
                            }
                        }
                    }
                    else
                    {
                        selectedTile.prefabData = prefabData;
                    }
                    EditorUtility.SetDirty(Tileset);
                }
            }
        }