Source
Devlog без QA | Розробка ігор | Generics у C# (та Unity)Ось ми з вами говоримо часто про таку річ як G...
656 Views/Reach
2025-12-10 09:59
Message №439
📱 Generics у C# (та Unity)Ось ми з вами говоримо часто про таку річ як Generic, але можливо хтось до кінця, або взагалі, не знає що це таке.Generics у C# – це можливість оголошувати класи, методи, інтерфейси тощо з узагальненими параметрами типу. Замість конкретного типу (наприклад int чи string) ви вказуєте параметр T, який задасться під час використання. Наприклад, .NET забезпечує багато generic-класів для колекцій (List<T>, Dictionary<TKey,TValue> тощо), адже вони можуть зберігати будь-який тип без втрати безпеки типів* (гарантія, що змінні та об’єкти у програмі працюють тільки з тими типами даних, для яких вони призначені, і не можуть бути випадково використані неправильно).📍 Синтаксис та створення власних generic-типівЩоб оголосити узагальнений клас або метод, використовують синтаксис з кутовими дужками <T>. Наприклад, узагальнений клас може виглядати так:public class GenericList<T>{ private List<T> innerList = new List<T>(); public void Add(T item) { innerList.Add(item); } public T Get(int index) { return innerList[index]; }}
У цьому прикладі T – параметр типу, він може бути будь-яким (вкладений у клас GenericList<T>). Коли ви створюєте список, передаєте конкретний тип: var intList = new GenericList<int>(); intList.Add(5);.Аналогічно можна писати generic-методи:public void Swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp;}
Тут метод Swap<T> може поміняти місцями будь-які два об’єкти одного типу. Виклик: Swap<int>(ref x, ref y).Якщо коротко то використовувати можна багато як. У тих же інтерфейсах і т.п. Але є ще одна цікава деталь!⛔️ Обмеження типів (where)Параметру T можна встановлювати обмеження (where-умови), щоб звузити, яким типом він може бути. Найпоширеніші обмеження:• where T : class – T повинен бути "посилальним" типом (неможна передати int тощо).• where T : struct – T повинен бути типом-значення (не клас).• where T : notnull – у контексті nullable вимоги – обмежує ненульовані типи (C# 8+).Думаю, логіка зрозуміла.Але якщо це канал про розробку ігор, то чому б і не згадати за практичне використання у нашому любимому Unity 😅📱 Використання generics у UnityUnity Scripting API містить багато generic-методів у своїй бібліотеці. Наприклад, GetComponent<T>() – це generic-метод у GameObject/Component, який повертає компонент типу T (де T : Component)Використання:Rigidbody rb = gameObject.GetComponent<Rigidbody>();
Цей виклик стає безпечним і не вимагає явного приведення типу.Ще один приклад – AddComponent<T>() – generic-метод GameObject.AddComponent<T>(), який додає компонент типу T до ігрового об’єкта. Сигнатура: public T AddComponent<T>()SphereCollider sc = gameObject.AddComponent<SphereCollider>();
Також гріх не згадати: UnityEvent<T> та Системи Entities (ECS).Ну і базові методи по типу FindObjectOfType<T>() / FindObjectsOfType<T>(), GetComponentInChildren<T>(), GetComponentInParent<T>(). Тобто, якщо ви не знали точно, що таке Generic, то ви 100% з ним стикались.⚠️ Звісно, хоча існують і нюанси, але краще прочитати самому, якщо це вам настільки цікаво.[Джерело 1] / [Джерело 2] / [Джерело 3].На жаль, саркастичного і влучного жарту не придумав. Не сьогодні...✈️ Gamedev | #уроки #Generic #csharp #unity