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); } }
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; }
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); }
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); } } }