Простейшим решением будет настроить Edit->Project Settings->Script Execution Order
забыл написать, это я тоже сделал по крайней мере для 4-5 файлов, я не уверен как это работает и стоит ли добавлять слишком много скриптов сюда, поэтому я туда добавил только самое важное
Сообщение отредактировал alexsilent - Пятница, 02 Ноября 2018, 14:46
Я художник, но никто не за меня не напишет код, поэтому занимаюсь также и кодом. Вот уже 17-18 лет, не просите меня бросить это, уже поздно)
Задумался о том, что пора приводить свой код в порядок. А то всегда хаос получается. И узнал интересное слово архитектура, малость погуглил про это, сам я пишу код методом проб и ошибок, как художник (мазками, лол), а эти сложные штуки старался обходить всегда.
Но каждый раз у меня хаос в коде, например, есть несколько объектов, которые должны запускаться по очереди, через Awake или Start функцию после загрузки уровня, и если один из объектов раньше запустится, чем другой, то могут быть баги, в зависимости от разных обстоятельств, очень сложно указывать, какой скрипт должен запускаться раньше других, они всегда хаотично стартуют.
Так вот, как написать самую простейшую архитектуру, где будут учитываться глобальные переменные, и отдельные важные скрипты будут просыпаться раньше, чем другие? И чтобы она выглядела просто даже для художника.
PS Пока что у меня такая хаостектура:
1) На каждом уровне есть обязательный объект со скриптом Global, где все важные статические переменные и функции, также там загрузка и сохранение, как бы сердце игры, и этот объект никогда не удаляется, но удаляются другие такие же с таким же скриптом, если мы перезагружаем этот уровень или загружаем новый, чтобы не дублировались (зачем нужен Global на каждом уровне? чтобы запускать вообще любой уровень, не заходя в главное меню, для тестирования) Это очень костыльно выглядит. 2) Дальше идут вторые по важности скрипты, управление уровнем, которые вначале распределяют разные ресурсы и префабы по местам 3) создаётся главный персонаж и размещается на свои координаты 4) потом всё остальное
Сообщение отредактировал alexsilent - Пятница, 02 Ноября 2018, 13:29
Добавлено (31 Октября 2018, 10:47) --------------------------------------------- А он реально для юнити пойдёт? И походу он платный, пишут про Free Trial 30 days
Сообщение отредактировал alexsilent - Среда, 31 Октября 2018, 10:48
Разобрался как сделать для одной версии notepad++, а для другой версии Visual Studio, поставил в настройках юнити External Script Editor: "open by file extension"
Только непонятно почему по умолчанию мне русский язык на Visual Studio поставили, вчера весь день пытался смутно постичь почему я не понимаю, что написано в интерфейсе, а просто не привык к русскому языку в редакторах, все эти необычные слова: "правка", "отладка" и прочее, сегодня поставлю английский язык, а то по 3-5 минут торможу в редакторе из-за непривычности слов.
Добавлено (31 Октября 2018, 06:38) --------------------------------------------- Ещё понравилась быстрая вставка кода: snippets, но там нужно знать XML, мне очень тяжело даётся чтение и написание такого кода, жаль нельзя конвертировать из обычного текста в такую версию на лету в Visual Studio:
Добавлено (31 Октября 2018, 09:47) --------------------------------------------- Нашёл плагин Snippet Designer, ещё не пробовал, но по описанию выглядит неплохо
Сообщение отредактировал alexsilent - Среда, 31 Октября 2018, 06:45
В конечном итоге придётся пока пользоваться Notepad++, потому-что в настройках External Script Editor разных версий юнити нельзя поставить разные редакторы, а Visual Studio не работает с яваскриптом. А мои старые проекты все поголовно написаны на юнити скрипте, печалька, либо придётся каждый раз переключать руками при заходе в разные версии юнити, что немного геморно.
Сообщение отредактировал alexsilent - Вторник, 30 Октября 2018, 15:51
Перехожу на C# с юнити скрипта, и первый раз в жизни качаю Visual Studio из сборки юнити при установке 2018.2, раньше всегда пользовался Notepad ++ для яваскрипта. И Notepad с поддержкой тонны языков весит копейки, а Visual Studio весит так, как будто у него там куча графики и звуковых файлов, почему оно такое большое? И нет ли где ссылки на минимальный вес, где только самое важно в Visual Studio, без лишнего? c моим диском в 500 гб, лишние гигабайты не бывают лишними.
PS и можно ли в Visual Studio, как в Notepad ++ искать по всем скриптам проекта какое-то слово? Этой функцией я очень часто пользуюсь, полезно узнать сколько раз я использовал функцию или переменную вообще в проекте. А то может проще остаться на Notepad++
Сообщение отредактировал alexsilent - Вторник, 30 Октября 2018, 13:48
Можно ли поменять границу спрайта не меняя Pivot позицию в Sprite Editor? (может быть есть такой режим?)
К примеру я захотел увеличить оружие (перерисовал чуть спрайт), а если двигать край границы спрайта в Sprite Editor, то Pivot точка тоже сдвигается, хотелось бы чтобы эта точка оставалась на месте в такой ситуации, так было бы удобнее редактировать разные части тела или оружия и одежды, где Pivot оси ювелирное дело, и нельзя чтобы они сдвигались ни на миллиметр.
Добавлено (29 Октября 2018, 13:01) --------------------------------------------- Вот пример, сейчас мне нужно чуть бордюр шеи увеличить, потому-что я увеличил рисунок шеи, но если я начну сдвигать барьер спрайта, то ось опять окажется смещена, и придётся очень долго подгонять это дело,
хуже всего придётся, когда я буду копировать это тело и делать из него одежду, у одежды будут дополнительные штуки, которые будут выходить за рамки спрайта, и ось будет постоянно сдвигаться, неужели не предусмотрена такая фишка в юнити? Я что-то не нашел своими силами и гугла.
Сообщение отредактировал alexsilent - Понедельник, 29 Октября 2018, 13:02
ну хэллоуин скоро будет, но похоже конкурс как раз после хэллоуина и стартанёт, но однако можно всё равно тему ужастиков предложить в духе праздника всех святых
Сообщение отредактировал alexsilent - Пятница, 26 Октября 2018, 16:43
Например Потребительский Аполкалипсис, когда все крышки, бутылки, упаковки и пакеты загадили всю планету) к чему в принципе мы и идём, если не откажемся от этих проклятых упаковок даже для простых конфет несколько слоёв упаковки
Сообщение отредактировал alexsilent - Среда, 24 Октября 2018, 11:36
Для того что ты хочешь используется Scriptable Object - читай о них в документации юнити.
Попробовал я этот Scriptable Object, как на примере в видео юнити, каждая строчка кода идентичная, и данные тупо не сохраняются, через некоторое время объект становится пустым, нашёл куча жалоб, что у народа тоже не сохраняется инфа и нужно делать что-то типа SetDirty или как-то так, и я так и не смог это повторить, как в примере юнити. Короче это намного усложняет проект, чем если я просто изменю префаб без всяких дополнительных скриптов он сохранится сразу же
Добавлено (23 Октября 2018, 13:05) ---------------------------------------------
ЦитатаSnakeR ()
Да вы батенька изобрели синглтон, надо же)
С синглтоном я пока тоже не разобрался, как-то там сложно всё выглядит, наверное с непривычки , я ещё только перехожу с яваскрипта на C#, хотя может там такое тоже было, но я не встречал
Добавлено (23 Октября 2018, 13:06) ---------------------------------------------
Цитатаpixeye ()
на поясницу?
ну главная причина, что в статичных функциях нельзя локальные переменные ставить
просто я подумал, если у меня будет 40 статических функций в скрипте, то может проще сам скрипт сделать статическим, а функции обычные ну так и получилось сделать такой велосипед)
PS ну то есть можно смело пользоваться таким велосипедом?
Сообщение отредактировал alexsilent - Вторник, 23 Октября 2018, 13:15
Последнее время отказываюсь от Static функций, хотя бы потому-что в них нельзя держать локальные переменные. А ещё кажется, что чем больше статичных функций, тем больше нагрузка. Вместо этого я делаю префаб, куда запихиваю весь скрипт со Static переменной it.
К примеру:
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class MyScript : MonoBehaviour {
static public MyScript it;
// Use this for initialization public void Init() { it = this; }
public void GetPrint() { print("It's Okay!"); } }
И потом, из одного скрипта один раз за всю игру инициирую этот скрипт из префаба с помощью функции Init (префаб не создаю в уровне, он просто указан, будет ли тут проблема? например для каких-то других платформ не ПК),
Скрипт, где инициируется MyScript, тут указатель на скрипт из префаба (который находится в ассетах, но не на уровне)
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Getted : MonoBehaviour {
public MyScript myScript;
// Use this for initialization void Start () { myScript.Init(); // инициирую MyScript.it.GetPrint(); // тест проверка на работоспособность } }
И потом когда нужны функции этого скрипта или данные я обращаюсь к этому скрипту вот так:
MyScript.it.GetPrint();
Также можно тут брать любые сложные данные, например список всех рас или список всех вещей или локализация текста.
Вроде прикольный способ избежать статичные функции, но может быть я создаю какие-то невидимые проблемы, хотя бы потому-что префаб так и не был создан со скриптом на уровне, или может быть другая причина.
PS Сам я не программист, поэтому более сложные способы я всё равно не вывезу, а такой кажется на первый взгляд вполне приемлемым.
Сообщение отредактировал alexsilent - Понедельник, 22 Октября 2018, 11:00
Раньше, когда ещё можно было обращаться напрямую к rigidbody вот так
Код
rigidbody.velocity = new Vector(1,1,0);
разработчики юнити, говорили, что надо кэшировать transform, то есть писать на старте
Код
MyTransform = transform;
иначе доступ к transform.position был медленнее, чем MyTransform.position (почему-то)
Но в новых версиях избавились вроде от лишнего мусора, и теперь к rigidbody нужно обращаться как к компоненту, через GetComponent, но я до сих пор кэширую по привычке transform, мой код выглядит примерно так:
Код
Transform trans; void Start() { trans = transform; } void Update() { trans.position = new Vector3(1,1,0); }
Стоит ли кэшировать Transform теперь, ведь скорее всего код юнити давно претерпел какие-то критические изменения?!
PS А я только сейчас об этом задумался, лол)
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 18:47
Почему в Вашем коде имя класса написано с маленькой буквы, а вот имя функции наоборот с большой?
1) Это про "string" в C# коде? я забыл String пишется с маленькой или с большой в C# коде... Я быстро писал, если б компилятор поругался, то исправил бы, но мне хватило того, что всё равно не поддерживается особенность ".?"
2) Или это про "Manager.it.PoseNum"? у меня it это глобальная переменная static it - которая обращается к всему скрипту (классу? наверное это так называется в C#) в котором сейчас находится, для удобства быстрого доступа, правда код не на C#, а Яваскрпите пишу, а то я пока не особо привык:
Код
static var it : MyThatScript; function Init() { it = this; // один раз инициировать, и потом можно всегда обращаться к этому скрипту // даже если этот объект со скриптом вообще не в сцене и не создан, а находится в префабах }
*************** (it - с маленькой потому-что так меньше писать, не надо шифт жмякать в этот момент, я вообще ленивый и чем меньше действий делать, и чем меньше и короче фраза тем лучше для меня, а у функций и переменных с большой буквы, потому-что привык функции выделять и важные переменные, а it не важная переменная, она должна почти слиться с продолжением названия своего скрипта, чтоб не выделялась, да я знаю это очень странная философия) мне просто вообще хотелось бы обращаться к скрипту вот так
Код
Manager.MyVariable = 1; Manager.MyFunction();
но так можно обращаться только к статическим переменным и функциям, а статические функции накладывают такие ограничения как то что внутри статической функции нельзя добавлять локальные переменные, и я решил избавиться от статических функций, обращаясь всего один раз к классу
[url=https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/490acw3e(v%3Dvs.95)]String.IsNullOrEmpty[/url] ?. и ?[]: операторы с условием NULL
seaman, спасибо, крутая опция в C# есть, надо бы погуглить есть ли такое в Яваскрипте (ибо у меня всё ещё остались проекты на юнити на яваскрипте, а на шарп я пока только перехожу).
Добавлено (11 Октября 2018, 16:46) --------------------------------------------- Жаль, не хочет работать такой код на яваскрипте
Код
#pragma strict
function Start () { var text : String = null; if (text?.length == 0) { print("text is empty!"); } }
Добавлено (11 Октября 2018, 16:54) --------------------------------------------- оказывается такой код не работает даже в C# на юнити... (у меня версия 2018.1.8f)
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class testCsh : MonoBehaviour {
void Start () { string text = null; if (text?.length == 0) { print("text is empty!"); } } }
А компилятор извиняется, что не поддерживает такую особенность о_О
Код
Assets/4 SCRIPTS/testCsh.cs(9,11): error CS1644: Feature `null propagating operator' cannot be used because it is not part of the C# 4.0 language specification
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 17:07
не выдавалась бы ошибка, если массив MyArray ещё не инициирован, ведь по логике раз объект не инициирован , то и length всё равно равен нулю, таким образом убили бы двух зайцев, просто бы молча бы согласился с утверждением , что length равен нулю
2) тоже самое и с кодом String
Код
if (MyString != "") {}
не выдавалась бы ошибка, если MyString равен null, по логике всё равно там пусто, ну и согласился бы компилятор с этим условием, а не ругался бы...
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 16:21
Когда null, речь идёт о пустом текстовом объекте. Когда "" - о пустой строке внутри непустого текстового объекта. Ну это если попытаться объяснить простыми словами
Это я понимаю, просто имел ввиду, что не понятно когда текстовой объект инициирован, а когда нет, поэтому на всякий случай ставлю всегда две проверки, и это немного утомляет
ЕСЛИ({Не инициирована поза} ИЛИ {Не инициирован массив ActsA} ИЛИ {В этом массиве нет яйчеек})
помимо того что фраза {В этом массиве нет яйчеек} проверяет второй раз существует ли массив (чтобы не вылететь с ошибкой, если массив ещё не инициирован, так она и ещё очень длинная и неудобная)
а хотелось бы чтобы была всего одна проверка, типа так:
Код
ЕСЛИ ({Не инициирована поза} ИЛИ {Не инициирован массив}) {...}
где в фразу "Не инициирован массив" - входит вообще вся проверка, что он инициирован и что там есть яйчейки
**************** Тоже самое и с текстом, иногда не понимаешь когда String имеет свойство null, а когда "", поэтому приходится делать две проверки для этого, вместо одной
Код
if (MyString && MyString != "")
проверяю пустой ли текст null или пустой текст "" , по каким-то странным причинам это два разных условия, можно ли упростить мою проверку?
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 15:14