Войти
Инди-ЮнитиФорум

Мастер класс по хорошему коду в юнити (13 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 110 11 12 13 14 15 Следующая »
#180
(Правка: 22:08) 22:05, 26 окт. 2020

cNoNim
а ты иди и проверь, думаю я все же прав ))

скрипт то где весит? очевидно на другом геймобъекте?

иначе удалится все ...

#181
(Правка: 22:16) 22:15, 26 окт. 2020

tac
это малось бесполезно проверять, потому что это еще походу и от версии юнити зависит, и от места вызова возможно.
важнее понимать суть

В последних версиях юнити допустим, когда я последний раз проверял
если весь этот код объявить в Awake другого монобеха, на другом гейм обже

Debug.Log(controller.transform.position);
тут не было эксепшина
и я в тот момент зарекся это понимать )))

#182
(Правка: 22:23) 22:20, 26 окт. 2020

cNoNim
> это малось бесполезно проверять, потому что это еще походу и от версии юнити
> зависит, и от места вызова возможно.
именно, они сейчас это поправили, чтобы не провисали ссылки, они видимо сделали копии объектов

я проверил

100
False
(1.0, 2.0, 3.0)

и что?

#183
(Правка: 22:24) 22:23, 26 окт. 2020

tac
Вот полный код теста, если уж ты хочешь по рассуждать

using UnityEngine;

public class Main : MonoBehaviour
{
    public GameObject Player;

    private PlayerController _controller;
    
    private void Awake()
    {
        _controller = Player.GetComponent<PlayerController>();
        _controller.Health = 100;
    }

    private void Start()
    {
        Destroy(Player);
        Debug.Log(_controller.Health); // Что выведется тут?
        Debug.Log(_controller == null); // Что выведется тут?
        Debug.Log(_controller.name); // Что выведется тут?
        Debug.Log(_controller.transform.position); // Что выведется тут?
    }

    private void Update()
    {
        Debug.Log(_controller.Health); // Что выведется тут?
        Debug.Log(_controller == null); // Что выведется тут?
        Debug.Log(_controller.name); // Что выведется тут?
        Debug.Log(_controller.transform.position); // Что выведется тут?
    }
}

Но главный вопрос же не в этом, главный вопрос
Почему так?

#184
22:25, 26 окт. 2020

Ну а после ответа на этот вопрос можно перейти и к вопросу, а хорошо ли делать что то на монобехах
И может ли быть это качественным )

#185
(Правка: 22:47) 22:27, 26 окт. 2020

cNoNim
удаление у них происходит не сразу, + недокументированное поведение, что происходит с компонентами после удаления геймобъекта. В их "прямой" философии так не должно быть ... удаляется геймобъект, удаляются все его компоненты. Единственно, они пару лет не могли исправить, что получается если захватит ссылку на компонент, её нельзя освободить ...

cNoNim
> хорошо ли делать что то на монобехах
может просто нужно их правильно использовать? ))

The object obj is destroyed immediately after the current Update loop, or t seconds from now if a time is specified. If obj is a Component, this method removes the component from the GameObject and destroys it. If obj is a GameObject, it destroys the GameObject, all its components and all transform children of the GameObject. Actual object destruction is always delayed until after the current Update loop, but is always done before rendering.

Ну в принципе понятно, вы не разобрались как работать с геймобъектами и компонентами, какое их поведение, поэтому решили сделать то что привычнее ))

#186
(Правка: 23:17) 22:50, 26 окт. 2020

Ды фиг с ним с этими их костылями, главный вопрос в том почему Health всегда будет выводиться?
А ответ прост.
любой UnityEngine.Object имеет managed представление, и нативное представление,
любой монобех имеет дополнительный оверхед
любые переходы managed->native и обратно несут дополнительный оверхед
они всячески стараются кешировать все что можно на managed стороне, но оверхед никуда не девается
и от этого пляшут все их проблемы с эвентами типа Update, и с производительностью Instantiate, и вообще все
ды любое отделение высокопроизводительной логики от монобехов имеет профит и в виде производительности и ввиде отсуствия говнокода, которым сопровождается написание логики на монобехах
можно даже DDD не юзать в полной мере, но как только мы отгородились от монобехов словили сразу же не илюзорный профит к качеству кода, о чем тут можно говорить?

Направлений отделения от монобехов может быть много

У нас есть и что то вроде MVP, когда отделяется вьюшная часть на монобехах, от модели, и есть презентер, который занимается отражением модели на вью, и получает из вью инпут ввиде эвентов. При этом презентер вполне себе такой обычный класс, который имеет конструктор, readonly поля и все те плюшки, которые есть в C#, презентеры конструируются через фактори, фактори автоматически инжектят через конструкторы всякие зависимости в виде манагеров, в которые вынесены отдельные блоки метагейма.
На таком паттерне у нас строится весь UI.
View отделено от всего этого через интерфейсы и имеет тупые методы вроде SetHealth, SetCost, GetSubView или ClickEvent
Presenter просто материализует модель через интерфейс вью
Model это декомпозированный на части метагейм

Это позволяет нам по крайней мере контролировать сложность кода в интерфейсе, отделять вью логику от бизнес логики, а потом уже позволяет тестировать отдельно View отдельно Presenter, мокать Model.

В геймплее направление отделения от монобехов иное, задача отделить высокопроизводительный код от тормозного юнити.
У нас за один юнитевый фрейм происходит 2-3 детерменированных шага обновления мира.
За секунду или две по логу боя в котором только действия игроков восстанавливается стейт 10 минутной сессии игры.
На таком бы монобехи тупо загнулись
Любое багло допущенное артистами или дизайнерами во вью не аффектит игровую сетевую сессию.
Мир тупо продолжает ехать дальше.

Я короче еще долго могу продолжать перечислять сферических коней в вакууме.
Но лучше послушать
tac
> может просто нужно их правильно использовать? ))
как же их правильно использовать )

#187
23:55, 26 окт. 2020

Кеширования в данном примере нет.
Destroy разрушает плюсовую сторону монобеха.
Health определен на managed стороне поэтому он будет выводиться пока есть на него ссылка, т.е. пока не сделаем _controller = null
== null срабатывает верно - выдает true, т.к. переопределено Юнитеками и проверяет плюсовую сторону, которой нет.
name определен на плюсовой стороне - потому будет ошибка что объект разрушен, а Вы на него ссылаетесь.
До position дело не дойдет из-за ошибки с name

#188
0:02, 27 окт. 2020

seaman
близко к теме тока Start выполнится полностью благодаря куче каких то неведомых костылей )
почему он выполнится целиком можно тока гадать )
они там долго пилили кеширование трансформа на managed стороне,
возможно так как трансоформ будет закеширован, как и позишин в нем,
но и проверка на null не сработает, в смысле в Start объект еще не будет уничтожен
а благодаря какой магии все это работает даже как то не интересно знать
главное вот тут
seaman
> Destroy разрушает плюсовую сторону монобеха.
ради этого все эти бредовые вопросы и задаются

Причем Start отработает даже если Destroy перенести в Awake...
хотя я наивно предполагал что старт выполняется отложено чуть ли не перед первым Update

#189
0:30, 27 окт. 2020

Там короче если сильно по извращаться можно много интересного узнать )
К примеру вот к тому монобеху который Main
Добавляем рядом

using System.Collections;
using UnityEngine;

public class Delay : MonoBehaviour
{
    public Main Main;

    IEnumerator Start()
    {
        yield return new WaitForSeconds(1.0f);
        Main.enabled = true;
    }
}
Назначаем Main
И выключаем Main в редакторе
И жмем кнопку Play
Объект будет жив и в Start, и в первом Update

Что самое прикольное, этому даже можно найти объяснение в документации
tac
> может просто нужно их правильно использовать? ))
т.е. просто научиться их правильно использовать )))

Но блин вот реально оно нужно да?

Имхо проще просто неюзать ни монобехи ни эти бредовые эвенты
Start в проекте не юзается совсем
OnEnable и OnDisable в очень редких случаях в View
Awake и Destroy тока для кеширования ссылок, подписки/отписки на какие то глобальные штуки во View
И то ссылки кешируем чаще в поля в OnValidate

#190
4:52, 27 окт. 2020

cNoNim
> Start в проекте не юзается совсем
> OnEnable и OnDisable в очень редких случаях в View
> Awake и Destroy тока для кеширования ссылок, подписки/отписки на какие то
> глобальные штуки во View
> И то ссылки кешируем чаще в поля в OnValidate
ну я же так и говорил, вы отказались от юнити :)

#191
(Правка: 5:52) 5:49, 27 окт. 2020

tac
Дратути, да я, это я.
Прочти как время будет и посмотри змейку из примера. Просто если ты её откроешь сразу, вряд ли поймешь профит.
https://habr.com/ru/post/358108/
хороший альтернативный вариант разработки, EntityComponentSystem.
Там под капотом, того же например LeopotamECS (LeoECS) стандартные подходы довольно опытного разработчика.
Я думал раньше это немного другое, но посмотрев его исходники обнаружил вполне закономерные вещи, которые нужны каждому проекту. Но при этом, ещё получается более быстрое решение (конечно там тоже можно напортачить с перепугу) и плюс ко всему очень гибкое (очень напоминает ReactJS, особенно его state часть).
Просто не торопись, найди время и спокойно почитай.

#192
9:54, 27 окт. 2020

tac
> ну я же так и говорил, вы отказались от юнити :)
И? Ты же не рассказываешь как правильно вот и пришлось отказаться

#193
(Правка: 11:17) 11:14, 27 окт. 2020

cNoNim
> близко к теме тока Start выполнится полностью благодаря куче каких то неведомых
> костылей )
> Причем Start отработает даже если Destroy перенести в Awake...
Start и Awake выполняются в одном кадре а объект разрушится в следующем.

Мне вот странно оказалось другое. Я считал, что первый Апдейт тоже выполнится в том же кадре, что и Старт с Эвейк. Оказалось нет. Оказалось - чтоб сработал нужно поисхитряться.

#194
(Правка: 14:57) 14:54, 27 окт. 2020

cNoNim
> Ты же не рассказываешь как правильно
такой уж я человек )) я не решаю "теоретических" задач ... вначале, опиши проблему, зачем мне вообще разбираться в каком порядке, что там вызывается ... это нижний уровень, нужно делать решение не зависимое от этого ... например, повесить на Корутин и забыть update , а чем плох start - я не знаю, вполне себе работает (разве что порядок выполнения скриптов надо настроить)

Страницы: 110 11 12 13 14 15 Следующая »
Инди-ЮнитиФорум