не не.. ты посмотри на кромки в тайлсэте.. там все решение! можно оставить и тайловую схему генерации. Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Что интересно эти кромки попадают на тайл с соседнего тайла. Не пойму в чём дело.
Добавлено (12 августа 2015, 13:14) ---------------------------------------------
ЦитатаKamiRonin ()
Добавлено: Все, посмотрел исходный тайлсет - это на нем зазоры!! Там у картинки самой в рамку спрайта (ну скажем правого склона горки) влезает прозрачная кромка.. По моему - это причина глюка.. Попробуй на кочке - в фотошопе затри зазоры, посмотри как будет рисовать..
Случайно заметил добавление. Пока не понятно, что за кромка. Посмотрю в фотошопе.
Добавлено (12 августа 2015, 14:45) --------------------------------------------- Я ещё задал свой вопрос здесь на кривом английском. Пишут, что нужно добавить "padding", так как близлежащие текстуры влияют друг на друга. Появляется эффект "bleed" - смазывание. Не понимаю, почему это отключить нельзя. Я так понял padding - это зазор между тайлами. Какой программой можно добавить padding?
Добавлено (12 августа 2015, 16:42) --------------------------------------------- У меня "Pixel Per Unit" = 1. Наверное, в этом проблема.
Добавлено (12 августа 2015, 17:21) --------------------------------------------- Я нашёл решение этой проблемы. Я из общего тайлсета создаю более маленькие для каждого объекта в Tilled Map Editor, но с большим зазором в один тайл. Экспортирую в png и теперь Sprite Editor нормально разделяет:
Сообщение отредактировал 8Observer8 - Среда, 12 Августа 2015, 14:48
не, ради эксперимента поставь вместо поинт сглаживания в тайлсете любое другое - и посмотри на результат! вот то же самое происходит в поинт режиме только масштаб мизерный. в общем они предложили тайлсет разрезать и вставить по пикселю между всеми спрайтами.. тогда они будут без рудементов отображаться.. (у меня фотошоп погнал с цветовым профилем, поэтому показалось что такие пиксели как раз уже есть и попадают в рамку спрайта у тебя)..
Цитата8Observer8 ()
Я нашёл решение этой проблемы.
ну вот и молоток.. но достаточно одного пикселя зазора. Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Среда, 12 Августа 2015, 17:26
они предложили тайлсет разрезать и вставить по пикселю между всеми спрайтами
Я почти так и сделал, только вставляю по 16 пикселей между спрайтами. Так быстрее. Но есть другой вариант. Хотел в Paint'е сделать, но он прозрачность убирает. Тогда придётся потом фотошопом делать фон прозразный. Наверное, этот вариант лучше. Лучше пусть будет по одному пикселу. Столько времени придётся убить, чтобы добавить зазоры в тайлсет.
Добавлено (12 августа 2015, 20:22) --------------------------------------------- Я нашёл решение здесь!
Сообщение отредактировал 8Observer8 - Среда, 12 Августа 2015, 17:33
Как сделать, чтобы камера плавно передвигалась, как в Марио? Как это называется, чтобы поискать? Может у кого есть ссылка на хороший туториал?
Что-то типо этого? На самом деле, тут как-то сложно разобраться, я не смог, но может поможет. У меня вопрос. Как у вас в Tiled получается выдерживать пропорции уровня? Сколько там не копался, не могу понять, где сделать платформу короче, где длиннее. Есть какой-то способ удалять лишние блоки в юнити?
У вас в танчиках та же самая проблема, как у меня, на границе между тайлами. Как вы собираетесь её решать? Вы не могли бы решить проблему и обновить репозитарий?
Проблема:
Цитатаdreenline ()
На самом деле, тут как-то сложно разобраться, я не смог, но может поможет.
Импортируйте скрипт 2D/CameraFollow. Киньте на камеру. Player'у поставьте тег "Player". Настройте минимальную и максимальную точки для камеры в инспекторе.
Цитатаdreenline ()
Как у вас в Tiled получается выдерживать пропорции уровня?
Пропорции определяются опцией "Pixel Per Unit" на спрайтах. Я ставлю 1. Тогда и камере придётся ставить размер, например, 150.
Я так делают: - открываю Tiled Map Editor - добавляю фоновый рисунок уровня (который буду обводить тайлами) - выставляю фоновому рисунку прозрачность 50% - добавляю слой для тайловой карты - кидаю TileSet на окно TileSet выставив 16x16 пикселей на тайл - обвожу всёю карту - экспортирую id тайлов и их положения через меню File->Export CVS - теперь есть карта расположения тайлов и их ID - открываю оригинальный TileSet в Unity. Разбивает на тайлы в "Sprite Editor" - мы можем создать прифабы и вставлять их в цикле в положения которые мы получили от редактора Tiled
Сообщение отредактировал 8Observer8 - Четверг, 13 Августа 2015, 10:34
У меня проблемы нет. Как я ее решил - я сказал в видео. Сделал зазор 1 пиксель.
Я показал за сполером выше. Там проблема не в один пиксел, гораздо меньше. Щель между тайлами. Я заметил, что в вашем клоне танчиков, проблему не видно на разрешении 800x600, а на 1024x728 её видно.
Добавлено (13 августа 2015, 13:00) ---------------------------------------------
Цитатаseaman ()
Сделал зазор 1 пиксель.
Эту проблему "с засвечиванием соседнего тайла" я решил, тем, что тоже сделал зазор в один пиксел, но только с помощью этого плагина для GIMP'а
Добавлено (13 августа 2015, 13:10) --------------------------------------------- seaman, проблема в том, что у вас между тайлами есть щели в некоторых местах. Вот я и спрашиваю, как её решить? У меня сейчас точно такая же проблема.
Добавлено (13 августа 2015, 18:36) --------------------------------------------- Давайте пока проблему с щелями отложим. Искал я много в интернете, и пока ничего не нашёл.
Не нашёл я и решение следующей проблемы. Марио проваливается в предмет, то есть коллайдеры пересекаются и это здорово заметно:
Сообщение отредактировал 8Observer8 - Четверг, 13 Августа 2015, 22:00
Как убрать совсем? Как здесь у меня уже несколько лет назад было описано: Альфа маска Делаем зазор больше - как минимум два пиксела. Вокруг спрайта делаем обводку тем же цветом, что соседние пиксели самого спрайта. Получаем нечто такое: ... Т.е. картинка 34*34 а спрайт того же размера 32*32 Результат: ... Сверху без такой обводки. Снизу с ней. Сорри, картинки потерялись
Сообщение отредактировал seaman - Понедельник, 14 Сентября 2015, 22:49
Делать в захлёст! А это идея! Посмотрю по ранее озвученным инструментам, так как это дело нужно максимально автоматизировать.
Добавлено (14 августа 2015, 18:04) --------------------------------------------- Мне одному кажется, что игра немного подтормаживает или нормально? SuperMario_1.3.0 (win).7z
Добавлено (17 августа 2015, 15:49) --------------------------------------------- Я проверил притормаживает ли Марио на более мощной машине. Оказывается, нет. Это всё из-за того, что я генерирую все префабы с тайлами сразу. Я вижу один простой выход. Раз уровень хранится в двумерном массиве, то я могу разбить его на минимальные куски. Подгружать постепенно новые куски карты и уничтожать те, что пройдены.
По поводу решения с просветом между тайлами, которое предложил seaman выше. Я не нашёл готовых программ, которые бы преобразовывали тайлсеты так, чтобы тайл увеличивался на два пикселя в каждую из 4-х сторон. Возможно у меня получится написать плагин для GIMP. Сначала рассматривал вариант на скриптах C# с помощью GIMP#, но проект с 2012 года не развивается и работает только с GIMP 2.4. Остаётся вариант Python-Fu. У меня есть небольшой опыт скриптинга на Python BGE. Тем более опыт написания плагинов для GIMP может пригодится.
Сообщение отредактировал 8Observer8 - Понедельник, 17 Августа 2015, 16:06
преобразовывали тайлсеты так, чтобы тайл увеличивался на два пикселя в каждую из 4-х сторон
можно написать скрипт на шарпе прямо в юньке... использовать Texture2D, GetPixel, SetPixel Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
А я смогу потом нарезать полученную текстуру с помощью "Sprite Editor"? Будет ли это сложнее, чем написать плагин для GIMP?
Пока что я понял, как работать с GIMP'ом через Python. Это довольно просто. Есть консоль, которую можно отрыть так: в меню выбрать "Filters" -> "Python-Fu" -> "Console"
В консоле есть кнопка "Browse...". При нажатии отрывается справка, где можно искать API функции, читать описания. Например, можно навести на кнопку с пипеткой и увидеть её название: "Color Picker". Ввести это название в поиске окна "Browse...". Найдётся функция: gimp-color-picker. Можно прочитать её описание и какие аргументы она принимает. Если выделить функцию и нажать кнопку "Apply", но в консоль скопируется следующее:
Цитата
color = pdb.gimp_color_picker(image, drawable, x, y, sample_merged, sample_average, average_radius)
У меня такая идея. Сначала применить этот скрипт, чтобы сделать расстояние между тайлами в 5 пикселей. А потом в своём скрипте брать пипеткой цвет на краю тайла и рисовать с помощью функции gimp.pencil рядом ещё два таких пиксела. И так для каждого крайнего пиксела.
Сообщение отредактировал 8Observer8 - Вторник, 18 Августа 2015, 13:39
Большое спасибо, что напомнил о Ocllusion Culling. Обрати внимание, что на видео, хотя и дата 2015 года, но используется старый подход, когда эта опция входила в Pro версию. Я прочитал в документации, что для включения опции нужно поставить для объектов "Occludee Static", потому что у меня объекты не перекрывают другие. Всё равно так же подтормаживает перемещение камеры, но что интересно FPS не просидает ниже 70. А ещё я попробовал убрать галочки "Occludee Static" и FPS остался на том же уровне.
Сообщение отредактировал 8Observer8 - Вторник, 18 Августа 2015, 18:19
А ещё я попробовал убрать галочки "Occludee Static" и FPS остался на том же уровне.
Так правильно, это же комп, да ещё и игрушка с таким графоном. А представь себе игру с графонистым графонием да на слабой мобилке. От тебя эта мобилка убежит А на счёт 70 FPS Это что-то в скриптах перемудрил. Я делаю 3д платформер, проверял на слабом и мощном железе и там и там ниже 90 не снижалось. На счёт подтормаживания камеры, это дело опять же в скрипте самой камеры. На ассет стор есть отличный "Standard Assets" там есть пример 2д платформера, всё отлично и как надо работает. Возьми скрипт камеры оттуда. ассет
На ассет стор есть отличный "Standard Assets" там есть пример 2д платформера
Скрипт я оттуда и взял. Называется CameraFollow.
Цитатаbasist ()
Это что-то в скриптах перемудрил.
Я посмотрю внимательнее.
Я написал скрипт на Python для GIMP:
add-pixels-to-tiles.py
Код
#!/usr/bin/env python # -*- coding: utf-8 -*-
# add-pixels-to-tiles v1.0: Python-fu plugin for GIMP 2.8 # Copyright Ivan Enzhaev (8Observer8) [http://ivan.enzhaev.name], 2015 # Licence GPL-2 # Installation: put the file into /GIMP 2/lib/gimp/2.0/plug-ins
from gimpfu import * import os
def python_fu_add_pixels_to_tiles(tile_size = 16): # Get image image = gimp.image_list()[0] # Get drawable drawable = pdb.gimp_image_get_active_drawable(image) # Get width and height width = pdb.gimp_image_width(image) height = pdb.gimp_image_height(image)
# Right x = 17 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x+1,y,x+2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 17 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Top x = 2 y = 2 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y-1,x,y-2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 2 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
# Left x = 2 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x-1,y,x-2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 2 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Down x = 2 y = 17 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y+1,x,y+2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 17 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
register( "python_fu_add_pixels_to_tiles", "Add a few pixels to tiles", "Add a few pixels to tiles", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "8/18/2015", "AddPxToTiles", "*", [ (PF_INT, "tile_size", "Tile Size", 16) ], [], python_fu_add_pixels_to_tiles, menu="<Image>/Filters/Map", )
main()
который вот это изображение:
преобразует в это:
Скрипт работает 8 минут 25 секунд. Попробую сначала переписать его для Photoshop на JavaScript. Если будет так же долго, то буду писать плагин для Unity. Если и это не поможет, то буду делать алгоритм оптимальнее.
Добавлено (19 августа 2015, 19:25) --------------------------------------------- Я решил пока не терять время с плагинами. Работает, пусть и медленно. Но мне же один раз нужно обработать TileSet.
По поводу Occlusion Culling. Здесь я узнал, что объекты должны скрываться даже на Scene. Для построения сетки нужно чтобы все объекты были на сцене.
Я создал пустой объект CreateWorld_1_1. Повесил на него скрипт с тем же именем, в котором в Start'е создавал уровень. Но теперь я Start переименовал в CreateWorld. Создал скрипт World_1_1_Inspector, который унаследовал от Editor. Теперь я могу построить уровень до запуска игры:
Код
using UnityEngine; using System.Collections; using UnityEditor;
[CustomEditor(typeof(CreateWorld_1_1))] public class World_1_1_Inspector : Editor { private CreateWorld_1_1 world;
void OnEnable() { world = (CreateWorld_1_1)target; world.CreateWorld(); }
public override void OnInspectorGUI() { if (GUILayout.Button("Hello")) {
} } }
Попробую теперь реализовать Occlusion Culling.
Добавлено (19 августа 2015, 20:14) --------------------------------------------- Оказывается, для работы Occlusion Culling нужен "Mesh Renderer", а не "Sprite Renderer".
Добавлено (19 августа 2015, 20:53) --------------------------------------------- У меня вот здесь ошибка:
Код
void OnEnable() { world = (CreateWorld_1_1)target; world.CreateWorld(); }
Нужно по кнопке мир создавать. А то в OnEnable у меня столько копий насоздавалось.
Опция Occlusion Culling работает только для 3D. Есть выход - использовать этот самодельный, который предложил basist.
Сообщение отредактировал 8Observer8 - Среда, 19 Августа 2015, 20:55
Жееесть!! Неужели для уровня длинной в 30 секунд бега Марио так актуальна тема окклюзинга??!? Тут что-то ОЧЕНЬ СИЛЬНО не то, раз такой вопрос вообще возникает! Если наипростейшая локация "тормозит" - значит что-то в подходе к решению задачи конкретно не так!! У меня на старой юньке один раз сцена с двумя кубами, коллайдерами, и от камеры в мышь - рейкастом тормозил адски.. Новичок был, думаю - "как так то?! это же.. юнити! он должен легко справляться!". Дело все было в том что в апдейте я поставил Debug.Log() по координатам рейкаста - и выдавая тысячи логов редактор тормозил безбожно вообще.. Надо найти логический загруз в методике работы локации, а не окклюзинг туда лепить!! Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Четверг, 20 Августа 2015, 09:28
# add-pixels-to-tiles v1.0: Python-fu plugin for GIMP 2.8 # Copyright Ivan Enzhaev (8Observer8) [http://ivan.enzhaev.name], 2015 # Licence GPL-2 # Installation: put the file into /GIMP 2/lib/gimp/2.0/plug-ins
from gimpfu import * import os
def python_fu_add_pixels_to_tiles(tile_size = 16): # Get image image = gimp.image_list()[0] # Get drawable drawable = pdb.gimp_image_get_active_drawable(image) # Get width and height width = pdb.gimp_image_width(image) height = pdb.gimp_image_height(image)
# Right x = 17 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x+1,y,x+2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 17 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Top x = 2 y = 2 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y-1,x,y-2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 2 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
# Left x = 2 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x-1,y,x-2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 2 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Down x = 2 y = 17 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y+1,x,y+2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 17 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
register( "python_fu_add_pixels_to_tiles", "Add a few pixels to tiles", "Add a few pixels to tiles", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "8/18/2015", "AddPxToTiles", "*", [ (PF_INT, "tile_size", "Tile Size", 16) ], [], python_fu_add_pixels_to_tiles, menu="<Image>/Filters/Map", )
main()
Для установки, скрипты нужно поместить в директорию: /GIMP 2/lib/gimp/2.0/plug-ins После копирования, скорее всего, нужно перезапустить GIMP
Первый скрипт появится в меню: Filters -> Map -> TileSet -> "Add spacing and margin" Второй скрипт появится в меню: Filters -> Map -> AddPxToTiles
Решение показано на рисунке:
Добавлено (08 апреля 2016, 23:12) --------------------------------------------- По поводу моего сообщения выше: проблема с просветами и бликами на границе тайлов/спрайтов. И о её решении с помощью добавления одного или двух пикселей по периметру тайла/спрайта
Оказывается (сам сегодня обнаружил), проблема решается проще, чем писать свой скрипт на Python для GIMP. Блики и просветы можно убрать одним и тем же плагином
Я на сриншоте покожу эти два пункта: первый пункт "Add spacing and margin" добавляет расстояние от края (то есть Margin, это как Offset в Unity) и расстояние между тайлами (то есть Spacing, это как Padding в Unity), а второй пункт "Fill Spaces" добавляет по периметру, например, один пиксель
Вот эти пункты меню:
Далее, в Unity нужно указать соответсвующие Offset и Padding:
Сообщение отредактировал 8Observer8 - Пятница, 08 Апреля 2016, 23:27