Programmgesteuertes Festlegen und Speichern des mit einem importierten Asset verknüpften Symbols

8

Ich habe einige automatisch generierte Daten, die in mein Unity-Projekt exportiert werden. Um mir zu helfen, möchte ich diesen Assets ein benutzerdefiniertes Symbol zuweisen, um sie eindeutig zu identifizieren. Dies ist natürlich einfach über den Editor selbst möglich, aber idealerweise möchte ich das beim Import automatisch machen.

Zu diesem Zweck habe ich einen AssetPostProcessor geschrieben, der das für mich erledigen soll. Im folgenden Beispiel (das für MonoScripts als Beispiel gilt, aber für alle Arten von Assets gelten könnte) wird allen neu importierten Skripten das MyFancyIcon-Symbol zugewiesen. Dieses Update ist sowohl auf den Skript-Assets selbst als auch auf den MonoBehaviours im Inspector sichtbar.

%Vor%

Und es funktioniert gut, bis auf ein Problem. Die Updates werden nicht gespeichert, wenn Sie das Projekt schließen und erneut öffnen. Nach meinem besten Wissen sollte entweder der Aufruf EditorUtility.SetDirty(script); oder zumindest der Aufruf AssetDatabase.SaveAssets(); erfolgen.

Betrachtet man jedoch den Unterschied zwischen der manuellen Zuweisung eines Symbols (was funktioniert) und der programmgesteuerten Ausführung, gibt es in den Metadateien, die den Assets zugeordnet sind, ein icon -Feld, das beim manuellen Zuweisen eines Symbols jedoch nicht gesetzt wird in meinem Skript Fall. (Im Script-Fall werden die Meta-Dateien nicht einmal aktualisiert)

Was gibt's? Muss ich etwas tun, wenn es (scheinbar) nur Metadaten sind, die ich verändere? Gibt es etwas Einfaches, das ich übersehe?

    
Bart 02.12.2016, 13:30
quelle

2 Antworten

5

Mit diesem Code experimentiert und festgestellt, dass dies ein Fehler ist. Kontakt mit Unity hergestellt und dies ist ihre Antwort:

  

Derzeit ist es ein eingereichter Fehler und unser Entwicklerteam ist es   untersuchen es. Es scheint, dass dieser Fehler anscheinend auftritt   AssetDatabes.SaveAssets () speichert keine Änderungen.

Die Aufgabe besteht darin, dies manuell zu tun.

Daten werden verarbeitet und gespeichert, wenn OnPostprocessAllAssets aufgerufen wird:

1 . Erstellen Sie eine JSON-Datei mit Einstellungen, die die Einstellungen enthalten, falls sie nicht vorhanden sind.

2 .Wenn OnPostprocessAllAssets aufgerufen wird, laden Sie alte JSON-Dateieinstellungen.

4 . Wenden Sie ein fantastisches Symbol auf das Asset an.

5 .Loop über die geladenen JSON-Dateieinstellungen und prüfen, ob sie die Datei vom Parameter importedAssets enthält.

Wenn es die geladene Datei enthält, ändern Sie diese Einstellung und speichern Sie sie. Wenn dies nicht der Fall ist, fügen Sie es zur Liste hinzu und speichern Sie es.

6 .Überprüfen Sie, ob das Asset importedAssets auf der Festplatte nicht mit File.Exists existiert. Wenn es nicht existiert, entfernen Sie es aus der Liste der geladenen JSON-Dateieinstellungen und speichern Sie es dann.

Beim Laden von Unity wird das ausgefallene Symbol automatisch erneut angewendet:

1 Fügen Sie der Klasse IconAssignmentPostProcessor einen statischen Konstruktor hinzu. Dieser statische Konstruktor wird automatisch aufgerufen, wenn der Editor geladen wird und auch wenn OnPostprocessAllAssets aufgerufen wird.

2 .Wenn der Konstruktor aufgerufen wird, erstellen Sie eine JSON-Datei, die die Einstellungen enthält, falls sie nicht existiert.

3 .Laden Sie die alten JSON-Dateieinstellungen.

4 .Übernehmen Sie die ausgefallenen Symbole, indem Sie die geladene JSON-Datei durchlaufen.

5 .Überprüfen Sie, ob die geladene JSON-Datei noch Assets enthält, die sich nicht auf dem Laufwerk befinden. Wenn ja, entfernen Sie dieses Asset aus der Liste und speichern Sie es.

Im Folgenden sehen Sie, wie das neue IconAssignmentPostProcessor -Skript aussehen sollte:

%Vor%

Dies sollte die ausgefallenen Symbole enthalten, wenn Unity neu gestartet wird.

    
Programmer 21.12.2016, 14:21
quelle
0

Ich denke, dass Sie Ihre Antwort hier finden können: Ссылка

Leider.

    
Maakep 02.12.2016 14:53
quelle

Tags und Links