De volgende blogpost, tenzij anders vermeld, is geschreven door een lid van Gamasutras community.
De geuite gedachten en meningen zijn die van de schrijver en niet van Gamasutra of haar moederbedrijf.
Doel
Het belangrijkste doel van deze blog post is om u een idee te geven over ScriptableObject in Unity.
Wat is Scriptable Object?
Wat is het verschil tussen ScriptableObject en Monobehaviour class?
Wat zijn de voor- en nadelen van Scriptableobject?
Hoe gebruik je ScriptableObject?
Laten we alle vragen beantwoorden door een ritje te maken van deze blog over ScriptableObject
Volgens de Unity API documentatie,
“ScriptableObject is een klasse waarvan je kunt afleiden als je objecten wilt maken die niet aan spelobjecten hoeven te worden gekoppeld.”
Verbaasd…?
Maak je geen zorgen, als je het niet begrepen hebt. Hier zal ik uitleggen wat het betekent.
Zoals we weten, is in Unity alles een Object.
GameObjecten zijn één van de Objecten.
GameObjecten: In je scène kun je je verplaatsen met transform.
ScriptableObject is een soort Object, maar kan alleen Data bevatten.
Dus, ze worden niet betrokken bij het eigenlijke spel.
Ik hoop dat je de definitie van ScriptableObject hebt begrepen.
Laten we de Voors en Tegens van ScriptableObject bespreken.
Proza van ScriptableObject:
- Ingebouwd in Unity
- Ze worden zeer goed onderhouden door Unity.
- Je kunt heel gemakkelijk met ze communiceren in Unity inspector.
- Kan worden opgeslagen als Assets
- Je kunt het maken als een mini-bestand binnen je project.
- U kunt dat bijwerken en opslaan volgens uw spelvereisten.
- Kan tijdens runtime worden opgeslagen
- Als u tijdens runtime iets verandert, wordt dat onthouden.
- Interne oplossing
- Wanneer u de gegevens tijdens runtime van het spel probeert te verkrijgen, hoeft u zich geen zorgen te maken over het parseren van externe bestanden, wat meer gaat spelen.
- Grote hoeveelheden gegevens
- U kunt miljoenen gehele getallen opslaan in een ScriptableObject.
- Dus, er is veel ruimte (geen functie die de grootte beperkt).
- Voeg toe aan de structuur als je
- Als je een scriptable object aan het bouwen bent en er een paar instanties van maakt en je realiseert, ohh ik heb een nieuwe instelling nodig voor ‘moveSpeed’ of welke extra variabele je ook nodig hebt, kun je toevoegen, het zal je variabele niet verstoren.
- Het verwijderen van variabele kan een beetje negatieve gevolgen hebben.
Cons of ScriptableObject:
- Vereist een editor scripting
- Als je assets wilt maken uit scripting dan moet je er een beetje verstand van hebben.
- Kan niet buiten Unity worden bewerkt
- Als je strikt met Unity werkt dan is dat niet echt een groot probleem.
- Maar als je een team basis oplossing hebt, waar je bestanden naar iemand anders wilt sturen om ze te bewerken, dan werkt het niet.
- Kan niet opslaan als het spel eenmaal is ingezet
- Kan niet opslaan tijdens runtime, als je het spel eenmaal hebt gebouwd, wat betekent dat dit geen oplossing is voor het opslaan van gegevens van een speler. Dit is alleen voor het opslaan van spelontwikkelingsgegevens.
Laten we een voorbeeld nemen om te begrijpen hoe ScriptableObject in een spel kan worden gebruikt.
Laat me je eerst een opdracht geven.
Voorstel, we hebben een spel van 10 levels en op elk level zal het gedrag van de vijand veranderen.
Enig idee, hoe je dit gaat doen?
Ahh, Je zou kunnen denken dat 10 prefab van 10 verschillende vijanden maken en toewijzen aan elk niveau. Toch?
Weet je het zeker, het is echt een goede praktijk?
Het antwoord is eigenlijk nee.
“Omdat een vijand object kan 4 variabelen en Update() functie met het, en stel dat gebruikt 4 Mb van het geheugen, dus 10 niveau vijand kan 40 Mb van het geheugen bedrag nodig.”
Dus, hier is de oplossing. Gebruik ScriptableObject om gegevens op te slaan van vijandelijke Object.
Laten we, ons mini spel ontwikkelen met ScriptableObject.
Eerst, zal ik een eenvoudig script maken zonder gebruik van een ScriptableObject. (Zoals onze eerste gedachte over het maken van verschillende prefab van elke verschillende vijand en deze toewijzen aan elk level 😉 )
Stap 1
- Maak een leeg GameObject aan en noem het Enemy.
Stap 2
- Maak een C#-script aan en noem het EnemyMove
Schrijf de volgende code in 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}
Stap 3
- Wijs het toe aan een leeg GameObject(Enemy).
- EnemyMove script heeft drie openbare variabelen.
- Als spel heeft zo veel vijandelijke GameObject met enemyMove script met het dan gebruikt veel geheugen.
- Voor dat als per onze oplossing ScriptableObject, kunnen we een EnemyData script te maken in plaats van het opslaan van deze variabele binnen EnemyMove script.
Stap 4
- Creëer een C#-script met de naam EnemyData.
- dat ScriptableObject erft in plaats van Monobehaviour.
Schrijf de volgende code in EnemyData.cs.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Stap 5
- Verander de code in ‘EnemyMove’, die eerder was gemaakt.
- Maak een publieke variabele ‘data’ die de referentie is van ‘EnemyData’.
- Verwijder de public die al in ‘EnemyData’
Verander volgens de volgende code.
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}
Nu kun je zien dat in de Inspector voor Enemy GameObject op ‘Data’ variabele zal verschijnen,
Enig idee..wat je veronderstelt hier toe te wijzen?
Volg mij…
Stap 1
- Voeg een regel toe in EnemyData.cs als volgt
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Stap 2
- Maak een map Spelgegevens en doe het volgende
Stap 3
- Noem het zoals u wilt.
- Nu kunt u alle variabelen in EnemyData in het inspectievenster zien. U kunt de waarden van de variabelen hier wijzigen.
Stap 4
- Toewijzen aan ‘EnemyMove’ script
Ik weet zeker dat je nu alle antwoorden hebt.
Conclusie
- ScriptableObject zijn echt goed voor het feit dat ze je gegevens kunnen opsplitsen in grotere brokken.
- Zodat je niet veel geheugen verbruikt.
- ScriptableObject is alleen voor ontwikkelingsdoeleinden.