Jump to content
Unity Insider Forum

Prefabs dynamisch erstellen und laden


Kurumi-chan
 Share

Recommended Posts

Hey,

ich habe mal wieder ein Problem­čśĽ

Und zwar habe ich in┬áder DB einige Optionen, die entscheiden ob manche Dinge angezeigt werden oder nicht, bzw. halt Daten, die ja dann auch irgendwie im Spiel verf├╝gbar gemacht werden m├╝ssen. Dazu habe ich mir ├╝berlegt unteranderem Prefabs zu benutzen. Da ich jetzt aber auch faul bin m├Âchte ich das ganze etwas dynamischer gestallten. Ich habe hierzu eine Funktion die das entsprechende Prefab l├Ąd, bzw. erstellt, falls nicht vorhanden. Das funktioniert auch alles soweit ganz gut, nur bekomme ich jetzt eine Performance Warnung und ich verstehe nicht warum.

Die Warnung dazu lautet z. B. (habe die für jeden einzelnen Aufruf) 

Performance warning: There are more than 100 preview scenes. There might be code not releasing the preview scene after creating it.
UnityEditor.PrefabUtility:LoadPrefabContents (string)
Utility:LoadPrefab (string,string,UnityEngine.GameObject) (at Assets/Scripts/Utility.cs:94)
TitleMenu:ShowSplashScreen () (at Assets/Scripts/Menus/TitleMenu/TitleMenu.cs:49)
TitleMenu:Start () (at Assets/Scripts/Menus/TitleMenu/TitleMenu.cs:33)

Die Funktion sieht wie folgt aus

public static GameObject LoadPrefab(string prefab, string folder, GameObject obj = null)
        {
            string localPath = CheckFolder(folder) + prefab + ".prefab";
            if (!File.Exists(localPath))
            {
                obj = (obj != null) ? obj : new GameObject();
                PrefabUtility.SaveAsPrefabAsset(obj, localPath);
            }
            return PrefabUtility.LoadPrefabContents(localPath);
        }

        private static string CheckFolder(string folder)
        {
            if (!Directory.Exists("Assets/Prefabs"))
                AssetDatabase.CreateFolder("Assets", "Prefabs");
            if (folder != "" && !Directory.Exists("Assets/Prefabs/" + folder))
                AssetDatabase.CreateFolder("Prefabs", folder);
            folder = (folder != "") ? folder + "/" : folder;
            
            return "Assets/Prefabs/" + folder;
        }

Und aufgerufen wird das ganze dann

// z.B. so
private void ShowCopyright()
        {
            if (settings.ShowCopyright)
            {
                GameObject copy = new GameObject("Copyright");
                copy.AddComponent<CanvasRenderer>();
                GameObject go = new GameObject("CopyrightText");
                go.transform.parent = copy.transform;
                go.AddComponent<CanvasRenderer>();
                go.AddComponent<TextMeshProUGUI>();
                go.GetComponent<TMP_Text>().text = settings.Copyright;
                Instantiate(Utility.LoadPrefab("CopyrightPrefab", "", copy), TitleMenuPanel.transform);
                Destroy(copy);
                Destroy(go);
            }
        }
// oder so
for (int i = 0; i < BGM.Count; i++)
            {
                GameObject audioObject = Instantiate(Utility.LoadPrefab("AudioPrefab", ""), transform.Find("BGM"));
                audioObject.name = BGM[i].Name;
                audioObject.AddComponent<AudioSource>();
                audioObject.GetComponent<AudioSource>().loop = BGM[i].Loop;
                audioObject.GetComponent<AudioSource>().volume = BGM[i].Volume;
                audioObject.GetComponent<AudioSource>().pitch = BGM[i].Pitch;
                audioObject.GetComponent<AudioSource>().mute = BGM[i].Mute;
                audioObject.GetComponent<AudioSource>().panStereo = BGM[i].StereoPan;
                audioObject.GetComponent<AudioSource>().priority = BGM[i].Priority;
                audioObject.GetComponent<AudioSource>().playOnAwake = BGM[i].PlayOnAwake;
                audioObject.GetComponent<AudioSource>().clip = BGM[i].AudioClip;
            }
// oder so
if (AudioManager.Instance == null)
            {
                GameObject bgm = new GameObject("BGM");
                GameObject sfx = new GameObject("SFX");
                GameObject audioManager = new GameObject("Audio Manager");
                audioManager.AddComponent<AudioManager>();
                bgm.transform.parent = audioManager.transform;
                sfx.transform.parent = audioManager.transform;
                Utility.LoadPrefab("Audio Manager", "Manager", audioManager);
                AudioManager.Instance = audioManager.GetComponent<AudioManager>();
            }

Insgesamt, wenn man die Schleifen nicht mit einbezieht, wird die Funktion LoadPrefab() aktuell 7 mal aufgerufen. Wenn ich die Schleifen mit einbeziehe, dann 12 mal. Der Fehler wiederum wird aber nur 7 mal angezeigt, also auch nur einmal pro Schleifendurchlauf.

Also vorher nimmt der ├╝ber 100 Aufrufe??? Hoffe es hat jemand eine Idee.

LG

Link to comment
Share on other sites

  • Kurumi-chan changed the title to Prefabs dynamisch erstellen und laden

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...
 Share

×
×
  • Create New...