Jump to content
Unity Insider Forum

Kurumi-chan

Members
  • Posts

    29
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Kurumi-chan

  1. Oha, wow. Sascha, ich danke dir vielmals für diesen hilfreichen Ansatz. Das werde ich morgen mal in Angriff nehmen.
  2. Wäre das nicht das selbe nur in Grün? Ich müsste ja auch dort den Datentypen angeben.
  3. Der Parameter gibt den Typ des Datanbankobjekts an, also z.B. Item, Skill, Slot, usw.. Und davon wird dann jeweils die Liste an verfügbaren Objekten geladen und sobald ich eines aus der Liste anklicke, wird der entsprechende Inspector aufgerufen. Nur muss dafür ja der genaue Type bekannt sein, sonst bekomme ich die Daten ja nicht? Die Datenbank ist so aufgebaut, das im Db Objekt die verschiedenen Datenbanken liegen, also z.B. ItemDatabase, SettingDatabase, usw.. Und darin sind dann mehrere Listen. Im Fall ItemDatabase wären das Item, Slot, Currency. Die einzelnen Listen generieren zum einen einen neuen Menüpunkt und sobald man einen davon klickt, wird die entsprechende Liste geladen und angezeigt, sowie der erste Eintrag der Liste geladen. Wenn man nun in der Liste einen anderen eintrag wählt, wird halt dieser geladen, usw. Ps: Das Bild nicht auf die Goldwaage legen, das ist alles noch nicht fertig. 😄
  4. Hey Sascha, danke dir für deine Antwort. Ja, habe schon befürchtet, bzw. gelesen und gesehen, dass es so nicht funktioniert, wie ich es mir wünsche. Aber hatte die Hoffnung, dass wenn ich direkt jemanden danach Frage, derjenige evtl. doch einen Tipp, oder Idee hat. Schade, dann werde ich wohl doch mit switches arbeiten müssen. Wäre anders ja auch zu einfach gewesen^^
  5. Hey Leute, ich würde gerne wissen, ob es möglich ist einen Parameter einer generischen Klassen dynamisch zu erstellen? Als Beispiel: internal class DatabaseEditorSubWindow<DB> : IDatabase where DB : ScriptableObject {} //Wird aufgerufen, wenn ein bestimmter Button geklickt wird. Der Typ der Datenbank wird mitgegeben Hier wird nun geschaut, welche Daten die Datenbank enthält. Dies können z.B. Listen verschiedenen Typs sein. Diese werden geladen und deren Inhalte in eine Variable gepackt. Anschließend werden Buttons generiert, mit denen die Einzelnen Inhalte geladen werden sollen. Dies geschieht dann über eine neue Klasse. internal class DatabaseCoreWindow<DB, TType> : IDatabase where DB : ScriptableObject where TType ScriptableObject, IName {} // Zeigt die Daten an, erstellt neue Inhalte, usw.. Der Aufruf der Klasse sieht folgendermaßen aus m_Child = new DatabaseCoreWindow<DB, (Type)toolbarTypes[i]>(m_Database, toolbarList); // Hier soll TType dynamisch gesetzt und durch den Typ der Liste ersetzt werden, z.B. Item, oder Skill Ich habe dazu verschiedenste Ansätze versucht, aber nichts hat funktioniert. Entweder es kommen Fehler, oder es werden die mitgegebenen Parameter nicht gesetzt. Hat evtl. jemand eine Idee, wie ich das umsetzten kann? Vielen Dank für die Hilfe. LG
  6. 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
×
×
  • Create New...