2017-09-10 2 views
0

Après avoir réalisé que vous ne pouvez pas vraiment utiliser UnityEvents dans les objets scriptables (ils ne lisent pas correctement les valeurs des variables globales). J'ai dû passer à une autre solution pour où stocker mes boîtes de dialogue.Options de stockage des données dans un préfabriqué

La meilleure solution que j'ai pu trouver était de simplement les stocker dans le préfixe NPC correspondant. C'est vraiment pratique. Cependant, cela laisse un mauvais goût dans ma bouche, il se sent juste mal de stocker des données dans un préfabriqué comme celui-ci. Est-ce une mauvaise pratique? Par exemple, si je devais refactoriser quelque chose dans le DialogObject, tout serait perdu. Comme je n'arrive pas à stocker UnityEvents avec succès (je ne peux pas les sérialiser comme Json et comme les objets scriptables mentionnés ne semblent pas bien les gérer) Je pense que c'est la seule solution si je veux être capable d'utiliser l'éditeur pour créer des dialogues.

Juste en vérifiant ici d'abord, est-ce stupide? Y a-t-il un autre moyen?

Je suis en train de sauver une List de ceci:

[System.Serializable] 
public class DialogObject { 
    public List<PageData> conversations = new List<PageData>(); 
    public UnityEvent postEvent; //Invoked on last page of Dialog 
} 

Répondre

2

Je dirais que oui, prefabs sont censés être un modèle pour créer de nouveaux éléments d'un type. Vous essayez d'enregistrer les états de données.

Même si vous ne pouvez pas sérialiser l'UnityEvent, vous pouvez sérialiser son contenu.

Si vous assignez par l'inspecteur, vous pouvez utiliser https://docs.unity3d.com/ScriptReference/Events.UnityEventBase.GetPersistentMethodName.html

Mais alors vous n'auriez pas problème de stockage si vous savez dès le début où il va.

La deuxième solution est lorsque vous affectez la méthode à UnityEvent, stockez-la. Avec la référence mi, vous avez le nom de la méthode, son type, l'objet auquel elle appartient et tout ce dont vous avez besoin.

+0

Merci, j'essaye PersistentMethodName puisque le point entier est de le faire dans l'inspecteur. Pouvez-vous expliquer pourquoi cela ne fonctionne pas dans un objet Scriptable? L'ajout de l'UnityEvent à l'objet Scriptable fonctionne correctement, vous pouvez le modifier dans l'inspecteur comme prévu. Mais toutes les valeurs globales auxquelles vous essayez d'accéder (par exemple 'public int id = 12') renvoie la valeur par défaut. –

+0

Retourne-t-il la valeur par défaut ou la valeur dans l'inspecteur? Vous attendez d'obtenir la valeur donnée dans le script? Essayez de cliquer sur Réinitialiser pour que l'inspecteur revienne aux valeurs de script. – Everts