Jump to content
Unity Insider Forum
MaZy

GameObjects die per script geändert wurden sind nicht persistent

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.

Share this post


Link to post
Share on other sites

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();

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...

×
×
  • Create New...