Cu excepția cazului în care se specifică altfel, următoarea postare pe blog a fost scrisă de un membru al comunității Gamasutra.
Gândurile și opiniile exprimate sunt ale autorului și nu ale Gamasutra sau ale companiei-mamă.
Obiectiv
Obiectivul principal al acestui articol de blog este de a vă oferi o idee despre ScriptableObject în Unity.
Ce este Scriptable Object?
Care este diferența dintre ScriptableObject și clasa Monobehaviour?
Care sunt avantajele și dezavantajele lui ScriptableObject?
Cum se utilizează ScriptableObject?
Să înțelegem toate întrebările făcând o plimbare pe acest blog despre ScriptableObject
Potrivit documentației API Unity,
„ScriptableObject este o clasă din care puteți deriva dacă doriți să creați obiecte care nu trebuie să fie atașate la obiectele jocului.”
Confuzat..?
Nu vă faceți griji, dacă nu ați înțeles. Aici, vă voi explica ce înseamnă.
După cum știm, cu Unity, totul este un obiect.
Monobiectele sunt unul dintre obiecte.
GameObjects: În scenă, vă puteți deplasa cu ajutorul transformării.
ScriptableObject este un fel de Obiect, dar, poate conține doar Date.
Așa că, nu se implică în jocul propriu-zis.
Sper că ați înțeles definiția de ScriptableObject.
Să discutăm Pro și Contra de ScriptableObject.
Prose de ScriptableObject:
- Built into Unity
- Sunt foarte bine întreținute de Unity.
- Puteți interacționa cu ele foarte ușor în inspectorul Unity.
- Pot fi salvate ca Assets
- Puteți să le creați ca un mini fișier în interiorul proiectului dumneavoastră.
- Puteți să-l actualizați și să-l salvați în funcție de cerințele jocului dumneavoastră.
- Poate fi salvat în timpul execuției
- Dacă schimbați ceva în timpul execuției, acesta își va aminti de fapt acest lucru.
- Soluție internă
- Când încercați să obțineți datele în timpul rulării jocului, nu vă faceți griji cu privire la analizarea fișierelor externe care vor intra mai mult în joc.
- Cantități mari de date
- Puteți salva milioane de numere întregi în interiorul unui ScriptableObject.
- Deci, există o mulțime de spațiu (nicio funcție de limitare a dimensiunii).
- Adăugați la structură pe parcurs
- În timp ce construiți un obiect scriptabil și creați câteva instanțe ale acestuia și vă dați seama ,ohh am nevoie de o nouă setare pentru ‘moveSpeed’ sau orice altă variabilă suplimentară de care aveți nevoie, puteți adăuga, nu vă va perturba variabila.
- Eliminarea variabilei poate avea un impact puțin negativ.
Cons of ScriptableObject:
- Necesită un editor de scripting
- Dacă vreți să faceți active din scripting, atunci trebuie să știți un pic despre asta.
- Nu se poate edita în afara Unity
- Dacă lucrați strict cu Unity, asta nu este chiar o problemă uriașă.
- Dar dacă aveți o soluție de tip team base, în care doriți să trimiteți fișiere cuiva și să-l puneți să le editeze, atunci nu va funcționa.
- Nu se poate salva după ce a fost implementat
- Nu se poate salva în timpul rulării, odată ce ați construit jocul, ceea ce înseamnă că aceasta nu este o soluție pentru salvarea datelor unui jucător. este doar pentru salvarea datelor de dezvoltare a jocului.
Să luăm un exemplu pentru a înțelege cum să folosim ScriptableObject în joc.
Să vă dau mai întâi o sarcină.
Să presupunem că avem un joc cu 10 nivele și la fiecare nivel comportamentul inamicului se va schimba.
Ai vreo idee, cum vei face asta??
Ahh, te-ai putea gândi să faci 10 prefabricate cu 10 inamici diferiți și să le asiguri la fiecare nivel. Nu-i așa??
Sunteți sigur că este o practică bună?
De fapt, răspunsul este Nu.
„Deoarece un obiect inamic poate avea 4 variabile și funcția Update() cu el, și să presupunem că folosește 4 Mb de memorie, deci 10 nivele de inamici pot necesita 40 Mb de memorie.”
Acum, iată soluția. Folosiți ScriptableObject pentru a stoca datele obiectului inamic.
Să dezvoltăm mini-jocul nostru cu ScriptableObject.
În primul rând, voi crea un script simplu fără a folosi un ScriptableObject. (Conform primului nostru gând de a crea diferite prefabricate ale fiecărui inamic diferit și de a le atribui la fiecare nivel 😉 )
Pasul 1
- Creați un GameObject gol numiți-l Enemy.
Pasul 2
- Creați un script C# și numiți-l EnemyMove
Scrieți următorul cod în EnemyMove.cs
public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic string name;public int moveSpeed;public Color color;public string colorName; public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed = Mathf.MoveTowards (speed,moveSpeed,Time.deltaTime);}#endregion}
Etapa 3
- Asemnați-l la GameObject(Enemy) gol.
- ScriptulEnemyMove are trei variabile publice.
- Dacă jocul are atât de multe GameObject-uri inamice cu scriptul enemyMove cu ele, atunci folosește multă memorie.
- Pentru aceasta, conform soluției noastre ScriptableObject, putem face un script EnemyData În loc să stocăm aceste variabile în scriptul EnemyMove.
Pasul 4
- Crearea unui script C# numit EnemyData.
- care moștenește ScriptableObject în loc de Monobehaviour.
Scrieți următorul cod în EnemyData.cs.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Pasul 5
- Modificați codul din interiorul ‘EnemyMove’, care a fost creat anterior.
- Creați o variabilă publică ‘data’ care este referința lui ‘EnemyData’.
- Îndepărtați variabila publică care se află deja în ‘EnemyData’
Modificați conform următorului cod.
public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic EnemyData data;public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = data.color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed=Mathf.MoveTowards (speed,data.moveSpeed,Time.deltaTime);}#endregion}
Acum puteți vedea că în interiorul inspectorului pentru Enemy GameObject pe variabila ‘Data’ va apărea,
Ai vreo idee..ce presupui că atribui aici??
Să mă urmați…
Pasul 1
- Adaugați o linie în EnemyData.cs după cum urmează
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Pasul 2
- Creați un folder Game data și faceți următoarele
Pasul 3
- Denumiți-l cum doriți.
- Acum, puteți vedea toate variabilele din interiorul EnemyData în fereastra inspectorului, puteți modifica valorile variabilelor aici.
Pasul 4
- Asemnați acest lucru în scriptul ‘EnemyMove’
Sunt sigur că ați primit toate răspunsurile acum.
Concluzie
- ScriptableObject sunt foarte bune pentru faptul că vă pot împărți datele în bucăți mai mari.
- Așa că nu consumați o mulțime de memorie.
- ScriptableObject este doar în scop de dezvoltare.
.