[Tip] Scriptable Object propertie avec callback

Tous les tutoriaux unity, de la communauté ou d'ailleurs.
Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

[Tip] Scriptable Object propertie avec callback

Message par giyomuSan » 22 Jan 2021 17:34

bon alors , c'est pas nouveau comme principe mais bref..

alors le truc c'est en gros de pouvoir referencer un scriptable object dans un monobehaviour , et de faire savoir aux autre qui reference ce meme scriptable object que il a ete modifier.

scenario simple , vous avez un scriptable object qui gere une seule valeure ( int, bool etc..)
un example de scriptable object

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(fileName = "NewIntAttribute", menuName = "CustomSO/Attribute/IntAttribute")]
public class IntAttribute : ScriptableObject
{
    public int Value;
    [Header("Value that will set on calling reset method")]
    public int InitialValue;

    public void ResetToInitialValue()
    {
        Value = InitialValue;
    }

    public UnityAction OnValueChanged;
    public void NotifyValueChanged()
    {
        OnValueChanged?.Invoke();
    }
}
ensuite de la , vous avez un script qui va referencer ce scriptable object .
la variable Value sera certainememt modifier durant le jeu et , vous voulez le signifier au autre gameobject qui ont besoin de cette valeur.
Dans le script qui va utiliser cette valeure vous pouvez faire ca :

Code : Tout sélectionner

public IntAttribute IntegerUpdatable;
    public bool NotifyPropertyChange = true;
    public string Label = "Value";

    private Text m_Text;

    private void Start()
    {
        m_Text = GetComponent<Text>();
        if (IntegerUpdatable != null && NotifyPropertyChange)
        {
            IntegerUpdatable.OnValueChanged = UpdateText;
        }
    }

    public void UpdateText()
    {
        m_Text.text = Label +" "+ IntegerUpdatable.Value.ToString();
    }
et evidemment il faudra appeler la fonction OnValueChanged de quelque part

Code : Tout sélectionner

public IntAttribute UpdatableLiveCount;

public void Increase()
    {
        UpdatableLiveCount.Value += 1;
        UpdatableLiveCount.NotifyValueChanged();
    }
le truc la c'est que dans l exemple bah le UpdatableLivecount et IntegerUpdatable dans le 2e script c'est le meme scriptable object, la meme reference donc ca marchera pour 1 ou pour 100.

avantage pas de reference direct dans une scene, si vous voulez modifier la valeur, vous le faite depuis le scriptable objet.

bref , bon je sais je suis pas pedagogue pour 2 rond haha , si question il y a , question vous pouvez poser :mrgreen:

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: [Tip] Scriptable Object propertie avec callback

Message par youtpout » 22 Jan 2021 20:06

Il est pas possible de mixer un customattribute avec un scriptable object pour faire la même chose ?
C'est vraiment dommage qu'on ne peux pas utiliser de property dans le scriptableobject

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: [Tip] Scriptable Object propertie avec callback

Message par giyomuSan » 23 Jan 2021 07:14

@youtpout , hmm je suis pas sur de comprendre , property tu veux dire un {get;set;} ?

J'utilise desfois une variante pour gerer des constant ( donc pas modifiable sauf sur le SO lui meme dans l'inspecteur ), et ca se present comme ca en gros :

Code : Tout sélectionner

public class ConstantIntAttributeValue : ScriptableObject
{
    [SerializeField]
    private int m_Constant;

    public int Constant { get { return m_Constant; } }
}
Apres la valeure que tu pass dans le scriptable object elle peut etre ce que tu veux.

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: [Tip] Scriptable Object propertie avec callback

Message par youtpout » 23 Jan 2021 16:13

C'est l'idée, faut savoir qu'en C# traditionnel avec le .net framework on ne fait pas comme dans Unity, c'est considéré comme une mauvaise pratique, mais bon le fonctionnement d'Unity étant ce qu'il est, j'ai remanié ton script pour qu'il correspond un peu plus à ce qu'il se fait classiquement, en même ça m'a permis d'utiliser un scriptable object pour la première fois de ma vie :hehe: , faudrait que je m'y mette un peu plus sérieusement.

Code : Tout sélectionner

[CreateAssetMenu(fileName = "NewIntAttribute", menuName = "CustomSO/Attribute/IntAttribute")]
public class IntAttribute : ScriptableObject
{
    [SerializeField]
    private int value;
    public int Value
    {
        get
        {
            return value;
        }
        set
        {
            this.value = value;
            NotifyValueChanged();
        }
    }

    [Header("Value that will set on calling reset method")]
    public int InitialValue;

    public void ResetToInitialValue()
    {
        Value = InitialValue;
    }

    public UnityAction OnValueChanged;
    private void NotifyValueChanged()
    {
        OnValueChanged?.Invoke();
    }

}
Grâce à ça tu n'as plus besoin d'appeler NotifyValueChanged (surtout que je l'ai défini privé), parce que c'est le genre de truc qu'on oublie et qu'on passe 30min à chercher pourquoi sa valeur ne se met pas à jour :hehe:

J'ai commité un exemple fonctionnel
https://github.com/youtpout/UnityScriptableObject

Parce que de prime abord c'est pas forcément compréhensible le fonctionnement de ce truc, je ne savais même pas que le ScriptableObject ça s'ajoutait comme un Asset à la scène ...

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: [Tip] Scriptable Object propertie avec callback

Message par giyomuSan » 25 Jan 2021 14:50

@youtput ah ok , oui bien vu :D.. ;-)

Répondre

Revenir vers « Tutoriaux »