Jos ei toisin mainita, seuraavan blogikirjoituksen on kirjoittanut Gamasutran yhteisön jäsen.
Ajatukset ja mielipiteet ovat kirjoittajan eivätkä Gamasutran tai sen emoyhtiön omia.
Tavoite
Tämän blogipostauksen päätavoitteena on antaa sinulle käsitys ScriptableObjectista Unityssä.
Mikä on ScriptableObject?
Mitä eroa on ScriptableObjectilla ja Monobehaviour-luokalla?
Mitkä ovat Scriptableobjectin hyvät puolet ja mitkä ovat sen huonot puolet?
Kuinka ScriptableObjectia voi käyttää?
Käsitellään kaikki kysymykset ottamalla yksi kyyti tämän blogin ScriptableObjectista
Unityn API-dokumentaation mukaan,
”ScriptableObject on luokka, josta voit johtaa, jos haluat luoda objekteja, joita ei tarvitse liittää peliobjekteihin.”
Confuesed..?
Ei hätää, jos et tajunnut sitä. Tässä selitän mitä se tarkoittaa.
Kuten tiedämme, Unityssä kaikki on Object.
Monobehaviorit ovat yksi Objecteista.
GameObjects:
ScriptableObject on eräänlainen Object, mutta, se voi vain sisältää dataa.
Se ei siis osallistu varsinaiseen peliin.
Toivottavasti ymmärsitte ScriptableObjectin määritelmän.
Keskustellaan ScriptableObjectin eduista ja haitoista.
ScriptableObjectin plussat:
- Sisäänrakennettu Unityyn
- Ne ovat hyvin ylläpidettyjä Unityn toimesta.
- Voit olla vuorovaikutuksessa niiden kanssa hyvin helposti Unityn inspectorissa.
- Voidaan tallentaa Assetsina
- Voit luoda sen minitiedostona projektisi sisällä.
- Voit päivittää sitä ja tallentaa sen pelisi vaatimusten mukaan.
- Voi tallentaa ajon aikana
- Jos muutat jotain ajon aikana, se todella muistaa sen.
- Sisäinen ratkaisu
- Kun yrität saada dataa pelin ajonaikana, et huolehdi ulkoisten tiedostojen parsimisesta, joka tulee kyseeseen enemmän.
- Suuret datamäärät
- Voit tallentaa miljoonia kokonaislukuja ScriptableObjectin sisälle.
- Tilaa on siis paljon(ei kokorajoitustoimintoa).
- Lisää rakenteeseen mennessään
- Kun rakennat skriptattavaa objektia ja luot muutaman instanssin siitä ja huomaat ,ohh tarvitsen uuden asetuksen ’moveSpeed’ tai mitä tahansa lisämuuttujaa voit lisätä, se ei häiritse muuttujaasi.
- Muuttujan poistamisella voi olla hieman negatiivinen vaikutus.
Cons of ScriptableObject:
- Vaatii editorin scripting
- Jos haluat tehdä assetteja scriptingistä niin sinun täytyy tietää vähän siitä.
- Ei voi editoida muualla kuin Unityssä
- Jos työskentelet tiukasti Unityn parissa niin se ei ole mikään suuri ongelma.
- Mutta jos sinulla on kuten tiimipohjainen ratkaisu, jossa haluat lähettää tiedostoja jollekin ja antaa hänen muokata niitä, niin se ei toimi.
- Ei voi tallentaa kun se on otettu käyttöön
- Ei voi tallentaa ajon aikana,kun olet rakentanut pelin, mikä tarkoittaa, että tämä ei ole ratkaisu pelaajan tietojen tallentamiseen.Tämä on vain pelinkehitystietojen tallentamista varten.
Katsotaanpa yksi esimerkki, jotta ymmärretään miten käyttää ScriptableObjectia pelissä.
Annetaan ensin yksi tehtävä.
Esitettäköön, että meillä on 10 tasoinen peli ja jokaisella tasolla vihollisen käyttäytyminen muuttuu.
Onko ideoita, miten aiot tehdä tämän??
Ahh, Voisit ajatella, että teet 10 prefabia 10 eri vihollisesta ja määrität sen jokaiselle tasolle. Vai mitä??
Oletko varma, että se on todella hyvä käytäntö?
Vastaus on itse asiassa ei.
”Koska yhdellä vihollisobjektilla voi olla 4 muuttujaa ja Update()-funktio sen kanssa, ja oletetaan, että se käyttää 4 Mb muistia, joten 10 tasoa vihollisia voi vaatia 40 Mb muistia.”
Tässä on siis ratkaisu. Käytä ScriptableObjectia tallentamaan vihollisobjektin tietoja.
Kehitetäänpä minipelimme ScriptableObjectin avulla.
Aluksi luon yksinkertaisen skriptin ilman ScriptableObjectia. (Ensimmäisen ajatuksemme mukaan luodaan eri prefab jokaisesta eri vihollisesta ja osoitetaan se jokaiselle tasolle 😉 )
Vaihe 1
- Luo tyhjä GameObject ja nimeä se Enemy.
Vaihe 2
- Luo C#-skripti ja nimeä se EnemyMove
Kirjoita seuraava koodi EnemyMoveen.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}
Vaihe 3
- Anna se tyhjälle GameObjectille(Enemy).
- EnemyMove-skriptissä on kolme julkista muuttujaa.
- Jos pelissä on niin monta vihollisen GameObjectia, joissa on enemyMove-skripti mukana, niin se käyttää paljon muistia.
- Siitä varten, kuten ratkaisumme ScriptableObject, voimme tehdä EnemyData-skriptin sen sijaan, että tallentaisimme nämä muuttujat EnemyMove-skriptin sisällä.
Vaihe 4
- Luo C#-skripti nimellä EnemyData.
- joka perii Monobehaviourin sijasta ScriptableObjectin.
Kirjoita seuraava koodi EnemyData.cs:ään.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Vaihe 5
- Muuta koodia ’EnemyMove’:n sisällä,joka oli aiemmin luotu.
- Luo yksi julkinen muuttuja ’data’, joka on viittaus ’EnemyData’-muuttujaan.
- Poista julkinen, joka on jo ’EnemyData’-muuttujan sisällä.
Vaihda koodia seuraavan koodin mukaan.
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}
Nyt näet, että Inspectorissa Enemy GameObjectin ’Data’-muuttuja tulee näkyviin,
Any idea..what you suppose assign over here??
Seuraa minua…
Vaihe 1
- Add one line in EnemyData.cs seuraavasti
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Vaihe 2
- Luo yksi kansio Game data ja tee seuraava
Vaihe 3
- Nimeä se miten haluat.
- Nyt näet kaikki muuttujat EnemyDatan sisällä inspector-ikkunassa, voit muuttaa muuttujien arvoja täällä.
Vaihe 4
- Asignoi tämä ’EnemyMove’-skriptiin
Varmasti sait nyt kaikki vastaukset.
Johtopäätös
- ScriptableObject ovat todella hyviä sen takia, että ne voivat pilkkoa datasi suurempiin palasiin.
- Siten et syö paljon muistia.
- ScriptableObject on vain kehityskäyttöön.