Medmindre andet er angivet, er følgende blogindlæg skrevet af et medlem af Gamasutras community.
De tanker og holdninger, der kommer til udtryk, tilhører forfatteren og ikke Gamasutra eller dets moderselskab.
Objektiv
Det primære formål med dette blogindlæg er at give dig en idé om ScriptableObject i Unity.
Hvad er Scriptable Object?
Hvad er forskellen mellem ScriptableObject og Monobehaviour class?
Hvad er fordele og ulemper ved Scriptableobject?
Hvordan bruger man ScriptableObject?
Lad os forstå alle spørgsmålene ved at tage en tur på denne blog om ScriptableObject
I henhold til Unity API-dokumentationen,
“ScriptableObject er en klasse, du kan aflede fra, hvis du vil oprette objekter, der ikke behøver at være knyttet til spilobjekter.”
Confuesed..?
Bekymre dig ikke, hvis du ikke forstod det. Her vil jeg forklare, hvad det betyder.
Som vi ved, er alt i Unity et Object.
Monobehaviours er et af Objects.
GameObjects: I din scene kan du bevæge dig rundt med transform.
ScriptableObject er en slags Object, men det kan kun indeholde data.
Så de bliver ikke involveret i det egentlige spil.
Jeg håber, at du har forstået definitionen af ScriptableObject.
Lad os diskutere fordele og ulemper ved ScriptableObject.
Prose af ScriptableObject:
- Indbygget i Unity
- De er meget godt vedligeholdt af Unity.
- Du kan interagere med dem meget nemt i Unity inspector.
- Kan gemmes som Assets
- Du kan oprette det som en minifil inde i dit projekt.
- Du kan opdatere den og gemme den efter dine spilkrav.
- Kan gemme under køretid
- Hvis du ændrer noget under køretid, vil den faktisk huske det.
- Intern løsning
- Når du forsøger at hente data under spillets køretid, behøver du ikke bekymre dig om at analysere eksterne filer, som kommer mere i spil.
- Store mængder data
- Du kan gemme millioner af hele tal inde i et ScriptableObject.
- Så der er meget plads(ingen størrelsesgrænsefunktion).
- Tilføj til struktur efterhånden
- Som du opbygger et scriptable objekt og opretter nogle få instanser af det og indser ,ohh jeg har brug for en ny indstilling for ‘moveSpeed’ eller hvilken ekstra variabel du har brug for, kan du tilføje, det vil ikke forstyrre din variabel.
- Sletning af variabel kan have en lille smule negativ indvirkning.
Konsekvenser af ScriptableObject:
- Kræver en editor scripting
- Hvis du vil lave aktiver ud fra scripting, så skal du vide lidt om det.
- Kan ikke redigere uden for Unity
- Hvis du arbejder strengt med Unity, er det ikke rigtig et stort problem.
- Men hvis du har en teambaseret løsning, hvor du vil sende filer til nogen og få dem til at redigere, så vil det ikke fungere.
- Kan ikke gemme, når det er implementeret
- Kan ikke gemme under runtime, når du har bygget spillet, hvilket betyder, at dette ikke er en løsning til at gemme spillernes data.Det er kun til at gemme data fra spiludviklingen.
Lad os tage et eksempel for at forstå, hvordan man bruger ScriptableObject i spil.
Lad mig give dig en opgave først.
Sæt, vi har et spil med 10 niveauer, og på hvert niveau vil fjendens adfærd ændre sig.
Nogle ideer, hvordan du vil gøre dette??
Ahh, Du kan tænke, at lave 10 prefab af 10 forskellige fjender og tildele det til hvert niveau. Er du sikker på, at det virkelig er en god øvelse?
Svaret er faktisk nej.
“Fordi et fjendeobjekt kan have 4 variabler og Update()-funktionen med det, og hvis det bruger 4 Mb hukommelse, så kan 10 fjender på 10 niveauer kræve 40 Mb hukommelse.”
Så, her er løsningen. Brug ScriptableObject til at gemme data for fjendeobjektet.
Lad os, udvikle vores minispil med ScriptableObject.
Først vil jeg oprette et simpelt script uden at bruge et ScriptableObject. (Som pr vores første tanke om at skabe forskellige prefab af hver forskellig fjende og tildele det til hvert niveau 😉 )
Stræk 1
- Opret et tomt GameObject navngiv det Enemy.
Stræk 2
- Opret C# script og navngiv det EnemyMove
Skrive følgende kode 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}
Stræk 3
- Opfør det til et tomt GameObject(Enemy).
- EnemyMove script har tre offentlige variabler.
- Hvis spillet har så mange fjendtlige GameObject med enemyMove script med det så bruger masser af hukommelse.
- For at som pr vores løsning ScriptableObject, kan vi lave en EnemyData script I stedet for at lagre disse variabler i EnemyMove script.
Stræk 4
- Opret C#-scriptet navngiv det EnemyData.
- som arver ScriptableObject i stedet for Monobehaviour.
Skrive følgende kode i EnemyData.cs.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Stræk 5
- Ændre koden inde i ‘EnemyMove’,som tidligere blev oprettet.
- Opret én offentlig variabel ‘data’, som er referencen til ‘EnemyData’.
- Fjern den offentlige, som allerede er i ‘EnemyData’
Ændre i henhold til følgende kode.
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, at inde i inspektøren for Enemy GameObject på ‘Data’ variabel vises,
Nogen idé..hvad du formoder tildele over her??
Følg mig…
Stræk 1
- Føj en linje i EnemyData.cs som følger
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Stræk 2
- Opret en mappe Game data og gør følgende
Stræk 3
- Nævn den som du vil.
- Nu kan du se alle variablerne inde i EnemyData i inspektørvinduet, du kan ændre værdierne for variablen her.
Stræk 4
- Tilknyt dette til ‘EnemyMove’ script
Jeg er sikker på, at du har fået alle svarene nu.
Konklusion
- ScriptableObject er rigtig godt for det faktum, at de kan dele dine data op i mere store bidder.
- Så du ikke æder en masse hukommelse.
- ScriptableObject er kun til udviklingsformål.