Извиняюсь что сразу всем не ответил.
Спасибо всем за дельные советы отзывы и ошибки.
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