Хочу создать тонну своих глобальных функций, но обычно доступ к ним имеет много букв. Например:
Код
Game.MyFunction();
сделав просто статичную функцию в скрипте Game
Но Можно ли сделать такую функцию, с более коротким названием? Чтобы получать доступ к ней из любого скрипта без увеличения количества букв:
Код
MyFunction();
PS для меня сократить на 5 символов очень приоритетно, чем меньше букв, тем легче я понимаю что написано в скрипте. Куда хуже начинаю воспринимать код, когда там постоянно эти длинные юнитовские команды типа SendMessageOptions.DontRequireReceiver - это просто для меня издевательство, эти бесконечные поля из символов. Я люблю сокращённые имена, как в старых добрых Basic и Lua скриптах)
Сообщение отредактировал alexsilent - Четверг, 02 Января 2020, 15:59
Подумал, что для моего стиля программирования подходит хранить часть данных в словарях, которые находятся в словарях. Нормальная ли практика использовать словарь внутри словаря на C#?
У меня это выглядит так в коде:
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Game : MonoBehaviour { // Global Variable Groups public Dictionary<string,Dicts> Group = new Dictionary<string,Dicts>();
void Awake() { }
void Update() { } }
[System.Serializable] public class Dicts { public Dictionary<string,int> num = new Dictionary<string,int>(); public Dictionary<string,string> txt = new Dictionary<string,string>(); }
Ибо я всё ещё только перехожу на C# с JS, и не совсем уверен будут ли проблемы с утечкой или другие траблы. Если не будет проблем, но будет медленнее, чем у крутых современных способов хранения данных, то ничего страшного, мои игры камерные, с небольшим количеством персонажей и объектов на экране, и я почти не программист, больше художник, так что мне бы подошёл такой способ.
Ибо очень удобно свой мини-язык для скриптинга уровней написать и потом легко доставать из dictionary через имя string любую мне нужную переменную с помощью этого языка. Как бы это главная цель зачем хочу использовать dictionary, чтобы был лёгкий доступ к переменным через название переменной. Но не уверен, будут ли утечки с подобной структурой.
Сообщение отредактировал alexsilent - Четверг, 02 Января 2020, 16:07
Я недавно участвовал в конкурсе на итчио и пилил игру на одну кнопку на Tic-80 (наверное в этой теме ссылки оставлять нельзя на свои проекты, поэтому не буду), в целом забавно, но не достаточно разнообразно, хотя моя игра в разы продуманнее Флаппи Бёрдса, целую мини-рпг сделал, но всё же недостаточно гемплея. Лучше пусть будут более продвинутые темы: 1) Игра в небольшой локации - звучит круто 2) Might n Magic тоже звучит неплохо 3) Тактики, стратегии, пошаговое перемещение, тот же гольф - пошаговое перемещение 4) псевдо 3D, большинство объектов будут просто спрайты в 3д пространстве, как в старых играх Doom или 2.5D играх, даже сюда подходит Don't Starve и Knock-Knock
Сообщение отредактировал alexsilent - Четверг, 02 Января 2020, 09:48
А может кто знает, можно ли в Defold очень быстро создать игру с 1) низким разрешением, pixelperfect (все пиксели чёткие и желательно квадратные) 2) чтобы был оконный режим 3) разблокированная кнопка окна "Развернуть", и возможность менять размер окна вручную мышкой потащив за край окна, и как бы не менял окно, то виртуальное разрешение всегда оставалось бы одинаковым PS для меня, это самые удобные настройки для маленьких инди игр с низким разрешением, можно играть в офисе, в любой момент развернуть и свернуть, никакого полноэкранного режима, можно и без Alt+Tab сворачивать игру
а то там как-то сложно, то ли нужно писать скрипт для отдельного режима, то ли я просто не разобрался, я сам не программер, и не люблю тонкости программирования, но спокойно пишу код на Tic-80 и Lua
Сообщение отредактировал alexsilent - Среда, 25 Декабря 2019, 05:02
Хм... Потестил Dictionary из 1000 объектов по 1000 слотов в каждом скрипте, и вроде всё очень быстро считается. Если взять таких 100 объектов по 50 переменных, то вообще нагрузки не замечу.
Добавлено (14 Октября 2019, 23:07) --------------------------------------------- seaman, Спасибо Большое, гляну!
Мне просто, чем понравился Dictionary, то что помимо того, что это быстро работает, так ещё и вызывается такая "переменная" через string, то есть я могу в своём самодельном скрипте очень легко вызывать любую "переменную", любого объекта, просто зная её название. В обычном классе будет затруднительно через string вызывать переменную, но всё же гляну материал, хоть не люблю вникать в ООП, ибо это уже сложнее обычного Бейсика, а моё программирование где-то на том уровне и осталось, но это не мешает делать игры, давно пытался ещё читать книгу по С++ про наследование, и у меня тогда так голова разболелась)) , что решил оставить до лучших времён эту информацию.)
Ну по части оптимизации, у меня будет не так много объектов, не RTS делаю, и может быть не будет лагов, если Dictionary по 50-100 слотов на объект будет на каждом интерактивном объекте висеть. Если только там нет каких-то других подводных камней.
Сообщение отредактировал alexsilent - Понедельник, 14 Октября 2019, 23:16
seaman, Спасибо! Тогда не буду этим пользоваться, на всякий случай!
Добавлено (14 Октября 2019, 21:42) --------------------------------------------- У меня появился новый вопрос про Dictionary: Могу ли я использовать Dictionary как заменитель переменных? допустим у меня 1000 юнитов на поле, и у каждого юнита я добавлю свой массив Dictionary, в этом массиве будут такие пункты при инициализации:
Не будет ли это проблемой? С точки зрения лагов или ещё чего-то непредвиденного?
Просто если так сгруппировать данные, то можно будет по новому взглянуть на упорядоченность кода, где переменные будут все в Dictionary лежать, а не разбросаны как попало по коду. Мне бы это нереально облегчило работу, например при создании нового проекта сразу знаю где искать все переменные, чтобы их удалить или изменить. Или при доступе к переменным из другого кода.
Добавлено (14 Октября 2019, 22:22) --------------------------------------------- Сделал 100 миллионов слотов Dictionary, и юнити завис) Видимо так много нельзя создавать, просто делал стресс тест.
Сообщение отредактировал alexsilent - Понедельник, 14 Октября 2019, 22:23
drcrack, Это шикарно! Мне бы весь список фич найти, может там что ещё полезное есть! Пошёл гуглить просторы интернета) Спасибо!
Добавлено (11 Октября 2019, 04:52) ---------------------------------------------
Цитатаdrcrack ()
var абсолютно ничего не меняет в поведении переменной, он просто сокращает код (тип определяется автоматически исходя из того что стоит справа от =)
А что если делать неопределённую переменную? Допустим, я не знаю заранее будет ли это float,string или int, можно ли так сделать, что введёшь в поле, такой переменная и станет? Или это слишком круто?! Допустим я хочу просто оставить несколько полей пустыми, и не знаю какие переменные туда пока добавлю в класс, и в зависимости от ситуации я бы добавлял нужные переменные, было бы очень удобно, особенно для своего самодельного языка (чтоб скриптовать уровни на лету), где не знаешь какие переменные будут заранее.
Сообщение отредактировал alexsilent - Пятница, 11 Октября 2019, 04:52
Добавлено (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
// 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
pixeye, мне сложно с алгоритмами и другими около математическими вещами, потому медленно тут всё идёт, в отличии от творчества, рисования или анимации. Но за меня больше никто программировать не будет за бесплатно так долго, поэтому пришлось учить.)
Сообщение отредактировал alexsilent - Четверг, 10 Октября 2019, 12:43
drcrack, спасибо! Решил не париться так сильно, хотя жаль что нельзя загружать комнату из уровня. Просто загружу всё сразу, и потом отключу комнаты, которые не нужны, и буду их включать по мере продвижения.
До сих пор не тестил SceneManager, можно ли там загрузить небольшую часть уровня? Например у меня есть большой уровень из 30 комнат, я хочу загрузить из этого уровня лишь одну комнату, не загружая все остальные, можно ли это организовать?
PS Иначе зачем вообще использовать SceneManager, если достаточно было Application.loadLevel?! Ну кроме того что можно разделять отдельно менюшки всякие загружая их в другой слот сцены, но это не то что мне нужно.
Добавлено (06 Октября 2019, 10:09) --------------------------------------------- И второй вопрос (если первый вариант не возможен): Можно ли получить доступ к игровому объекту в не открытой сцене? Чтобы найти его и оттуда перетащить как-нибудь?!
Добавлено (06 Октября 2019, 10:32) --------------------------------------------- Ну или третий способ: можно ли как-то загрузить сцену, чтобы все объекты были не активны, а также не работали такие вещи как OnDisable и OnDestroy потому-что у меня куча объектов с такими функциями, нужно чтоб объекты как будто были бы в спячке, чтоб из них выбрать то что нужно, а остальные объекты удалить безболезненно и без активации даже без включения Awake функций на всех объектах и OnDestroy?
PS нужен всего один из этих вариантов
Сообщение отредактировал alexsilent - Воскресенье, 06 Октября 2019, 10:34
сейчас что ли как-то по другому называют людей которые пишут код на языках программирования?
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; }
А не хочешь в сторону 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
А ещё мой аниматор персонажей с кучей анимацией выглядит намного чище, чем классические сборки аниматора на юнити. Не паутина :P
Добавлено (05 Октября 2019, 10:39) ---------------------------------------------
Цитатаpixeye ()
Вот тот же код просто по фреймворку без игровой логики
так намного проще) чем меньше кода, тем мне легче вникнуть)
Цитатаpixeye ()
Все что тебе нужно знать о листах на начальном этапе это то что
В List мне ещё нужен был Push, то есть запихивание новой яйчейки в самое начало, сдвигая всех. Но в этой теме уже объяснили как делать, хотя я ещё не тестировал тот метод)
Плюс, теперь мне нужно понять как работать с Dictionary, хочу вызывать яйчейку по имени, а не номеру. Пошёл гуглить)
Добавлено (05 Октября 2019, 10:40) --------------------------------------------- pixeye, Спасибо большое за советы! Я ещё почитаю про Actors Фреймворк! В целом, мне нравятся вещи, которые упрощают жизнь в программировании.
Сообщение отредактировал alexsilent - Суббота, 05 Октября 2019, 10:41
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 ); } }
то есть по сути, это просто самовольный запуск любой анимации, без раставления стрелочек, все переходы анимации написаны по старому внутри скрипта) так намного удобнее для меня, чем возиться с паутиной из стрелок)
Это не абстрактно учебный проект. Мы сейчас всей командой поедем в мск на WhiteNights показывать игрушку
Звучит прикольно! )
Цитатаpixeye ()
Ну если ты "пишешь языки программирования" то проблем у тебя быть не должно с кодом лол XDD
Ну если коротко, то скрипт разделяет текст по пробелам через Split и ищет через switch какая это команда и потом работает определённая функция, это не так уж и сложно) То есть это почти начальный уровень программирования, все сложные ООП штуки я категорически избегаю)
Добавлено (05 Октября 2019, 10:05) ---------------------------------------------
Цитатаpixeye ()
Вот например обработчик простых стейт машин
Честно говоря я вообще не понял этот код. Тут какой-то нужен новый уровень понимания, я пишу стейт машину простыми вещами, примерно так (сорри что JS, на C# быстро пока не могу писать):
Код
var state : String = "idle"; switch (state) { case "walk": WalkFunction();break; case "idle": IdleFunction();break; }
А тут я просто не понимаю, например что за HandleUpdate
// упрощение бойлерплейта GetComponent до Get. фигня но набивать символов меньше
про GetComponent мне понравилось) для меня впервую очередь это очень критично, чем меньше символов, тем легче для меня читать код, а также писать быстрее намного... Не люблю в юнити эти длинные команды типа:
pixeye, больше всего в модах для юнити я боюсь отмены поддержки потом и сложные договоры. Я не читал лицензионное соглашение по Актёрам ещё, может там всё в свободном доступе (это я просто назвал ) но пункт с поддержкой меня очень пугает, уже несколько хороших плагинов я перестал использовать на юнити, потому-что авторы прекратили их поддерживать, они просто больше не запускаются на новых версиях юнити(( и поэтому решил пытаться сам всё изучать и даже написал на JS свой собственный язык программирования внутри юнити, чтоб скрипты для уровней делать без компиляции, проблема теперь в том, что надо на C# это всё переписывать(((
Хотя ради интереса мне интересно глянуть на Actors с точки зрения, насколько там легко создавать игры. Похоже ли это на конструктор для дизайнера или всё ещё сложно для меня?!
Сообщение отредактировал alexsilent - Суббота, 05 Октября 2019, 09:38