Följande blogginlägg, om inget annat anges, har skrivits av en medlem av Gamasutras community.
Tankarna och åsikterna som uttrycks är skribentens egna och inte Gamasutras eller dess moderbolags.
Objektiv
Det huvudsakliga syftet med det här blogginlägget är att ge dig en uppfattning om ScriptableObject i Unity.
Vad är Scriptable Object?
Vad är skillnaden mellan ScriptableObject och Monobehaviour-klassen?
Vad är för- och nackdelar med Scriptableobject?
Hur använder man ScriptableObject?
Låt oss förstå alla frågor genom att ta en tur på den här bloggen om ScriptableObject
Enligt Unitys API-dokumentation
”ScriptableObject är en klass som du kan härleda från om du vill skapa objekt som inte behöver kopplas till spelobjekt.”
Skakade du dig själv?
Oroa dig inte, om du inte fattade det. Här ska jag förklara vad det betyder.
Som vi vet är allting i Unity ett objekt.
Monobehaviours är ett av objekten.
GameObjects: I din scen kan du flytta runt med transform.
ScriptableObject är en typ av objekt men kan bara innehålla data.
Så de är inte involverade i det faktiska spelet.
Jag hoppas att du har förstått definitionen av ScriptableObject.
Låts oss diskutera för- och nackdelar med ScriptableObject.
Prose av ScriptableObject:
- Inbyggt i Unity
- De underhålls mycket väl av Unity.
- Du kan interagera med dem mycket enkelt i Unity inspector.
- Kan sparas som Assets
- Du kan skapa det som en minifil i ditt projekt.
- Du kan uppdatera den och spara den enligt dina spelkrav.
- Kan spara under körning
- Om du ändrar något under körning kommer den faktiskt att komma ihåg det.
- Intern lösning
- När du försöker hämta data under spelets körtid behöver du inte oroa dig för att analysera externa filer som kommer att spela in mer.
- Stora datamängder
- Du kan spara miljontals heltal inne i ett ScriptableObject.
- Det finns alltså mycket utrymme(ingen storleksbegränsande funktion).
- Lägg till i strukturen allteftersom
- När du bygger ett skriptobjekt och skapar några instanser av det och inser ,ohh jag behöver en ny inställning för ”moveSpeed” eller vilken ytterligare variabel som helst som du behöver kan du lägga till, det kommer inte att störa din variabel.
- Lösen av variabler kan ha en lite negativ inverkan.
Konsekvenser av ScriptableObject:
- Kräver en redaktör scripting
- Om du vill göra tillgångar av scripting så måste du veta lite om det.
- Kan inte redigeras utanför Unity
- Om du jobbar strikt med Unity så är det egentligen inte något stort problem.
- Men om du har en lagbaserad lösning där du vill skicka filer till någon och låta dem redigera så fungerar det inte.
- Kan inte spara när det väl är utplacerat
- Kan inte spara under körning, när du väl har byggt spelet, vilket innebär att det här inte är en lösning för att spara spelardata, utan bara för att spara data från spelutvecklingen.
Låt oss ta ett exempel för att förstå hur man använder ScriptableObject i spelet.
Låt mig ge dig en uppgift först.
Antag att vi har ett spel med 10 nivåer och att fiendens beteende förändras på varje nivå.
Några idéer om hur du ska göra detta?
Ahh, du kan tänka dig att göra 10 prefabricerade 10 olika fiender och tilldela dem till varje nivå. Eller hur?
Är du säker på att det verkligen är en bra metod?
Svaret är faktiskt nej.
”Eftersom ett fiendeobjekt kan ha 4 variabler och Update()-funktionen med sig, och om man antar att det använder 4 Mb minne, så kan 10 fiender på 10 nivåer kräva 40 Mb minne.”
Här är alltså lösningen. Använd ScriptableObject för att lagra data för fienden Object.
Låt oss, utveckla vårt minispel med ScriptableObject.
Först kommer jag att skapa ett enkelt skript utan att använda ett ScriptableObject. (Enligt vår första tanke om att skapa olika prefab för varje olika fiende och tilldela den till varje nivå 😉 )
Steg 1
- Skapa ett tomt GameObject och namnge det Enemy.
Steg 2
- Skapa ett C#-skript och namnge det EnemyMove
Skriv följande kod i 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}
Steg 3
- Tilldela den till ett tomt GameObject(Enemy).
- EnemyMove-skriptet har tre offentliga variabler.
- Om spelet har så många fiender GameObject med enemyMove-skriptet med det använder då massor av minne.
- För det enligt vår lösning ScriptableObject kan vi göra ett EnemyData-skript Istället för att lagra dessa variabler inom EnemyMove-skriptet.
Steg 4
- Skapa ett C#-skript som heter EnemyData.
- som ärver ScriptableObject istället för Monobehaviour.
Skriv följande kod i EnemyData.cs.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Steg 5
- Ändra koden i ”EnemyMove” som tidigare skapades.
- Skapa en offentlig variabel ”data” som är en referens till ”EnemyData”.
- För bort den offentliga som redan finns i ”EnemyData”
Ändra enligt följande kod.
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 kan du se att det i inspektorn för Enemy GameObject visas variabeln ”Data”.
Någon idé om vad du kan tilldela här??
Följ mig…
Steg 1
- Lägg till en rad i EnemyData.cs enligt följande
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Steg 2
- Skapa en mapp Game data och gör följande
Steg 3
- Nämn den som du vill.
- Nu kan du se alla variabler inuti EnemyData i inspektionsfönstret, du kan ändra värden på variablerna här.
Steg 4
- Tilldela detta till ’EnemyMove’ script
Jag är säker på att du har fått alla svar nu.
Slutsats
- ScriptableObject är riktigt bra för att de kan dela upp dina data i större bitar.
- Så att du inte äter upp mycket minne.
- ScriptableObject är bara till för utvecklingssyfte.