This shows you the differences between two versions of the page.
|
pjv:laboratoare:2025:a02 [2025/10/22 13:39] andrei.lapusteanu |
pjv:laboratoare:2025:a02 [2025/10/23 12:06] (current) andrei.lapusteanu |
||
|---|---|---|---|
| Line 29: | Line 29: | ||
| https://unity.com/how-to/architect-game-code-scriptable-objects#:~:text=ScriptableObject%20is%20a%20serializable%20Unity,to%20manage%20changes%20and%20debugging. | https://unity.com/how-to/architect-game-code-scriptable-objects#:~:text=ScriptableObject%20is%20a%20serializable%20Unity,to%20manage%20changes%20and%20debugging. | ||
| + | |||
| + | === Resurse Andrei L === | ||
| + | |||
| + | * Explicatii pattern-uri in Unity (Factory, Pooling, State, Command, Observer, MVC & MVP) [[https://learn.unity.com/tutorial/65e0df08edbc2a2447bf0b98?uv=2022.3&projectId=65de084fedbc2a0699d68bfb#|aici]] | ||
| + | * PDF cu toate pattern-urile (Unity): {{:pjv:laboratoare:2025:unity_patterns.pdf|}} | ||
| + | * PDF despre Scriptable Objects si arhitectura modulara cu ele (Unity): {{:pjv:laboratoare:2025:unity_modular_architecture.pdf|}} | ||
| + | * PDF despre guideline-uri de programare C# (Unity): {{:pjv:laboratoare:2025:unity_cleaner_code.pdf|}} | ||
| + | * Repo cu exemple de pattern-uri (Unity): [[https://github.com/Unity-Technologies/game-programming-patterns-demo|aici]] | ||
| </hidden> | </hidden> | ||
| Line 74: | Line 82: | ||
| * Command | * Command | ||
| * Observer | * Observer | ||
| + | * Cu evenimente C# sau ''UnityEvent'' | ||
| * Object Pooling | * Object Pooling | ||
| - | * MVC (cu ScriptableObjects) | + | * MVC |
| + | * Cu scriptable objects sau Event Bus | ||
| Line 606: | Line 616: | ||
| </code> | </code> | ||
| - | <hidden> | ||
| ===== Event Bus ===== | ===== Event Bus ===== | ||
| - | Prezentam un pentru decuplare si mai "loosely coupled" decat cele anterioare (un fel de "final boss" 🙂), intrucat folosind aceasta metoda puteti comunica fara nicio referinta (nici macar indirecta, precum in cazul comunicarii via ''ScriptableObjects''. | + | Prezentam un pattern pentru decuplare si mai "loosely coupled" decat cele anterioare (un fel de "final boss" 🙂), intrucat folosind aceasta metoda puteti comunica fara nicio referinta (nici macar indirecta, precum in cazul comunicarii via ''ScriptableObjects''. |
| <note important> | <note important> | ||
| Line 626: | Line 635: | ||
| * O metoda de **semnalare eveniment (broadcast/publish)** | * O metoda de **semnalare eveniment (broadcast/publish)** | ||
| - | Asadar, o componenta A se va abona la un eveninment (asculta), iar componenta B va face broadcast/publish - moment in care A va executa codul aferent. In acest fel event sus-ul este un **router de mesaje**. | + | Asadar, o componenta A se va abona la un eveninment (asculta), iar componenta B va face broadcast/publish - moment in care A va executa codul aferent. In acest fel event bus-ul este un **router de mesaje**. |
| - | Decuplarea reise din faptul ca atat A si B trebuie sa fie "de acord" ce data transfera, dar cine si cum face comunicarea intre ele (event bus-ul) nu este de interes pentru niciuna din componentele aflate in schimbul de mesaje. | + | Decuplarea reise din faptul ca atat A si B trebuie sa fie "de acord" ce date transfera, dar cine si cum face comunicarea intre ele (event bus-ul) nu este de interes pentru niciuna din componentele aflate in schimbul de mesaje. |
| - | Inainte de a introduce un exemple, clarificam pe scurt cateva elemente folosite in constructia event bus-ului. | + | Inainte de a introduce un exemplu, clarificam pe scurt cateva elemente folosite in constructia event bus-ului. |
| ==== Generics (T) ==== | ==== Generics (T) ==== | ||
| Line 659: | Line 668: | ||
| ==== Records (C# 9+) ==== | ==== Records (C# 9+) ==== | ||
| - | Un **record** este un tip special de clasa, folosita in principal pentru structuri de data imutabile (immutable data container). | + | Un **record** este un tip special de clasa, folosita in principal pentru structuri de data imutabile (immutable data container). Se pot scrie/declara foarte concis. Implementeaza in mod automat |
| - | * Se pot scrie/declara foarte concis. Implementeaza in mod automat | + | |
| * Constructor | * Constructor | ||
| * Proprietati | * Proprietati | ||
| Line 666: | Line 674: | ||
| * ''ToString()'' | * ''ToString()'' | ||
| - | In esenta, cand este nevoie de un tip de date care poate fi referentia si este imutabil, un **record** este o alternativa buna. | + | In esenta, cand este nevoie de un tip de date care poate fi referentiat si este imutabil, un **record** este o alternativa buna. |
| De exemplu: | De exemplu: | ||
| Line 675: | Line 683: | ||
| creeaza o clasa completa cu tot cu constructor, 2 proprietati (''Current'', ''Max''), equality check. | creeaza o clasa completa cu tot cu constructor, 2 proprietati (''Current'', ''Max''), equality check. | ||
| + | |||
| + | ==== Singleton ==== | ||
| + | |||
| + | Event bus-ul propus este un **Singleton** (adeseori considerat de fapt un [[https://www.geeksforgeeks.org/system-design/why-is-singleton-design-pattern-is-considered-an-anti-pattern|anti-pattern]]), anume astfel ne asiguram de faptul ca event bus-ul are o singura instanta si este accesibil in mod global. Detaliile de implmenetare ale acestuia sunt omise in laborator. | ||
| + | |||
| ===== Exemplu implementare Event Bus ===== | ===== Exemplu implementare Event Bus ===== | ||
| Line 758: | Line 771: | ||
| </code> | </code> | ||
| - | |||
| - | </hidden> | ||