Sök…


Anmärkningar

ScriptableObjects med AssetBundles

Var uppmärksam när du lägger till prefaber i AssetBundles om de innehåller referenser till ScriptableObjects. Eftersom ScriptableObjects i huvudsak är tillgångar skapar Unity dubbletter av dem innan du lägger till dem i AssetBundles, vilket kan leda till oönskat beteende under körning.

När du laddar ett sådant GameObject från en AssetBundle kan det vara nödvändigt att återinjicera ScriptableObject-tillgångarna till de laddade skripten och ersätta de medföljande. Se beroende på injektion

Introduktion

ScriptableObjects är serialiserade objekt som inte är bundna till scener eller spelobjekt som MonoBehaviours är. För att uttrycka det på ett sätt är det data och metoder som är bundna till tillgångsfiler i ditt projekt. Dessa ScriptableObject-tillgångar kan överföras till MonoBehaviours eller andra ScriptableObjects, där deras offentliga metoder kan nås.

På grund av sin karaktär som seriell tillgång gör de utmärkta managerklasser och datakällor.

Skapa ScriptableObject-tillgångar

Nedan visas en enkel implementering av ScriptableObject.

using UnityEngine;

[CreateAssetMenu(menuName = "StackOverflow/Examples/MyScriptableObject")]
public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    int mySerializedNumber;

    int helloWorldCount = 0;

    public void HelloWorld()
    {
        helloWorldCount++;
        Debug.LogFormat("Hello! My number is {0}.", mySerializedNumber);
        Debug.LogFormat("I have been called {0} times.", helloWorldCount);
    }
}

Genom att lägga till attributet CreateAssetMenu i klassen kommer Unity att lista det i undermenyn Assets / Create . I det här fallet är det under Tillgångar / Skapa / Stacköverflöde / Exempel .

När det har skapats kan ScriptableObject-instanser överföras till andra skript och ScriptableObjects via inspektören.

using UnityEngine;

public class SampleScript : MonoBehaviour {

    [SerializeField]
    MyScriptableObject myScriptableObject;

    void OnEnable()
    {
        myScriptableObject.HelloWorld();
    }
}

Skapa ScriptableObject-instanser genom kod

Du skapar nya ScriptableObject-instanser genom ScriptableObject.CreateInstance<T>()

T obj = ScriptableObject.CreateInstance<T>();

Där T utökar ScriptableObject .

Skapa inte ScriptableObjects genom att ringa deras konstruktörer, dvs. new ScriptableObject() .

Skapa ScriptableObjects efter kod under körning krävs sällan eftersom deras huvudsakliga användning är dataserialisering. Du kan lika gärna använda standardklasser på denna punkt. Det är vanligare när du skripts redaktörstillägg.

ScriptableObjects är serialiserade i redigeraren även i PlayMode

Man bör vara extra försiktig när man får åtkomst till seriefält i en ScriptableObject-instans.

Om ett fält markeras public eller serielliseras via SerializeField är ändring av dess värde permanent. De återställs inte när de lämnar spelläge som MonoBehaviours gör. Detta kan vara användbart ibland, men det kan också göra en röra.

På grund av detta är det bäst att göra serialiserade fält skrivskyddade och helt undvika offentliga fält.

public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
    }
}

Om du vill lagra offentliga värden i ett ScriptableObject som återställs mellan uppspelningssessioner, överväg att använda följande mönster.

public class MyScriptableObject : ScriptableObject
{
    // Private fields are not serialized and will reset to default on reset
    private int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
        set { mySerializedValue = value; }
    }
}

Hitta befintliga ScriptableObjects under körning

För att hitta aktiva ScriptableObjects under körning kan du använda Resources.FindObjectsOfTypeAll() .

T[] instances = Resources.FindObjectsOfTypeAll<T>();

Där T är den typ av ScriptableObject-instansen du söker. Aktiv betyder att den har laddats i minnet i någon form tidigare.

Den här metoden är väldigt långsam så kom ihåg att cache-returvärdet och undvik att ringa det ofta. Att hänvisa till ScriptableObjects direkt i dina skript bör vara ditt föredragna alternativ.

Tips: Du kan underhålla dina egna instanssamlingar för snabbare uppslag. Låt dina ScriptableObjects registrera sig i en delad samling under OnEnable() .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow