// Add menu named "CleanUpWindow" to the Window menu [MenuItem("Window/CleanUpWindow")] static void Init() { // Get existing open window or if none, make a new one: CleanUpWindow window = (CleanUpWindow)EditorWindow.GetWindow(typeof(CleanUpWindow), true, "Project Cleanup", true); window.Show(); }
void OnGUI() {
if (needToBuild) { GUI.color = Color.red; GUILayout.Label("Are you sure you remembered to build project? Because you really need to...", EditorStyles.boldLabel); }
GUILayout.BeginHorizontal(); if (!needToBuild) { if (GUILayout.Button("Clear EditorLog")) { clearEditorLog(); needToBuild = true; } }
GUI.color = Color.green; if (GUILayout.Button("Load EditorLog")) loadEditorLog();
if (groupEnabled) { GUILayout.Label("DEPENDENCIES"); for (int i = 0; i < includedDependencies.Count; i++) { EditorGUILayout.LabelField("", string.Format("{0} {1}", i, includedDependencies[i])); } }
if (GUILayout.Button("Selected Objects")) PrintSelected();
GUILayout.Space(10);
GUI.color = Color.red;
if (GUILayout.Button("Delete Selected", GUILayout.MinHeight(32))) DeleteSelected();
GUILayout.EndHorizontal(); for (int i = 0; i < objList.Value.Count; i++) { if (objList.Value[i] != null) { GUILayout.BeginHorizontal(); EditorGUILayout.ObjectField(objList.Value[i], typeof(Object), false, GUILayout.MinWidth(340)); toggles[objList.Key][i] = EditorGUILayout.Toggle(toggles[objList.Key][i]); GUILayout.EndHorizontal(); } } } } } }
EditorGUILayout.EndScrollView();
EditorGUILayout.EndVertical();
EditorGUILayout.EndHorizontal(); }
}
void PrintSelected() { foreach (KeyValuePair<string, List<Object>> kvp in unUsedArranged) { for (int i = 0; i < toggles[kvp.Key].Count; i++) { if (toggles[kvp.Key][i] == true) Debug.Log("" + unUsedArranged[kvp.Key][i]); } } }
void DeleteSelected() { if (!EditorUtility.DisplayDialog("Delete Unused Assets", "Are you sure you want to delete the selected assets? There is no going back.", "Delete", "Aaagh, stop!")) return;
foreach (KeyValuePair<string, List<Object>> kvp in unUsedArranged) { for (int i = 0; i < toggles[kvp.Key].Count; i++) { if (toggles[kvp.Key][i]) { AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(unUsedArranged[kvp.Key][i])); } } }
AssetDatabase.Refresh();
loadEditorLog(); }
void ToggleAll(bool val) { foreach (KeyValuePair<string, List<bool>> kvp in toggles) { for (int i = 0; i < toggles[kvp.Key].Count; i++) toggles[kvp.Key][i] = val; } }
void ToggleKey(bool val, string key) { for (int i = 0; i < toggles[key].Count; i++) toggles[key][i] = val; }
try { // Have to use FileStream to get around sharing violations! //System.IO.File.WriteAllText(UnityEditorLogfile, string.Empty); FileStream FS = new FileStream(UnityEditorLogfile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); //StreamReader SR = new StreamReader(FS); StreamWriter SW = new StreamWriter(FS);
unUsedArranged = new Dictionary<string, List<Object>>(); unUsedArranged.Add("plugins", new List<Object>()); unUsedArranged.Add("editor", new List<Object>()); unUsedArranged.Add("unsorted", new List<Object>()); unUsedArranged.Add("material", new List<Object>()); unUsedArranged.Add("texture", new List<Object>()); unUsedArranged.Add("model", new List<Object>()); unUsedArranged.Add("prefab", new List<Object>());
toggles = new Dictionary<string, List<bool>>(); foreach (KeyValuePair<string, List<Object>> kvp in unUsedArranged) { toggles.Add(kvp.Key, new List<bool>()); }
for (int i = 0; i < assetList.Length; i++) { if (!usedAssets.Contains(assetList[i])) { Object objToFind = AssetDatabase.LoadAssetAtPath(assetList[i], typeof(Object)); unUsed.Add(objToFind); string key = getArrangedPos(objToFind); unUsedArranged[key].Add(objToFind); toggles[key].Add(false); } } }
try { // Have to use FileStream to get around sharing violations! FileStream FS = new FileStream(UnityEditorLogfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader SR = new StreamReader(FS);
string line; while (!SR.EndOfStream && !(line = SR.ReadLine()).Contains("Mono dependencies included in the build")) {
} while (!SR.EndOfStream && (line = SR.ReadLine()) != "") { if (line.StartsWith("Dependency assembly - ")) { line = line.Substring("Dependency assembly - ".Length); } dependencyResult.Add(line); } while (!SR.EndOfStream && !(line = SR.ReadLine()).Contains("Used Assets")) {
} while (!SR.EndOfStream && (line = SR.ReadLine()) != "") {
Добавлено (24 августа 2016, 21:52) --------------------------------------------- NEBR, тот что на гифки, с плохим кодом, тень написана тоже специально, потому что стандартный эффект Shadow от Unity не совместим и на каждую букву расходует лишние 2 вершины, а Outline - это вообще 4 тени, соотвественно 8 лишних вершин на букву. Выкладываю простой код для обычного "печатания" через обновление Text.text:
Код
// Добавлять на объект с компонентом Text
using UnityEngine; using UnityEngine.UI; using System.Collections;
public class TypeEffect : MonoBehaviour { public float CharsPerSecond = 10f; public bool PlayOnStart = true;
[Tooltip( "* Можно не указывать\n" + "* Прокрутка будет автоматической, если Pivot у Text внизу" )] public Scrollbar VerticalScrollbar;
public void Play() { StartCoroutine(AnimateText()); }
IEnumerator AnimateText() {
for (int i = 0; i < text.Length + 1; i++) { textBox.text = text.Substring(0, i);
// Переход на новую строку TextGenerator ctg = textBox.cachedTextGenerator; if (ctg.characterCountVisible < i - 1) { float width = textBox.rectTransform.sizeDelta.x; float height = textBox.rectTransform.sizeDelta.y; textBox.rectTransform.sizeDelta = new Vector2(width, height + ctg.lines[0].height + 1); }
// Сдвигаем Scrollbar if (VerticalScrollbar) VerticalScrollbar.value = 0f;
yield return new WaitForSeconds(1f / CharsPerSecond); } } }
В этой строке
Код
textBox.rectTransform.sizeDelta = new Vector2(width, height + ctg.lines[0].height + 1);
происходит расширение области, где ctg.lines[0].height - высота первой строки, а +1 нужен чтобы текст держался на одном уровне. Почему именно +1 - не знаю, возможно где-то сломается, но у меня при разным размерах текста всё работало. Желательно делать Height у объекта с Text таким же как у Scroll View. Внешне будет не так красиво, потому что происходит перенос слов во время "печатания". Стандартная тень, конечно же, подходит.
Сообщение отредактировал Lertmind - Среда, 24 Августа 2016, 21:54
Emission в 0 тоже ставь и Lighting -> Scene -> Ambient Color в чёрный цвет, будет темно.
Добавлено (24 августа 2016, 09:30) --------------------------------------------- Здесь металлик в 0, его трогать нет смысла. Для блоков материла по умолчанию, если сделать Fade, то не будет виден, который на свету, лучше выбирать Opaque.
Добавлено (24 августа 2016, 09:44) --------------------------------------------- Хотя у меня на устройство всё равно темновато. Лучше не использовать динамический свет вообще, он жрёт ресурсы, а некоторые телефоны вообще могут не поддерживать pixel lighting, тогда свет будет выглядеть ещё хуже. В твоём случае можно обойтись специальным шейдером.
STRATEG766, читаем системные требования https://github.com/playgameservices/play-games-plugin-for-unity: Unity® 5 or above. Note:4.6.8 works at runtime, but some editor functionality does not work. as a result, use of older version of Unity are at your own peril.
Что написано ясно? Попробуй обновиться до Unity 4.7.2, если так нужен 4.x, а если не сработает - не жалуйся, допиливай сам.
Sanprabhu, на стороне клиента в принципе невозможно и не надо ничего защищать, потому что все покупки должны происходить через сервер, так же как и количество денег игрока хранится на сервере. Про мультиплеер в быстрых играх есть на хабре https://habrahabr.ru/post/302394/.
Sanprabhu, двойные кавычки убери, у тебя код выглядит так: float.Parse("\"100\"", CultureInfo.InvariantCulture), поэтому тебе пишут, что "не знаю символ \"". Либо не добавляй лишние кавычки, либо сделай трим: float.Parse("\"100\"".Trim('\"'), CultureInfo.InvariantCulture).
Car3man, нафига ты TextMesh Pro туда засунул, он же платный. Странно, что это не замечаешь: В общем, читай любой материал по pixel perfect (например), тогда твоя проблема должна отпасть.
Сообщение отредактировал Lertmind - Вторник, 16 Августа 2016, 06:43
Sanprabhu, если волнуешься о читерстве, то очевидно, что придётся это обеспечивать с помощью твоего сервера. Доступ к data/data/ есть у любого дурака с root. Без разницы каким образом ты хранишь данные, хоть в текстовом файле, их всё равно можно распотрошить. Странно, что ты полез делать сетевую игру не понимая элементарных вещей.
urbemAngeli, можно изменять локальные углы Эйлера (Transform.localRotation). Есть книга Building a Game with Unity and Blender - Lee Zhi Eng - 2015, там на странице 156 это используется.
Получилось не очень красиво из-за округления, можно по-другому, но сейчас я сразу не соображу. Если нужен FixedUpdate(), то не забывай менять Time.deltaTime на Time.fixedDeltaTime. А про Gimbal lock есть статья на хабре: https://habrahabr.ru/post/183116/.
Добавлено (14 августа 2016, 18:16) --------------------------------------------- Есть ещё одна простая техника, когда создаёшь пустых родителей, каждого для вращения по одной из осей. В твоём случае - два, для удобства можно ещё одного в корне, который будет без вращения.
Я так понимаю, ты хочешь изменить не "элементы префаба", а элементы конкретных экземпляров и не хочешь чтобы изменилось во всех экземплярах. Меняешь как обычно, через ссылки в скриптах или методы Transform, например через Find() по имени получаешь дочерний трансформ и у него вызываешь GetComponent().
ZVEN, можно иметь несколько Canvas, я поэтому и написал "Добавь отдельный Canvas". В твоём случае нельзя всё сделать в одном Canvas, но всё равно никаких значительных проблем возникнуть не должно. Про третий пункт уже писал, про сортировку: "Сортировка спрайтов настраивается через Sorting Layer и Order in Layer у компонента Sprite Renderer, где первое это логический слой, вроде "фон" и "слой уровня игрока", а второе задаёт порядок уже внутри слоя." Это нужно, чтобы определить какой спрайт ближе к камере. Допустим у мячика будет "Default, 0", если у Canvas выставить "Default, 1" - канвас будет перекрывать мяч, а если "Default, -1" - канвас будет позади. Если выполнить пункты 1 и 2 и ничего не изменять больше, вроде бы канвас останется позади, но лучше вынести в дальний слой.
Сообщение отредактировал Lertmind - Четверг, 11 Августа 2016, 16:09
Можно через скрипт закрепить положение, но обычно так, как ты хочешь, не делают. Если облака и солнце не игровые элементы, а только для фона, всё-таки можешь использовать UI: 1. Добавь отдельный Canvas для них 2. Выстави Render Mode -> Screen Space - Camera, в Render Camera укажи главную камеру 3. По желанию измени Sorting Layer на дальний слой, чтобы канвас рисовался как фон, либо изменяй Order in Layer как и для обычных спрайтов
Сообщение отредактировал Lertmind - Четверг, 11 Августа 2016, 03:21
Sanprabhu, если используешь в коде Shader.Find() и больше нет ссылок на этот шейдер, то он не будет включён в сборку, решения описаны в документации к Shader.Find() (один из них: добавить шейдер в папку Resources).
Рядом не валялся. Скучная игра про медленный шар на который падают шипастые балки. Анимации и эффектов минимум, так что глаз не радует. Я это называю "хрень уровня flappy birds".