А тут я просто не понимаю, например что за HandleUpdate
Ну у меня состояния делятся на три этапа - апдейт текущего, выход из текущего и заход на текущий. Это как OnEnable,OnDisable,Update для стейта. Это не суть важно потому что это внутреигровая логика и тебе необязательно ее понимать) Вот тот же код просто по фреймворку без игровой логики
Код
// создаем процессор с группой сущностей у которых должен быть компонент ComponentFSM sealed class ProcessorFSM : Processor<ComponentFSM>, ITick { // вместо апдейтов свой тик с уже вложенной дельтой public void Tick(float delta) { // source - это название группы если создаешь процессор таким образом // там есть свой итератор и ты можешь легко прогнать всех активных сущностей группы foreach (ent entity in source) { // достаем компонент из сущности. var cFSM = entity.ComponentFSM(); } } }
Такие "стейты" как ты показал я конечно тоже делаю но это вообще не относится к работе фреймворка) просто код)
Код
public static void OnLayer(ent entity, int layer) { var cObject = entity.ComponentObject(); var cRender = entity.СomponentRender(); var source = cRender.source;
pixeye, почитал статью) прикольно) мне очень понравилось! И мне тоже не нравится сложность меканима. https://github.com/dimmpixeye/blog-ru/issues/2
Чтобы не мучаться с этими стрелочками я их просто не добавлял. И запускаю анимацию скриптом:
Код
private var oldAnimMode : String; function Animate(AnimMode : String , SpeedCross : float) { if (AnimMode != oldAnimMode) { oldAnimMode = AnimMode; anim.CrossFadeInFixedTime(AnimMode,SpeedCross ); } }
то есть по сути, это просто самовольный запуск любой анимации, без раставления стрелочек, все переходы анимации написаны по старому внутри скрипта) так намного удобнее для меня, чем возиться с паутиной из стрелок)
просто совет вообще - не пытайся все понять в программировании. Вот ты в начале там форума написал что посмотрел на листы на майкрософте и малость прифигел) да я бы тоже прифигел. Все что тебе нужно знать о листах на начальном этапе это то что
Код
var myList = new List<int>(); myList.Add(10); myList.Remove(10);
Все. Ну тоесть если пытаться охватить все моменты сразу мозг может и поехать. Больше половины методов листов и прочих контейнеров нужны для всяких дополнительных кейсов типа сортировок, проверок и не имеют отношения к *сути* работы. В общем зри в корень XD
Потом ты понял что лист всеголишь массив и если на то пошло все контейнеры так или иначе идут от массива. Когда потолок достигается массив надо расширить. А это чего-то стоит. И допустим тебе на старте надо добавить 1000 элементов. И ты узнаешь что оказывается можно сделать коробку сразу на 1000 элементов. И таким образом на старте инициализации чуть облегчить себе бремя.
Код
var myList = new List<int>(1000); // вот так myList.Add(10); myList.Remove(10);
А ещё мой аниматор персонажей с кучей анимацией выглядит намного чище, чем классические сборки аниматора на юнити. Не паутина :P
Добавлено (05 Октября 2019, 10:39) ---------------------------------------------
Цитатаpixeye ()
Вот тот же код просто по фреймворку без игровой логики
так намного проще) чем меньше кода, тем мне легче вникнуть)
Цитатаpixeye ()
Все что тебе нужно знать о листах на начальном этапе это то что
В List мне ещё нужен был Push, то есть запихивание новой яйчейки в самое начало, сдвигая всех. Но в этой теме уже объяснили как делать, хотя я ещё не тестировал тот метод)
Плюс, теперь мне нужно понять как работать с Dictionary, хочу вызывать яйчейку по имени, а не номеру. Пошёл гуглить)
Добавлено (05 Октября 2019, 10:40) --------------------------------------------- pixeye, Спасибо большое за советы! Я ещё почитаю про Actors Фреймворк! В целом, мне нравятся вещи, которые упрощают жизнь в программировании.
Сообщение отредактировал alexsilent - Суббота, 05 Октября 2019, 10:41
А не хочешь в сторону https://defold.com/ посмотреть? там кстати в блоге что ты читал про аниматор в коментах как раз написал один из разрабов дефолда ( можно помучать вопросами ) . Просто если для тебя так важен упор на скриптинг то ЛУА конечно гораздо проще вроде бы ) ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Сообщение отредактировал pixeye - Суббота, 05 Октября 2019, 10:58
А не хочешь в сторону https://defold.com/ посмотреть?
Я как раз полгода назад Lua выучил, или уже почти год, не помню. Учил на Tic 80, потом попробовал перейти на Defold, и застопарился там на нескольких вещах: 1) было плохо с оффлайн документацией, я не могу работать онлайн, отвлекает ютюб или другие вещи) 2) и как-то сложно с примерами игр, мне пришлось их из каких-то странных папок вручную перетаскивать 3) там сложно настроить PixelPerfect графику с низким разрешением, и чтобы можно размер экрана вручную как угодно изменять, как например в Годот, в пару кликов все настройки меняются. я потом решил вернуться и посмотреть побольше на Defold, когда его отполируют, но так пока больше не добирался) надо бы как-нибудь проверить, чего там натворили за это время)
Добавлено (06 Октября 2019, 03:01) --------------------------------------------- Нашёл в документации по словарям инфу, этот пример будет также хорошо работать в юнити? https://docs.microsoft.com/ru-ru....ork-4.8
И раз тут два поля, значить это не будет видно в инспекторе? А можно сделать чтоб было видно?
Код
openWith.Add("txt", "notepad.exe");
Сообщение отредактировал alexsilent - Суббота, 05 Октября 2019, 11:04
PS мне не совсем понятно название темы. что значит "не программист"? сейчас что ли как-то по другому называют людей которые пишут код на языках программирования?
сейчас что ли как-то по другому называют людей которые пишут код на языках программирования?
drcrack, я просто не силён в сложные вещи, тот же ООП я только поверхностно использую. И медленно пишу код. Надо было написать "для новичка/нуба", но я уже лет 16-18 программирую, так что сложно назвать новичком, но всё ещё мне сложно с программированием.
Добавлено (09 Октября 2019, 13:12) --------------------------------------------- У C# есть один плюс по сравнению с JS для меня:
Код
void MyFunction(int Num = 10) {}
наконец-то можно использовать переменные в функции по умолчанию, то есть можно не указывать переменную в MyFunction(); если хочется получить значение по дефолту, это круто, соскучился я по такой операции)
И пишу длинный список строк кода альтернатив, чтоб быстро вникнуть в C#:
Код
//@script AddComponentMenu ("Alex Code/Scripter v2") [AddComponentMenu("Alex Code/Scripter v3")] //var ase : AudioSource = obj.AddComponent.<AudioSource>(); AudioSource ase = obj.AddComponent(typeof(AudioSource)) as AudioSource; //@TextArea (5,20) [TextArea(5,20)] //@Range (1,20) [Range(1,20)] //@Header ("Main Options") [Header("Health Settings")] //@HideInInspector [HideInInspector] //@script ExecuteInEditMode() [ExecuteInEditMode] //@ContextMenuItem ("Female", "SetFemale") [ContextMenu("Female", "SetFemale")] //if (Application.isPlaying) {} if (Application.isPlaying) {} //RequireComponent [RequireComponent(typeof(Rigidbody))] //var Code : String = ""; string Code = ""; //class Codes {var Word : String[];} ????????????????? //static var GlobalInt : int[] = new int[10]; static int[] GlobalInt = new int[10]; //var words : String[] = Code.Split("\n"[0]); public string[] words = "asasaddsf".Split("a"[0]); //words2 = words2.Replace("\t", ""); // remove TAB char public string words2 = "asasaddsf".Replace("a"," OK "); //if (words2.IndexOf("$") > -1) {} if (words2.IndexOf("$") > -1) {} //for (var a : int = 0; a < words.length; a++) { for (int a = 0; a < words.Length; a++) {} //for (var a : int = words.length - 1; a >= 0; a--) { for (int a = words.Length - 1; a >= 0; a--) {} //function GrabFloat(name : String) : float {} float GrabFloat(string name) {} //transform.position.x += 1; transform.position += new Vector3(2,2,0); //SendMessage("MyAwake", null, SendMessageOptions.DontRequireReceiver) SendMessage("MyAwake", null, SendMessageOptions.DontRequireReceiver); //BroadcastMessage("Rename",Text,SendMessageOptions.DontRequireReceiver); BroadcastMessage("MyAwake",null,SendMessageOptions.DontRequireReceiver); //System.Convert.ToInt32(words[1]); ????????????? //switch (Global.DAYS%7) {} switch (DAYS%3) { case 0: print("DAYS: "+"first");break; case 1: print("DAYS: "+"second");break; default: print("DAYS: "+"other");break; }
ну ты либо гений и это мы на самом деле не допираем до тебя либо ты из тех кто собирал кубик рубика всю жизнь и так и не собрал : ) ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
pixeye, мне сложно с алгоритмами и другими около математическими вещами, потому медленно тут всё идёт, в отличии от творчества, рисования или анимации. Но за меня больше никто программировать не будет за бесплатно так долго, поэтому пришлось учить.)
Сообщение отредактировал alexsilent - Четверг, 10 Октября 2019, 12:43
// VARIABLES, STRINGS, CLASSES, LOOP, FUNCTIONS //var Code : String = ""; string Code = ""; //class Codes {var Word : String[];} [System.Serializable] public class Codes {public String[] Word;} //static var GlobalInt : int[] = new int[10]; static int[] GlobalInt = new int[10]; //var words : String[] = Code.Split("\n"[0]); public string[] words = "asasaddsf".Split("a"[0]); //words2 = words2.Replace("\t", ""); // remove TAB char public string words2 = "asasaddsf".Replace("a"," OK "); //if (words2.IndexOf("$") > -1) {} if (words2.IndexOf("$") > -1) {} //for (var a : int = 0; a < words.length; a++) { for (int a = 0; a < words.Length; a++) {} //for (var a : int = words.length - 1; a >= 0; a--) { for (int a = words.Length - 1; a >= 0; a--) {} //for (var n : int in list) {} foreach(int n in list) {print("n: "+n);} //Random.Range(-5,5); Random.Range(-5,5) //function GrabFloat(name : String) : float {} float GrabFloat(string name) {} //SendMessage("MyAwake", null, SendMessageOptions.DontRequireReceiver) SendMessage("MyAwake", null, SendMessageOptions.DontRequireReceiver); //BroadcastMessage("Rename",Text,SendMessageOptions.DontRequireReceiver); BroadcastMessage("MyAwake",null,SendMessageOptions.DontRequireReceiver); //switch (Global.DAYS%7) {} switch (DAYS%3) { case 0: print("DAYS: "+"first");break; case 1: print("DAYS: "+"second");break; default: print("DAYS: "+"other");break; }
// GAME OBJECTS, TRANSFORM //transform.position.x += 1; transform.position += new Vector3(2,2,0); //var Last : GameObject = Instantiate(obj,Vector3(0,0,3.5),Quaternion.identity) as GameObject; GameObject Last = Instantiate(obj,new Vector3(0,0,3.5f),Quaternion.identity); //Last.transform.parent = transform; Last.transform.parent = transform; //Last.transform.localPosition = Vector3(0,0,3.5); Last.transform.localPosition = new Vector3(0,0,3.5f); // var t : Transform = obj.transform.Find("Item"); Transform t = obj.transform.Find("Item"); //DestroyImmediate(gameObject); DestroyImmediate(gameObject); //DontDestroyOnLoad(gameObject); DontDestroyOnLoad(gameObject);
// COMPONENTS //@script AddComponentMenu ("Alex Code/Scripter v2") [AddComponentMenu("Alex Code/Scripter v3")] //var ase : AudioSource = obj.AddComponent.<AudioSource>(); AudioSource ase = obj.AddComponent(typeof(AudioSource)) as AudioSource; //GetComponent.<SpriteRenderer>() SpriteRenderer rend = GetComponent<SpriteRenderer>(); /*var trs : Component[] = ImageDraw.GetComponentsInChildren (Transform); for (var tr : Transform in trs) {tr.gameObject.layer = 5;}*/ Component[] trs = transform.GetComponentsInChildren<Transform>(); foreach (Transform tr in trs) { tr.gameObject.layer = 5; }
// LEVELS, SCENES //Application.LoadLevel("level"); using UnityEngine.SceneManagement; SceneManager.LoadScene("level"); //Application.loadedLevelName SceneManager.GetActiveScene().name /////// Scene scene = SceneManager.GetActiveScene(); Debug.Log("Active Scene is '" + scene.name + "'.");
// ARRAYS (STATIC, LIST, DICTIONARY) //Static Array Init public int[] array = new int[5]; //Static Array Get array[0] = 10; //Static Array Init public int[] Array; //Static Array Length array.Length() //List Init public List<int> list = new List<int>(); //List Add list.Add(10); //List Remove list.RemoveAt(0); //List Push list.Insert(0,7); // push first position //List Clear list.Clear(); //List Length list.Count //Dictionary Init public Dictionary<string,int> dict = new Dictionary<string,int>(); //Dictionary Add dict.Add("hi1", 11); //Dictionary Get dict["hi1"] //Dictionary Remove dict.Remove("hi1"); //Dictionary Clear dict.Clear(); //Dictionary Length dict.Count
Добавлено (10 Октября 2019, 14:10) ---------------------------------------------
Цитатаdrcrack ()
это хз, первый раз вижу такую конструкцию
Это я где-то в сети подглядел, не помню)
Добавлено (10 Октября 2019, 14:11) ---------------------------------------------
Цитатаdrcrack ()
также в новых юнити уже давно работает интерполяция строк: Код
// Debug.Log("Active Scene is '" + scene.name + "'."); Debug.Log($"Active Scene is '{scene.name}'.");
Вау, вот эта штука офигенная! *__*
Добавлено (10 Октября 2019, 14:13) ---------------------------------------------
Цитатаdrcrack ()
адекватный вариант такой: Код var ase = obj.AddComponent<AudioSource>();
Тут кстати стоит var, а если это не локальная переменная, и будет переменная использоваться пока не удалиться GameObject или текущий скрипт, а не только в одном цикле, там тоже можно ставить var? Хотя я походу просто перепутал фразу "локальная переменная", это для меня звучит как переменная на один цикл) В конечном итоге можно, я думаю и так написать, если захочется получить доступ из другого скрипта:
Код
AudioSource ase = obj.AddComponent<AudioSource>();
Сообщение отредактировал alexsilent - Четверг, 10 Октября 2019, 14:20
а если это не локальная переменная, а будет использоваться пока не удалиться GameObject, а не только в одном цикле, там тоже можно ставить var?
var абсолютно ничего не меняет в поведении переменной, он просто сокращает код (тип определяется автоматически исходя из того что стоит справа от =) если ты работаешь в IDE а не в блокноте то var также поддерживает все фичи какие бы на его месте поддерживал тип (ctrl click / f12 для перехода к определению и тд)
Цитата
Вау, вот эта штука офигенная! *__*
у нее еще и форматы есть (аналогично string.Format):
Код
var a = 1.2345f; var b = 5; Debug.Log($"a: {a:f2}, b: {b:d3}"); // a: 1.23, b: 005
в данном случае это определенное число знаков после запятой и автоматическая добивка нулями до нужной длины
Сообщение отредактировал drcrack - Четверг, 10 Октября 2019, 14:25
drcrack, Это шикарно! Мне бы весь список фич найти, может там что ещё полезное есть! Пошёл гуглить просторы интернета) Спасибо!
Добавлено (11 Октября 2019, 04:52) ---------------------------------------------
Цитатаdrcrack ()
var абсолютно ничего не меняет в поведении переменной, он просто сокращает код (тип определяется автоматически исходя из того что стоит справа от =)
А что если делать неопределённую переменную? Допустим, я не знаю заранее будет ли это float,string или int, можно ли так сделать, что введёшь в поле, такой переменная и станет? Или это слишком круто?! Допустим я хочу просто оставить несколько полей пустыми, и не знаю какие переменные туда пока добавлю в класс, и в зависимости от ситуации я бы добавлял нужные переменные, было бы очень удобно, особенно для своего самодельного языка (чтоб скриптовать уровни на лету), где не знаешь какие переменные будут заранее.
Сообщение отредактировал alexsilent - Пятница, 11 Октября 2019, 04:52
Мне бы весь список фич найти, может там что ещё полезное есть!
решарпер (а может студия) показывает подсказку с примерами как только ставишь двоеточие
Цитата
А что если делать неопределённую переменную? Допустим, я не знаю заранее будет ли это float,string или int, можно ли так сделать, что введёшь в поле, такой переменная и станет? Или это слишком круто?! Допустим я хочу просто оставить несколько полей пустыми, и не знаю какие переменные туда пока добавлю в класс, и в зависимости от ситуации я бы добавлял нужные переменные, было бы очень удобно, особенно для своего самодельного языка (чтоб скриптовать уровни на лету), где не знаешь какие переменные будут заранее.
гугли "c# dynamic", как раз для интеграции скриптовых языков обычно и используется
Сообщение отредактировал drcrack - Пятница, 11 Октября 2019, 05:07
seaman, Спасибо! Тогда не буду этим пользоваться, на всякий случай!
Добавлено (14 Октября 2019, 21:42) --------------------------------------------- У меня появился новый вопрос про Dictionary: Могу ли я использовать Dictionary как заменитель переменных? допустим у меня 1000 юнитов на поле, и у каждого юнита я добавлю свой массив Dictionary, в этом массиве будут такие пункты при инициализации:
Не будет ли это проблемой? С точки зрения лагов или ещё чего-то непредвиденного?
Просто если так сгруппировать данные, то можно будет по новому взглянуть на упорядоченность кода, где переменные будут все в Dictionary лежать, а не разбросаны как попало по коду. Мне бы это нереально облегчило работу, например при создании нового проекта сразу знаю где искать все переменные, чтобы их удалить или изменить. Или при доступе к переменным из другого кода.
Добавлено (14 Октября 2019, 22:22) --------------------------------------------- Сделал 100 миллионов слотов Dictionary, и юнити завис) Видимо так много нельзя создавать, просто делал стресс тест.
Сообщение отредактировал alexsilent - Понедельник, 14 Октября 2019, 22:23
Поизучайте наследование. Гораздо лучше Сделать базовый класс Юнита с переменными
Код
public class BaseUnit { public float Health = 10; public float Mana = 20; public float Exp = 0; public int Level = 1; public int Team = 0; public float Attack = 0; public float Defense = 0; public float Stamina = 0; }
И производные классы
Код
public class Warrior : BaseUnit{...} public class Hunter : BaseUnit{...}
Это, конечно чисто основа. На самом деле тут все будет слегка сложнее. Правильно все подстраивать под Вашу систему прокачки...
Можно еще глянуть старенькие уроки BurzergArcade. https://www.youtube.com/playlist?list=PLE5C2870574BF4B06 Там где то с 18 урока как раз базовый класс персонажа.