colorus раскраска для малышей. [github]

Форум, посвящённый готовым проектам на базе Unity3D

colorus раскраска для малышей. [github]

Сообщение Nicloay 08 июн 2013, 00:01

Ура, я наконецто закончил бета версию раскраски на юнити.

Изображение

Разработка началась в Августе прошлого года, потом в сентябре затухла, и вот с марта этого года с новыми силами был полностью переработан дизайн, добавлены новые фичи типа undo redo zoom и прочие интересные чтуки.

В проекте используется собственный спрайт менеджер ранняя версия которого доступна здесь (в скором времени после окончательной допилки выложу основную часть которая включает clipping rect, scrollbars, atlasmigration и еще что то там по мелочам)

Разработку вели вдвоем с женой, она рисовала, я программировал.
Что самое интересное в проекте :
  1. история, 10 плейнов друг перед другом с разными слоями (из за этого возможен ролбак)
  2. 2е камеры, одна для интерфейса, 2я для workspace-а
  3. Алгоритм заливки (floodfill)
  4. Шейдеры, ну они не сильно сложные, но поработать с ними было интересно (шейдер который режет окошки при выборе штампа или картинки).
  5. Интерполяция сплайнами и свой лайнрендерер (первоначально при рисовании строится цепочка мешей, после этого интерполируется и копируется на текстуру)
  6. ну и конечно атлас спрайты и что с ними связано.
под спойлером страница с приложением, хотя лучше перейти на http://colorus.nicloay.com
Скрытый текст:





п.с. все сделано под размер 1024x768.
В планах завершить багфикс основных проблем (иногда лайнрендерер глючит, штампы альфаканал пихают который не заливается). После этого приложение вконтакте в фейсбуке, ну и после этого ios и android.


ну и самое сладкое
Исходники на гитхаб
Последний раз редактировалось Nicloay 04 июн 2015, 13:25, всего редактировалось 4 раз(а).
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение Woolf 08 июн 2013, 00:22

Забавно, только у меня чегойто не раскрашивало )
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: colorus расркраска для малышей.

Сообщение Nicloay 08 июн 2013, 00:29

Ой ой. Спасиба. Завтра на win проверю.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение BornFoRdeatH 08 июн 2013, 00:32

win 8, chrome, полет нормальный. Малость доставляет когда быстро кликаешь заливкой и все подлагивает, думаю стоит ввести проверку на цвет заливки :)
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: colorus расркраска для малышей.

Сообщение Nicloay 08 июн 2013, 00:39

Каждый раз кликая, происходит просчет области заливки. Плюс основное время уходит на texture.apply там я пока ничего оптимизировать не могу.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение BornFoRdeatH 08 июн 2013, 00:43

Так я и говорю, получить цвет клика и сравнить с цветом заливки, если одинаковые то накой черт писать белым по белому)))
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: colorus расркраска для малышей.

Сообщение Nicloay 08 июн 2013, 01:40

Ну если только такой редкий случай.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение waruiyume 08 июн 2013, 01:49

4 раза за 2 минуты.

До нормального ФПС поднимается при нажатии обновить страницу(хм.. или при выходе курсора их плеера, не заметил точно).
-------------
-------------
Выезжание панели инструментов по таймеру- неудобно. Напрягает отсутствие копки "назад", в окне штампов.
Прикольная тема (3A4OT)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: colorus расркраска для малышей.

Сообщение Nicloay 08 июн 2013, 07:06

waruiyume Спасибо за багу. уже работаю над ней.

Про выезжающую панель, согласен с тобой, что то каша в голове была когда реализовывал.. хотелось и избежать лишних кнопок и чтоб в случае нужды переключения инструмента, например с штампа на кисть, не надо было показывать весь выпадающий список..

Про окошко выбора штампа, текстуры крестика уже готова Изображение скоро прикручу
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение AndreyMust19 08 июн 2013, 10:55

У меня браузер виснет при попытке зайти на ваш сайт (или открыть спойлер).
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: colorus расркраска для малышей.

Сообщение Nicloay 08 июн 2013, 11:18

AndreyMust19 писал(а):У меня браузер виснет при попытке зайти на ваш сайт (или открыть спойлер).

Можешь пожалуйста указать о.с. систему, и браузер, ну и если не сложно то лог вебплеера глянуть. я попробую повторить.

если что лог можно найти тут
Webplayer
Mac OS X ~/Library/Logs/Unity/WebPlayer.log
Windows XP * C:\Documents and Settings\username\Local Settings\Temp\UnityWebPlayer\log\log_UNIQUEID.txt
Windows Vista/7 * C:\Users\username\AppData\Local\Temp\UnityWebPlayer\log\log_UNIQUEID.txt
Windows Vista/7 + IE7 + UAC * C:\Users\username\AppData\Local\Temp\Low\UnityWebPlayer\log\log_UNIQUEID.txt
(*) On Windows the webplayer log is stored in a temporary folder: %TEMP%\UnityWebPlayer\log\log_UNIQUEID.txt, where TEMP is defined by GetTempPath.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение Acrobat 08 июн 2013, 22:31

Приложение- отличное!
Интерфейс удобный и понятный. Раскраски привлекатеьные. True!
Acrobat
UNITрон
 
Сообщения: 182
Зарегистрирован: 08 дек 2011, 16:16
Откуда: г. Нижний Новгород

Re: colorus расркраска для малышей.

Сообщение AndreyMust19 09 июн 2013, 09:24

WinXP sp3, Firefox 21.0

Запустил браузер с правами пользователя, у к-го есть права на запуск Unity3d.
Сайт открылся, но после скачивания файла ошибка:
WebPlayer_error01.PNG

Поставил плагин еще раз, все равно появляется эта же ошибка

В логе вот что:
Скрытый текст:
130609 10:13:38 ------------------------------------------------------------
130609 10:13:38 Instance starting, version 4.1.5f1_ed5ea3281df6, UNITY_WEB_ENABLE_AUTODOWNLOAD: 1, GetDisableAutoUpdates(): 0
130609 10:13:38 Datafile http://colorus.info/razukrashka4.unity3d
web: player version 4.1.5f1
web: failed to create window
130609 10:13:39 loader: start FAILED
Web Stream is Null
Web Stream is Null
130609 10:13:39 Setting error display: 'Error launching Unity Player', details: 'Failed to start Unity Player.
', link: 1
130609 10:13:59 Closing plugin window
130609 10:13:59 loader: final cleanup
130609 10:13:59 Closing plugin window
130609 10:13:59 Instance b8eab67cd2d95e48b8093ba4b12278f0 shutting down
У вас нет доступа для просмотра вложений в этом сообщении.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: colorus расркраска для малышей.

Сообщение Nicloay 14 июн 2013, 23:24

Извиняюсь что сразу всем не ответил.
Спасибо всем за дельные советы отзывы и ошибки. AndreyMust19 Извни, не починил твою ошибку, немного погуглил, пишут что это проблема плеера. но наверняка есть какаято зависимость от билда.

Учел практически все пожелания, кроме одного (окошко помощи, пока не сделал, ввиду сложности реализации (думаю делать либо без текста, но надо тогда рисовать что то понятное, либо с текстом, но тут уже надо придумывать менеджер шрифтов)

В новом билде починил ошибки, Добавились 3 новых раскраски
Изображение
плюс пустой лист, Пофиксил критические баги, типа невозможности сохранения, при выходе за пределы раскрашиваемого поля поведение кисточек ломалось) также добавил окошко подтверждение при сбросе картинки, не уверен что при выборе картинки тоже стоит показывать похожее.

полный список под спойлером
Скрытый текст:
Изображение


Немножко еще про дизайн. все спрайты это меши, меши генерятся через разные менюшки, и получается полный бардак, сегодня решил таки разгрести его, написал простенькую утилитку которая смотришь все меши в ассетах и все меш фильтры на сцене. Дальше можно посмотреть что чему соответсвтует, и если меш нигде не используется то можно его двинуть в специально подготовленую папку а те что используются в другую. В едиторе можно сортировать по колонкам (правда только в одну сторону) и по клику по кнопке с именем объекта переходит фокус на ассет или на объект на сцене. Скриншот окошка и код, под спойлером.
Скрытый текст:
Изображение

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;

public class UFTMeshCleanerWindow : EditorWindow {
        static string MESH_FOLDER_PROP="uft.meshfolder";
        static string MESH_TRASH_FOLDER = "uft.mesh.trash.folder";     
       
        string                             meshFolder;
        string                             meshTrashFolder;
        Dictionary<Mesh,List< GameObject>> objectList;
        List<MeshDetails>                  meshDetails;
        Mesh[]                             meshOrder;
        Vector2                            scrollPosition;
        bool                               useObjectNameAsMeshName = true;
       
       
        [MenuItem ("UFT/Mesh Cleaner",false,10)]
        static void CreateWindow () {
                UFTMeshCleanerWindow window = (UFTMeshCleanerWindow)EditorWindow.GetWindow (typeof(UFTMeshCleanerWindow));        
                window.initialize ();                  
        }
       
       
        void initialize(){
                meshFolder      = EditorPrefs.GetString(MESH_FOLDER_PROP ,"");
                meshTrashFolder = EditorPrefs.GetString(MESH_TRASH_FOLDER,"");
                updateMeshList();
        }
       
       
        void OnGUI () {
                if (GUILayout.Button("update list"))
                        updateMeshList();
                EditorGUI.BeginChangeCheck();
                meshFolder = EditorGUILayout.TextField("Relative path to mesh folder", meshFolder);
                meshTrashFolder = EditorGUILayout.TextField("Relative path to trash folder",meshTrashFolder);
                if (EditorGUI.EndChangeCheck()){
                        EditorPrefs.SetString(MESH_FOLDER_PROP,meshFolder);
                        EditorPrefs.SetString(MESH_TRASH_FOLDER,meshTrashFolder);
                }
                EditorGUILayout.LabelField("mesh count = ",""+meshDetails.Count);
               
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Mesh Object",GUILayout.Width(220)))
                        meshDetails.Sort(sortByName);
                if (GUILayout.Button("Mesh Path",GUILayout.Width(350)))
                        meshDetails.Sort(sortByPath);
                if (GUILayout.Button("Count",GUILayout.Width(100)))
                        meshDetails.Sort(sortByCount);
                EditorGUILayout.EndHorizontal();
               
                scrollPosition =  EditorGUILayout.BeginScrollView(scrollPosition);
                foreach (MeshDetails md in meshDetails){
                        EditorGUILayout.BeginHorizontal();
                       
                        if (GUILayout.Button(md.name,GUILayout.Width(220)))
                                selectObject((Object) md.mesh);                
                        EditorGUILayout.LabelField(md.path,GUILayout.Width(350));
                       
                        if (GUILayout.Button(""+md.count,GUILayout.Width(100)) && objectList.ContainsKey(md.mesh))
                                selectObjects((Object[]) objectList[md.mesh].ToArray());
                        EditorGUILayout.EndHorizontal();
                }
                EditorGUILayout.EndScrollView();
               
                useObjectNameAsMeshName = EditorGUILayout.Toggle("User object name as new mesh name",useObjectNameAsMeshName);
                if (GUILayout.Button("doo it!"))
                        cleanMeshes();
               
        }
               
        void cleanMeshes ()
        {
                for (int i=0;i < meshDetails.Count;i++){
                        MeshDetails md = meshDetails[i];
                        string oldPath = md.path;
                        string newPath = md.count > 0 ? meshFolder : meshTrashFolder;
                        if (useObjectNameAsMeshName &&
                                        objectList.ContainsKey(md.mesh) &&
                                        objectList[md.mesh]      !=null &&
                                        objectList[md.mesh].Count > 0 ){
                                string goName = objectList[md.mesh][0].name;
                                newPath += "/"+goName+".asset";
                        } else {
                                newPath += "/"+Path.GetFileName(oldPath);
                        }
                        newPath = AssetDatabase.GenerateUniqueAssetPath(newPath);
                        string res= AssetDatabase.MoveAsset (oldPath, newPath);
                        if (!res.Equals(""))
                                Debug.LogError(res);
                }
                updateMeshList();
        }
       
       
        void updateMeshList ()
        {
                objectList = new Dictionary<Mesh,List< GameObject>>();
                MeshFilter[] meshFilters = (MeshFilter[])Resources.FindObjectsOfTypeAll(typeof(MeshFilter));
                for (int i = 0; i < meshFilters.Length; i++) {
                        Mesh mesh = meshFilters[i].sharedMesh;
                        if (!objectList.ContainsKey(mesh)){
                                List<GameObject> list = new List<GameObject>();
                                objectList.Add(mesh, list);
                        }
                       
                        GameObject go = meshFilters[i].gameObject;
                        List<GameObject> meshObjectList = objectList[mesh];
                        if (!meshObjectList.Contains(go))
                                meshObjectList.Add(go);                
                }
               
               
               
                meshDetails = new List<MeshDetails>();
                Mesh[] resourceObjects =  (Mesh[]) Resources.FindObjectsOfTypeAll(typeof(Mesh));
                for (int i = 0; i < resourceObjects.Length; i++) {
                        Mesh mesh = (Mesh) resourceObjects[i];
                        string path = AssetDatabase.GetAssetPath(mesh.GetInstanceID());        
                        if (path.Equals(""))
                                continue;                              
                       
                               
                        MeshDetails md = new MeshDetails();
                        md.mesh = mesh;
                        md.name = md.mesh.name;
                        md.path = path;
                        md.count = (objectList.ContainsKey(mesh) ? objectList[mesh].Count : 0);
                        meshDetails.Add(md);
                }
                meshDetails.Sort(sortByName);
        }
        void selectObjects(Object[] selectedObject){
                Selection.objects = new Object[0];
                for (int i = 0; i < selectedObject.Length; i++) {
                        selectObject(selectedObject[i],true);
                }
        }
       
       
        void selectObject(Object selectedObject,bool append = false)
        {
                if (append)
                {
                        List<Object> currentSelection=new List<Object>(Selection.objects);                     
                        if (currentSelection.Contains(selectedObject))
                                currentSelection.Remove(selectedObject);
                        else
                                currentSelection.Add(selectedObject);
                       
                        Selection.objects=currentSelection.ToArray();
                }
                else Selection.activeObject=selectedObject;
        }
       
       
       
        private class MeshDetails{
                public Mesh mesh;
                public string name;
                public Object[] listOfObjects;
                public string path;
                public int count;
        }
       
        int sortByName(MeshDetails md1, MeshDetails md2){
                return md1.name.CompareTo(md2.name);
        }
       
        int sortByPath(MeshDetails md1, MeshDetails md2){
                return  (md1.path.CompareTo(md2.path));
        }
       
        int sortByCount(MeshDetails md1, MeshDetails md2){
                return (md1.count.CompareTo(md2.count));       
        }
}
 


update1
чтоб не засорять тему разными никому не нужными up-ами, буду писать апдейты в последнем сообщении если не было никаких ответов.
Из последнийх новостей.
Нас одобрили в вконтакте http://vk.com/app3712811
Последний раз редактировалось waruiyume 15 июн 2013, 00:14, всего редактировалось 1 раз.
Причина: Спойлер ломает подсветку кода.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: colorus расркраска для малышей.

Сообщение Syberex 19 июн 2013, 01:52

:ymapplause: замечательно!

Мне кажется надо бы облегчить выбор картинки маленьким художникам - типа сверху полоску с картинками.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

След.

Вернуться в Законченные проекты и Демо

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3