Последнее время отказываюсь от 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
Для не программиста ты слишком много думаешь о нагрузках ))
Для того что ты хочешь используется Scriptable Object - читай о них в документации юнити. Это ассеты с датой и кодом. Можешь потом класть их в Resources и вызывать через Resources.Load как пример. ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Для того что ты хочешь используется Scriptable Object - читай о них в документации юнити.
Попробовал я этот Scriptable Object, как на примере в видео юнити, каждая строчка кода идентичная, и данные тупо не сохраняются, через некоторое время объект становится пустым, нашёл куча жалоб, что у народа тоже не сохраняется инфа и нужно делать что-то типа SetDirty или как-то так, и я так и не смог это повторить, как в примере юнити. Короче это намного усложняет проект, чем если я просто изменю префаб без всяких дополнительных скриптов он сохранится сразу же
Добавлено (23 Октября 2018, 13:05) ---------------------------------------------
ЦитатаSnakeR ()
Да вы батенька изобрели синглтон, надо же)
С синглтоном я пока тоже не разобрался, как-то там сложно всё выглядит, наверное с непривычки , я ещё только перехожу с яваскрипта на C#, хотя может там такое тоже было, но я не встречал
Добавлено (23 Октября 2018, 13:06) ---------------------------------------------
Цитатаpixeye ()
на поясницу?
ну главная причина, что в статичных функциях нельзя локальные переменные ставить
просто я подумал, если у меня будет 40 статических функций в скрипте, то может проще сам скрипт сделать статическим, а функции обычные ну так и получилось сделать такой велосипед)
PS ну то есть можно смело пользоваться таким велосипедом?
Сообщение отредактировал alexsilent - Вторник, 23 Октября 2018, 13:15
Попробовал я этот Scriptable Object, как на примере в видео юнити, каждая строчка кода идентичная, и данные тупо не сохраняются, через некоторое время объект становится пустым, нашёл куча жалоб, что у народа тоже не сохраняется инфа и нужно делать что-то типа SetDirty или как-то так, и я так и не смог это повторить, как в примере юнити. Короче это намного усложняет проект, чем если я просто изменю префаб без всяких дополнительных скриптов он сохранится сразу же
эээ ) я не знаю что ты делаешь с SO но чтобы им пользоваться нужно понимать его природу. Он не предназначен для "сохранения" инфы. Его функции это предоставление неизменяемой даты и скриптов с методами обработчиками без локальных переменных.
Цитатаalexsilent ()
PS ну то есть можно смело пользоваться таким велосипедом?
Я бы не стал Но все приходит с опытом. ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
С синглтоном я пока тоже не разобрался, как-то там сложно всё выглядит, наверное с непривычки , я ещё только перехожу с яваскрипта на C#, хотя может там такое тоже было, но я не встречал
Синглтон - это концепция. С ним разбираться не нужно) разбираться можно с конкретными реализациями. Суть синглтона это гарантированное предоставление глобально одного экземпляра класса без возможности создать лишние копии. Single - одиночка.
Ты мог уже заметить что у тебя оч много "контроллеров" , "менеджеров" которые могут быть в одном экземпляре. По сути ты их используешь как "синглтоны"
Код
public static MyClass Instance;
Awake { Instance = this; }
Часто код выше называют тоже синглтоном, но по факту ты можешь легко перезаписать Instance другим экземпляром, так что с точки зрения кода это просто статик, но по смыслу может быть синглтоном : ) ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Насчет SO - пока не заморачивайся на счет реализации - но вот просто концепт. Допустим у тебя есть компонент получения урона и каждый раз когда ты получил урон ты хочешь чтобы с игроком что то произошло. В идеале ты хочешь удобно из инспектора менять эти действия. Вот тут SO помогает.
У героя есть три действия когда он получит урон. Причем если я например уберу Action Knockback герой больше не будет никогда ни оглушен ни отброшен врагом, даже если ему передались нужные параметры урона для этого.
Дальше я хочу чтобы шлем гг светился огнями разными. Если здоровья много - зеленым, средне - желтым, при смерти - красным. Делаю ассет Action Hit Player
Нет никакого смысла хранить информацию цветов в самом герое. Завтра я захочу фиолетовый, оранжевый и розовые цвета, я просто создам новый ассет, поменяю в нем цвета и заменю этим ассетом тот что лежит в компоненте.
При получении урона я передаю всем таким SO через метод Handle уведомление с двумя параметрами - кого тронули и как тронули. Дальше они принимают решения сами. Например вот действие блинка
Таким же макаром делается AI. Представь что у тебя три вида зомби. Все они имеют одинаковое поведение, но разные параметры. SO на помощь) создаешь хоть 20 ассетов меняя им параметры. Быстрый, медленный, тормозный, много здоровья, мало здоровья )