Jump to content
Unity Insider Forum

GameObjects die per script geändert wurden sind nicht persistent


MaZy

Recommended Posts

Hallo, ich habe einen Script welches im Editor automatisch läuft. Der überwacht, ob sich in der Hierarchy was geändert hat. Wenn ja sucht es nach bestimmten Components und setzt dann die Werte (einfach jeden eine bestimmte Zahl zuweisen). Doch sobald man von ein anderen Scenen in die Scene in Playmode wechselst sind die Werte plötzlich wieder zurück gesetzt zu den Wert, den ich per Hand eingegeben habe ODER es nimmt den Standardwert von Prefab oder so.
Ich vermute mal, dass mir irgendwas wie speichern fehl, aber finde dazu kaum was. Es hat was zwar mit Editor zu tun, aber erbt den Editor Script nicht.

Auch was mir eingefallen ist, dass normaleweise ja wenn man in der Scene im Inspector vom Prefab Werte ändert, dass es in Fettschrift angezeigt wird. Das passiert beim Script auch nicht.

using Maz.Network.UnityEngine;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

[InitializeOnLoad]
public static class NetworkSceneObjectEditor
{

    static NetworkSceneObjectEditor()
    {
        if(!EditorApplication.isPlaying)
            EditorApplication.hierarchyChanged += OnHierarchyChanged;
    }

    static void OnHierarchyChanged()
    {
        if (EditorApplication.isPlaying)
            return;

        var all = Resources.FindObjectsOfTypeAll<NetworkSceneObject>();
        var networkSceneObjects = all.Where(obj => (obj.hideFlags & HideFlags.HideInHierarchy) != HideFlags.HideInHierarchy);
        //Debug.LogFormat("There are currently {0} GameObjects visible in the hierarchy.", networkSceneObjects.Count());

        int i = 0;
        foreach (var o in networkSceneObjects)
        {
            var netObject = o.GetComponent<NetworkObject>();
            if (netObject == null)
            {
                Debug.Log("NetworkObject is missing! NetworkSceneObject will not work");
                continue;
            }

            o.scenenNetId = i;
            netObject.NetId = i;
            //EditorUtility.SetDirty(o);
            //EditorUtility.SetDirty(netObject);
            //EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());

            i++;
        }

        Debug.Log($"Hiearchy changed");
    }
}

Hab paar Dinge versucht mit speichern der Scene oder SetDirty, aber da merke ich, dass dann dieser Event gespamt wird.

Hab keine weiteren Ideen mehr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok hat lange gedauert, aber man muss mit serializeObject arbeiten. Man muss also in meinem fall das hier machen

            SerializedObject scenenObjectSO = new SerializedObject(scenenObjects);
            var scenenNetId = scenenObjectSO.FindProperty("scenenNetId");
            scenenNetId.intValue = i;
            scenenObjectSO.ApplyModifiedProperties();

            SerializedObject netObjectSO = new SerializedObject(netObject);
            var netIdProp = netObjectSO.FindProperty("netId");
            netIdProp.intValue = i;
            netObjectSO.ApplyModifiedProperties();

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...