Ricerca…


Osservazioni

ScriptableObjects con AssetBundles

Prestare attenzione quando si aggiungono prefabbricati a AssetBundles se contengono riferimenti a ScriptableObjects. Poiché ScriptableObjects è essenzialmente un asset, Unity crea dei duplicati prima di aggiungerli ad AssetBundles, il che potrebbe comportare comportamenti indesiderati durante il runtime.

Quando si carica un GameObject da un AssetBundle, potrebbe essere necessario reinserire le risorse ScriptableObject negli script caricati, sostituendo quelli in bundle. Vedi Iniezione di dipendenza

introduzione

ScriptableObjects sono oggetti serializzati che non sono legati a scene o oggetti di gioco come i MonoBehaviours. Per dirla in un modo, sono dati e metodi legati a file di risorse all'interno del progetto. Queste risorse ScriptableObject possono essere passate a MonoBehaviours o ad altri oggetti Scriptable, dove è possibile accedere ai loro metodi pubblici.

A causa della loro natura come risorse serializzate, costituiscono eccellenti classi di gestori e origini dati.

Creazione di risorse ScriptableObject

Di seguito è riportata una semplice implementazione di 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);
    }
}

Aggiungendo l'attributo CreateAssetMenu alla classe, Unity lo elencherà nel sottomenu Risorse / Crea . In questo caso è in Attività / Crea / StackOverflow / Esempi .

Una volta create, le istanze di ScriptableObject possono essere passate ad altri script e ScriptableObjects tramite Inspector.

using UnityEngine;

public class SampleScript : MonoBehaviour {

    [SerializeField]
    MyScriptableObject myScriptableObject;

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

Crea istanze ScriptableObject tramite codice

Crei nuove istanze ScriptableObject.CreateInstance<T>() tramite ScriptableObject.CreateInstance<T>()

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

Dove T estende ScriptableObject .

Non creare ScriptableObjects chiamando i loro costruttori, es. new ScriptableObject() .

La creazione di ScriptableObjects tramite codice durante il runtime è richiesta raramente perché il loro uso principale è la serializzazione dei dati. Potresti anche usare le lezioni standard a questo punto. È più comune quando si eseguono script delle estensioni degli editor.

ScriptableObjects sono serializzati nell'editor anche in PlayMode

Prestare particolare attenzione quando si accede a campi serializzati in un'istanza ScriptableObject.

Se un campo è contrassegnato come public o serializzato tramite SerializeField , la modifica del suo valore è permanente. Non si resettano quando si esce dalla modalità di gioco come fanno i MonoBehaviours. Questo può essere utile a volte, ma può anche creare confusione.

Per questo motivo è meglio rendere i campi serializzati di sola lettura ed evitare del tutto i campi pubblici.

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

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

Se si desidera memorizzare valori pubblici in ScriptableObject che vengono ripristinati tra le sessioni di gioco, considerare l'utilizzo del seguente modello.

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; }
    }
}

Trova ScriptableObjects esistente durante il runtime

Per trovare ScriptableObjects attivo durante il runtime, è possibile utilizzare Resources.FindObjectsOfTypeAll() .

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

Dove T è il tipo di istanza ScriptableObject che stai cercando. Attivo significa che è stato caricato in memoria in una qualche forma prima.

Questo metodo è molto lento, quindi ricorda di memorizzare nella cache il valore restituito ed evita di chiamarlo frequentemente. Fare riferimento a ScriptableObjects direttamente negli script dovrebbe essere l'opzione preferita.

Suggerimento: puoi mantenere le tue raccolte di istanze per ricerche più veloci. OnEnable() ScriptableObjects si registri su una raccolta condivisa durante OnEnable() .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow