Джерело
Щоденник Сеньйора🥫💻📚 | ️ Сервіс для швидкого доступу до компонентів ПлеєраУ мене завжди була ...
66 Охват/переглядів
2025-09-23 09:02
Повідомлення №304
⚡️ Сервіс для швидкого доступу до компонентів Плеєра
У мене завжди була одна й та сама проблема: треба отримати доступ до Плеєра → роблю GetComponent() → повторюю це ще й ще раз у різних місцях коду. Виглядало це не дуже і явно було місце для оптимізації.Я пройшов кілька ітерацій:
1-а ітерація:
Зробив простий клас, який на Awake шукав Плеєра в сцені й віддавав його екземпляр через сінглтон. Це вже було зручніше, але все одно відчувався костиль. 2-а ітерація:
Зрозумів, що в такій реалізації можливі race condition-и. Тому:- підняв ініціалізацію цього сервісу вище в ScriptExecutionOrder;- додав реєстрацію в сейв-систему. Тобто, коли сейв-система завантажила Плеєра і він готовий — я його реєструю в сервіс. Це вже стало стабільніше. 3-я ітерація:
Подумав: "Ок, я оптимізував доступ до Плеєра як об’єкта, але ж усім потрібні його компоненти, а не сам GameObject."Тому зробив наступне: після того, як Плеєр реєструється в сервісі, я через рефлексію проходжу по всіх його компонентах і додаю їх у словник. Тепер будь-який код, якому потрібен компонент Плеєра, може просто вказати тип і одразу отримати його. Без пошуків, без дубляжів коду — все супер швидко і централізовано.
Звісно, там є ще купа дрібних механізмів для безпеки та обробки винятків, але загалом підхід себе виправдав на всі 💯.#Project_RPG #unity #devlog #tutorial #code
У мене завжди була одна й та сама проблема: треба отримати доступ до Плеєра → роблю GetComponent() → повторюю це ще й ще раз у різних місцях коду. Виглядало це не дуже і явно було місце для оптимізації.Я пройшов кілька ітерацій:
1-а ітерація:
Зробив простий клас, який на Awake шукав Плеєра в сцені й віддавав його екземпляр через сінглтон. Це вже було зручніше, але все одно відчувався костиль. 2-а ітерація:
Зрозумів, що в такій реалізації можливі race condition-и. Тому:- підняв ініціалізацію цього сервісу вище в ScriptExecutionOrder;- додав реєстрацію в сейв-систему. Тобто, коли сейв-система завантажила Плеєра і він готовий — я його реєструю в сервіс. Це вже стало стабільніше. 3-я ітерація:
Подумав: "Ок, я оптимізував доступ до Плеєра як об’єкта, але ж усім потрібні його компоненти, а не сам GameObject."Тому зробив наступне: після того, як Плеєр реєструється в сервісі, я через рефлексію проходжу по всіх його компонентах і додаю їх у словник. Тепер будь-який код, якому потрібен компонент Плеєра, може просто вказати тип і одразу отримати його. Без пошуків, без дубляжів коду — все супер швидко і централізовано.
Звісно, там є ще купа дрібних механізмів для безпеки та обробки винятків, але загалом підхід себе виправдав на всі 💯.#Project_RPG #unity #devlog #tutorial #code