Pull to refresh

Comments 21

Спасибо, некоторые вещи кажутся очевидными, но лучше о них подумать заранее, чем потом рефакторить весь код.
Кстати, не сочтите за сарказм, не планируете написать статью о структуре файлов\скриптов\префабов в юнити проектах? На вопросы, как лучше организовать проект, какие файлы нужно убрать в hgignore, как аккуратно группировать объекты в сценах гугл отвечает весьма противоречиво.
Мой .hgignore из одного из проектов
syntax: glob
Library/*
Temp/*
_ReSharper.*-csharp/*
Assembly-CSharp*
Assembly-Unity*
obj/*
**build/*
**Build/*
*.sln
*.exe
*.suo
*.pidb
*.cache
*.userprefs
Thumbs.db
Список вопросов/*
**.orig
**.orig.meta
**usityVS*
**.unitypackage
*.booproj
*.DotSettings
*.user
*.csproj
Кстати, если подписываетесь на события, не забудьте в свой деструктор добавить «отписку»:

Немного позанудствую, но деструктором в C# все-таки называют немного другую вещь.
Кроме того, отписываться от события можно еще в методе OnDisable, как показано, например, здесь.
Про OnDestroy тоже заметил, вообще такой способ обработки событий в Unity стандартный:
void OnEnable()
{
    EventManager.OnClicked += Teleport;
}

void OnDisable()
{
    EventManager.OnClicked -= Teleport;
}

Считаю подписку в Start() и отписку в OnDestroy() в статье плохим советом.
Именно — порядок OnDestroy неопределен, поэтому часть объектов уже может быть разрушена. Так же не советую использовать статик классы — их надо корректно чистить для реентерабельности (например при повторной загрузке сцены или использовании в другой), а использовать MonoBehaviour-синглтоны — глобальные (с DontDestroyOnLoad) или локальные (без него). Инициализировать их в Awake, начинать трогать в Start / OnEnable других классов, отписываться в OnDisable других классов с проверкой инстанса на существование.
Да, ваш вариант логичнее. OnDisable срабатывает не только при закрытии сцены, но и при «выключении» объекта через SetActive(false). Т.е. если нужно будет на время «выключить» объект, он отключится вместе с обработчиками событий. А потом включится, когда отработает OnEnable().
Это действительно удобнее.
Спасибо. Да, называть метод OnDestory деструктором некорректно. Это все-таки совсем другое. Исправил.
Тут непонятная ситуация — я предполагал, что закрытие сцены означает уничтожение всех ее объектов и автоматическую «отписку» от всего. Оказалось, что это не так. Больше похоже на то, что приложение просто выходит из блока, отвечающего за сцену. Предполагается, что на объекты больше нет ссылок и, их удалит сборщик мусора.

При выходе из сцены теряются все ссылки со сцены, но остается синглтон, который держит дополнительную ссылку в event'е.
Не используйте статики и жизнь станет легче — локальные для сцены инстансы классов будут прибиты при выгрузке текущей и собраны GC при загрузке новой сцены.
Некоторые классы должны существовать на протяжении всей игры и не зависить от загрузки сцены. Например те, которые отвечают за состояние игры. Т.е. все равно что-то глобальное и вечно-живущее будет.
Выше есть очень удачный совет от Letmind — подписываться в OnEnable() и отписываться в OnDisable().
А можно подробнее про постинг вк и фб, как реализовано?
А еще про рекламу и сервисы гугла.
Сервиса гугла вызывал через вот этот плагин: github.com/playgameservices/play-games-plugin-for-unity
Очень удобно, в описании есть достаточно подробная инструкция, как с ним работать. Если интересно — могу сделать отдельный пост с пошаговым описанием, но это на 90% будет копия инструкции к самому плагину.
Для рекламы использовал, кажется, вот этот плагин: github.com/guillermocalvo/admob-unity-plugin Точно не помню — скачал пакет несколько месяцев назад. Если важно — могу посмотреть, какой именно пакет и какой версии используется. Там у него тоже описание прилагается.
В первом приложении была проблема — плагины конфликтовали, т.к. их функционал частично дублировался. Пришлось вручную удалять из джарников лишние классы. В последних версиях такой проблемы вроде нет.
Спасибо, для отправной точки информации достаточно!
В фейсбук постинг идет через вот этот плагин: developers.facebook.com/docs/unity/downloads
Там довольно подробно описано, как настроить. Вообще у фейсбука хорошая интеграция с Unity3d.
С ВК, честно говоря, не очень получается. Пытался сделать просто через API, но результат мне не понравился. Пока стоит заглушка. Скорее всего придется так через API и делать, но доводить до ума.
Полезная статья для новичков, чтобы не плодить кучу ссылок, со временем превращающуюся в спагетти. События — очень полезная вещь. Отдельное спасибо за упоминание об отписке от событий. Сам много времени потратил вычисляя баг.
Как уже сказали, лучше делать отписку в методе OnDisable(). Т.к. он срабатывает и при уничтожении объекта и при отключении скрипта.
P.S. Поделитесь с сообществом скриптом для шеринга в соцсети.
Для обработки событий типа OnCarCrash не всегда обязательно делать отдельный статический класс, можно сделать просто статическое событие в классе Car, может это вкусовщина, но как по мне в конкретном примере удобнее будет

public class Car
{
public static event Action OnCarCrash;

void Crash()
{


if (OnCarCrash != null)
{
OnCarCrash();
}

}
}
Поправьте, пожалуйста: не «состоянии игры», а «состояния игры».
Спасибо, исправил
События это хорошо, но когда проект становиться большим бывает очень трудно проследить связь между компонентами системы.
Лично я для себя рисую схему проекта, что от чего завит. Структурирует мысли и помогает понять старый код. Рекомендую draw.io, быстрый и удобный.
Sign up to leave a comment.

Articles