2017-09-10 9 views
0

実際にUnityEventsをScriptable Objectsで使用できないことを認識した後(グローバル変数値を正しく読み取らない)。ダイアログを保存する場所を別のソリューションに移さなければなりませんでした。プレハブにデータを格納するオプション

最高の解決策は、対応するNPCプレハブに保存することでした。これは本当に便利です。しかし、これは私の口に悪い味を残し、それはちょうどこのようなプレハブにデータを格納するために間違って感じる。それは悪い習慣ですか? たとえば、DialogObjectで何かをリファクタリングすると、すべてが失われます。

私はUnityEventsをどこにでも正常に保存できないようです(Jsonとしてシリアル化することはできませんし、Scriptable Objectsはそれらをうまく処理していないようです)私はこれが唯一の解決策であると感じますエディタを使用してダイアログを作成することができます。

ここで最初に確認するのは、このばかですか?別の方法がありますか?

私はこれのListを保存しようとしています:

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

答えて

2

私ははい、プレハブは、タイプの新しいアイテムを作成するためのテンプレートであることを意味していると言うでしょう。データ状態を保存しようとしています。

UnityEventをシリアル化することはできませんが、その内容をシリアル化することができます。

あなたはインスペクタ経由で割り当てる場合は、https://docs.unity3d.com/ScriptReference/Events.UnityEventBase.GetPersistentMethodName.html

を使用することができますしかし、あなたはそれが行く最初からわかっているならば、あなたは、ストレージの問題を持っていないでしょう。

2番目の解決策は、メソッドをUnityEventに割り当てて保存するときです。

void AddListener (UnityAction ev) 
{ 
    MethodInfo mi = ev.Method; 
    // Use mi 
    postEvent.AddListener(ev); 
} 

mi参照では、メソッドの名前、型、所属するオブジェクト、必要なものがあります。

+0

ありがとう、病院でPersistentMethodNameを試してみてください。あなたがなぜScriptableオブジェクトでうまくいかないのか説明できますか?実際のUnityEventをScriptableオブジェクトに追加すると、正常に動作します。インスペクタで目的のとおりに編集することができます。しかし、アクセスしようとするすべてのグローバル値(例えば 'public int id = 12')はデフォルト値を返します。 –

+0

デフォルト値またはインスペクタの値を返しますか?スクリプトで指定された値を取得する予定ですか? [リセット]をクリックすると、インスペクタがスクリプト値に戻ります。 – Everts

関連する問題