Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011

Hellhound

Members
  • Content count

    62
  • Joined

  • Last visited

  • Days Won

    2

Hellhound last won the day on March 31

Hellhound had the most liked content!

Community Reputation

7 Neutral

About Hellhound

  • Rank
    Advanced Member

Recent Profile Visitors

463 profile views
  1. Probleme mit Textur in ScriptableObject

    Habs heut früh ausprobieren können, klappt. Du hattest recht so klappt es, allerdings musste ich vorher noch SaveAssets aufrufen. Zudem habe ich herausgefunden, dass man wirklich auf dem Objekt arbeiten muss, ändert man die Referenz, z.B. durch eine neue Instanz vom selben Typen und weist diese einfach zu, dann greifen die reinen AssetDatabase Mechanismen nicht, sondern man muss zuvor CopySerialized aufrufen. Letzteres hat mich einen Großteil der Zeit gekostet ... Danke noch mal für Deine Tipps.
  2. Probleme mit Textur in ScriptableObject

    Ok, das scheint zumindest der richtige Ansatz zu sein. D.h. ich bekomme die Textur am Asset gesichert, wenn ich nach dem erstmaligen Preview-Aufruf das Asset-Binding durchführe: public void OnEnable() { var item = this.ParentItem; if(item!=null){ var attr = item.GetAttribute<ModelData>(); if(attr!=null && this.texture==null) { prefab = attr.Prefab; this.CreatePreview(); AssetDatabase.AddObjectToAsset(this.texture, this); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(this.texture)); AssetDatabase.SaveAssets(); Debug.Log("Texture bind to Asset on creation."); } } } Dann ist meine Textur am Asset sichtbar und wird auch beim Neustart von Unity erkannt, bzw. beim Start der Engine. Passt soweit. Nur wie bekomme ich es nun geupdated, wenn ich nachträglich im Inspector die Textur modifiziere?
  3. Probleme mit Textur in ScriptableObject

    Wo erzeugst du denn aus der Textur im Speicher ein Asset (außer das Speichern als PNG, ich denke hier wird ein Asset angelegt) und wo weist du das Asset dann dem SO zu? Genau das mache ich nicht, das habe ich implizit erwartet und entspricht den Vermutungen im letzten Absatz vor dem Gruß. D.h. wenn ich Dich richtig verstehe, muss die Textur explizit persistiert und dem Asset zugeordnet werden, da vermutlich das Scriptable Objekt nur eine Refernz auf diese Zuordnung hält. Ich habe bisher nur das Preview-Attribut selbst dem Item SO Asset zugeordnet, wenn das Preview-Attribut erzeugt wird. Ich bin davon ausgegangen, das Unity die Textur implizit sichert, weil die Textur als SerializableField deklariert ist, so wie es sich mit den anderen Objekten, wie z.B. Vector3 usw. auch verhält, die binde ich ja auch nicht explizit an das Asset. Das PNG war ja nur ein Zwischenschritt um zu Prüfen ob überhaupt was generiert wird. Dann muss ich mir das noch mal näher anschauen ...
  4. Probleme mit Textur in ScriptableObject

    Danke für Deinen letzten Hinweis. Habe heute Morgen gleich noch mal geschaut und dabei ist mir aufgefallen, das beim sauberen Start von Unity die Texturen ebenfalls zurückgesetzt sind, ich jedoch erwartet hätte, das sie serialisiert wurden. Irgendwie habe ich da jetzt generell nen Knoten im Kopf, daher versuche ich noch mal zu veranschaulichen, wie der konkrete Prozess ist (leider ist der Code zu umfangreich um ihn hier zu posten). Hier einmal ein Klassendiagram zur aktuellen Struktur. D.h. ich habe ein ScriptableObject (Item), das selbst mehrere ScriptableObjects (ItemAttributes) enthält. Erzeugt wird das Item über den ItemEditor. Wird dem Item ein Attribut hinzugefügt, dann wird dies am Asset gespeichert: // Draw a popup and button to add a new attribute: EditorGUILayout.BeginHorizontal(); attributeNameIndex = EditorGUILayout.Popup(attributeNameIndex, attributeNames.ToArray(), GUILayout.Height(15)); if (GUILayout.Button("+", EditorStyles.miniButton, GUILayout.Width(20))) { // A little tricky because we need to record it in the asset database, too: var newAttribute = CreateInstance(attributeNames[attributeNameIndex]) as ItemAttribute; newAttribute.ParentItem = item; newAttribute.hideFlags = HideFlags.HideInHierarchy; AssetDatabase.AddObjectToAsset(newAttribute, item); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(newAttribute)); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); item.attributes.Add(newAttribute); } EditorGUILayout.EndHorizontal(); Damit habe ich mein Asset (erster Screenshot AKM im Ressourcen-Verzeichnis) das die gehaltenen ScriptableObject ItemAttributes ebenfalls am Asset gebunden hat, die dynamisch über den ItemEditor hinzugefügt wurden. Das klappt soweit auch hervorragend. Alle Werte die ich bisher (Ausßnahme PreviewAttribut) im Inspector setzte, bleiben erhalten und sind sowohl nach dem Unity Neustart als auch beim Engine Start am AKM Asset serialisiert und beim Abruf über die ItemDatabase gesetzt. Sonderfall ist jetzt nur das PeviewAttribut. Dieses erstellt beim erstmaligen Aufruf von OnEnable eine RenderTexture dessen Ergebnis in eine Texture2D überführt wird. Hier erstmal der OnEnable Aufruf: #if UNITY_EDITOR public void OnEnable() { var item = this.ParentItem; if(item!=null){ var attr = item.GetAttribute<ModelData>(); if(attr!=null && this.texture==null){ prefab = attr.Prefab; this.CreatePreview(); } } } Und hier die Erstellung der Preview: private void CreatePreview(){ if (this.prefab != null){ Debug.Log("Generate preview: " + prefab.name); string id = this.prefab.name; var renderTexture = new RenderTexture(1280, 720,(int)RenderTextureFormat.ARGB32); renderTexture.name = this.prefab.name; this.camera = this.SetUpCamera(renderTexture); this.camera.nearClipPlane = 0.03f; var center = this.camera.ScreenToWorldPoint(new Vector3(Screen.width/2, Screen.height/2, 0.4f)); if (camera != null) { GameObject go = (GameObject)Instantiate(prefab); go.transform.position = (center + this.objectOffset); EditorUtils.SetLayerRecursively(go, LayerMask.NameToLayer("Weapon")); go.SetActive(true); go.transform.rotation = Quaternion.Euler(0.0f, cameraRotation, 0.0f); camera.Render(); RenderTexture.active = renderTexture; Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.ARGB32, false); texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture.Apply(); RenderTexture.active = null; this.texture = texture; this.image = texture; // Encode texture into PNG byte[] bytes = this.texture.EncodeToPNG(); File.WriteAllBytes(Application.dataPath + "Test-" + id + ".png", bytes); GameObject.DestroyImmediate(go); GameObject.DestroyImmediate(camera.gameObject); //GameObject.DestroyImmediate(renderTexture); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } } #endif Ich habe testhalber auch mal eine PNG Erstellung mit eingebaut, die Textur wird erzeugt und liegt auch im Application-Root vor. Damit funktioniert zumindest das Rendern. Ich habe auch noch einmal auf Deinen Vorschlag hin das Asset gespeichert und aktualisiert, das ändert jedoch nichts ... Wird Unity neu gestartet bzw. die Engine gestartet, dann ist im OnEnable Aufruf die zuvor gesetzte Textur-Referenz wieder null. Ich hätte jetzt erwartet, das diese serialisiert ist, da ja zuvor schon das PNG erstellt wurde. Und genau das verstehe ich jetzt nicht. Ok, ich könnte das ganze so umbbauen, das die PNG geladen wird, wenn vorhanden, aber eigentlich wollte ich das nur InMemory machen ohne explizite PNG Erstellung. Kann es sein, das genau hier das Problem liegt? D.h. ich muss die Textur irgendwo speichern, da Unity intern nur Refernzen bei der Serialisierung hält und die Texturdaten an sich nicht serialisiert sind? Bzw. Müsste ich die Textur explizit an das Asset binden, wie ich es mit dem ItemAttribut im Editor mache? Gruß Hellhound P.S.: Was mich grad zusätzlich stutzig macht, ist das die Ergebnisse des Texturrenderns bei gleichen Werten unterschiedlich sind. Wenn ich die Textur erzeugt und ausgerichtet habe sieht das ganze so aus. Starte ich Unity neu dann wird beim neuen OnEnable-Aufruf mit gleichen Settings folgendes Resultat gerendert. Wie kann das sein? Gleiche Werte, unterschiedliche Ergebnisse. Modifiziere ich dann egal welchen Wert im Inspector am Preview-Attribute und setze ihn anschließend zurück auf den Ausgangswert, habe ich wieder das ursprüngliche Render Ergebnis vor dem Neustart.
  5. Probleme mit Textur in ScriptableObject

    Ok verstehe was Du meinst, das werde ich morgen mal ausprobieren. Was mich allerdings stutzig macht ist,dass beim OnEnable Aufruf beim Starten der Applikation des ScriptableObjects die Textur bereits gesetzt ist (wurde ja schon einmal im vor Programmstart editiert) und daher nicht noch einmal erstellt wird da sie ja bereits serialisiert ist. Beim Laden des Assets fehlt diese jedoch, die anderen serialisierten Werte sind jedoch da. Das ist ja der Vorteil des Scriptable Objects, einmal angelegt und über den Editor befüllt ist der Wert persistiert ... dachte ich zumindest ....
  6. Hallo zusammen, ich habe aktuell mit meinem Previewer ein Problem was ich mir nicht erklären kann. Der Previewer ist ein ScriptableObject, der eine 2DTextur als SerializedField hält. Diese Textur wird in der OnEnable Methode erstellt, wenn sie noch nicht gesetzt ist. Das funktioniert soweit auch hervorragend, Betrachte ich das Asset des Scriptable Objects im Editor ist alles wie es sein soll, wie dieser Link zeigt. Nun starte ich jedoch die UnityEngine und hier tritt das Problem auf: Der Debugger zeigt mir das OnEnable beim Start noch einmal aufgerufen wird. Am ScriptableObject sind alle Wert auch die Textur gesetzt, wie dieser Screenshot zeigt. Wird nun jedoch das Item-Asset geladen, das kurz nach dem Aufruf von OnEnable geschiet, dann sind sämtliche Referenzen enthalten, sogar eine Referenz auf das serializierte FBX-Model, alleridngs sind die Objekt-Referenz Image und die Textur-Referenz texture null, wie dieser Screenshot zeigt. Und das verstehe ich nicht. Beide Objekte sind als SerializedFields markiert, scheinen aber dies nur im Kontext des Editors zu sein. Muss ich bei Texturen etwas spezielles berücksichten wenn ich diese in einem ScriptableObject serialisieren will, die ich zuvor dynamisch erzeugt habe? Gruß Hellhound
  7. Preview Generator

    Danke für den Schlag auf den Hinterkopf. Manchmal sieht man echt den Wald vor lauter Bäumen nicht, wenn man sich irgendwo festbeist. Klingt machbar, wenn natürlich nicht so schön sauber, auch wenn es letztendlich egal ist, da die Objekte eh zerschlagen werden.
  8. Preview Generator

    Hallo zusammen, ich bin wiedereinmal an dem Punkt in meinem Customizer angekommen, wo ich versuchen will, Preview Images für meine Assets dynamisch zu erzeugen. Die Idee ist es aktuell dies direkt bei der Asset-Generierung zu machen, indem das ScriptableObject, welches dem Asset das Prefab zuweist auf dessen Basis auch das Rendering durchführt. Soweit so gut, hier einmal der dirty code, aus dem Editor-Skript des ScriptableObject: public void OnEnable() { //this.preview = AssetPreview.GetAssetPreview(prefab); this.texture = null; if (this.prefab != null && this.texture == null){ Debug.Log("Generate preview!"); string id = this.prefab.name; renderTexture = new RenderTexture(2048, 1600,(int)RenderTextureFormat.ARGB32); renderTexture.name = this.prefab.name; //Fake, später auf eigene Instanz umstellen this.camera = Instantiate<Camera>(GameObject.Find("Preview-Camera").GetComponent<Camera>()); if (camera != null) { Debug.Log("Camera instanz gefunden!" + this.prefab.name); camera.targetTexture = renderTexture; camera.gameObject.SetActive(false); //camera.cullingMask = LayerMask.NameToLayer(id); GameObject go = (GameObject)Instantiate(prefab); go.transform.position = new Vector3(0.0f, 1.0f, 0.0f); //go.transform.rotation = Quaternion.identity; this.SetLayerRecursively(go, LayerMask.NameToLayer("Weapon")); go.SetActive(true); camera.Render(); RenderTexture.active = camera.targetTexture; Texture2D texture = new Texture2D(camera.targetTexture.width, camera.targetTexture.height, TextureFormat.ARGB32, false); texture.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0); texture.Apply(); RenderTexture.active = null; this.texture = texture; Debug.Log("Camera instanz gerendert "); GameObject.DestroyImmediate(go); GameObject.DestroyImmediate(camera.gameObject); } } } Soweit so gut, klappt auch bei einem einzelnen Objekt. Dumm ist nur, wie ich festgestellt habe, das Unity die OnEnable Aufrufe der Scriptable-Objects parallel abarbeitet. Dies führt dazu das beim ersten Aufruf noch alles passt, dann aber in den Folgeaufrufen mehrere Objekte übereinannder gerendert werden, da die Aufrufe parallel sind und die vorherigen Objekte nicht schnell genug gelöscht werden. Die Idee die ich hatte war dann separate Scenen zu erzeugen. Darf ich aber nicht aus der OnEnable-Methode heraus. Für jedes Objekt Temporär einen Layer erzeugen, setzen, rendern und Löschen geht auch nicht so einfach. Jetzt gehen mir aktuell die Ideen aus. Da es sich später um größere Mengen an Objekten handelt, hätte ich das ganze gern einmalig gehabt, automatisch beim Anlegen des Scriptable Objektes und nicht dauerhaft zur Laufzeit ... Hat jemand von Euch evtl. einen Vorschlag für mich? Gruß Hellhound
  9. Zündende Idee für Array und Schleife

    Hi, ich würde Dein Design überarbeiten. Eine Zahl ist bei Dir mehr als ein nummerischer Wert, sondern eher ein komplexes Objekt, das verschiedene Ausprägungen und Status annehmen kann. Ich würde mir daher eher eine Klasse oder Struct bauen, was genau diese verschiedenen Status und davon abhängigen Ausprägungen und Werte für genau eine Zahl abbildet. Dieses kannst Du dann beliebig erweitern und z.B. auch mit Events versehen auf die Du an anderer Stelle reagieren kannst. Auch die Visualisierung sollte diese Klasse selbst steuern. Nur so bekommst Du alles sauber unter einen Hut ...
  10. Embedded ScriptableObject Asset zuweisen

    Ok, scheint gelöst zu sein. Wie es ausschaut hatte ich noch ein Problem mit der Deklaration meiner Member. Da ich diese im ScriptableObject nicht public deklariert hatte musste ich explizit [SerializeField] setzen und siehe da, die Änderungen scheinen berücksichtigt zu werden...
  11. Embedded ScriptableObject Asset zuweisen

    Habe inzwischen es auch versucht basierend auf diesem Link und dem was ich bereits bei den Attributen mache eine neue Instanz des geladenen Objektes an das Asset zu binden: protected void OnEnable() { type = EditorUtils.LoadItemType("ItemTypes"); var item = target as Item; if (item.itemType == null) { var newItemType = Instantiate(type); item.itemType = newItemType; newItemType.hideFlags = HideFlags.HideInHierarchy; AssetDatabase.AddObjectToAsset(newItemType, item); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(newItemType)); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); item.itemType = itemType.objectReferenceValue as ItemType; EditorUtility.SetDirty(item);*/ } // fill up the popup-list based on assets inherhited from specific type Type[] types = Assembly.GetAssembly(typeof(ItemAttribute)).GetTypes(); attributeNames = (from Type type in types where type.IsSubclassOf(typeof(ItemAttribute)) select type.FullName).ToList(); } Dies führt zwar nicht mehr zu einem Fehler, der besagt das das Asset bereits existiert, auch zur Laufzeit ist nach wie vor alles ok, solange ich Unity nicht neu starte. Wird Unity neu gestartet erhalte ich beim direkten Laden der Objekte wieder die Fehlermeldung, dass ItemType eine NullReferenz ist .... Hier der Ladecode: void Awake() { List<Item> items = EditorUtils.FindAssetsByType<Item>(); for(int i=0; i<items.Count; i++){ var item = items[i]; Debug.Log("Item found: " + item.nameID); Debug.Log("ItemType: " + item.itemType.Selected.ElementAt(0)); ---> Exception nach Neustart } } Edit: Muss mich korrigieren, der letzte Schritt klappt. Mit dieser Implementation gibt es zumindest keine NullReferenceExceptions mehr. D.h. die ItemType-Referenz ist nicht mehr null. Allerdings werden Änderungen an diesem ItemType nicht nachträglich gesichert, diese Änderungen erfolgen nicht über dem ItemEditor am geladenen Objekt, sondern direkt am gesetzten ItemType wenn ich beim Rendern itemType.DoLayout() aufrufe, hier wird der selektierte Wert in eine separate Variable am ItemType geschrieben. Nach dem Neustart ist diese Änderung futsch ... Normalerweise aktualisieren sich ScriptableObjects ja automatisch wenn EditorUtility.SetDirty aufgerufen wird. Ich rufe in der DoLayout am Ende EditorUtility.SetDirty(this) auf. Das scheint jecoh nicht zu greifen. public void DoLayout(){ EditorGUILayout.BeginHorizontal(); this.index = EditorGUILayout.Popup(nameID + ": ", this.index, labels.ToArray()); var value = labels[index]; this.selected.Clear(); this.selected.Add(value); EditorGUILayout.EndHorizontal(); EditorUtility.SetDirty(this); } Habe ich irgend etwas übersehen?
  12. Hallo zusammen, für mein Inventory setze ich verstärkt auf ScriptableObjects. Als Basis habe ich eine generische Item Klasse mit der sämtliche Items als ScriptableObjects definiert werden können: public class Item : ScriptableObject { /** The name identifier of the item*/ public string nameID = "New item"; /** Reference of the item type to specifiy the kind of item.*/ public ItemType itemType; /** The list of composed attributes. */ public List<ItemAttribute> attributes = new List<ItemAttribute>(); } Sowol ItemType als auch ItemAttribute sind selber wieder Scriptable Objects. Für Items und ItemTypes habe ich eigene Editoren geschrieben, die mir das Erstellen als Asset ermöglichen. Die ItemAttribute basieren auf Klassen, die ich zur Laufzeit lade und im ItemEditor dynamisch hinzufüge: // Draw a popup and button to add a new attribute: EditorGUILayout.BeginHorizontal(); attributeNameIndex = EditorGUILayout.Popup(attributeNameIndex, attributeNames.ToArray(), GUILayout.Height(15)); if (GUILayout.Button("+", EditorStyles.miniButton, GUILayout.Width(20))) { // A little tricky because we need to record it in the asset database, too: var newAttribute = CreateInstance(attributeNames[attributeNameIndex]) as ItemAttribute; newAttribute.hideFlags = HideFlags.HideInHierarchy; AssetDatabase.AddObjectToAsset(newAttribute, item); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(newAttribute)); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); item.attributes.Add(newAttribute); } EditorGUILayout.EndHorizontal(); Das klappt soweit hervorragend. Allerdings machen mir das ItemType ein Strich durch die Rechnung. Dabei handelt es sich um ein ScriptableObjekt, das die Definition diverser Strings als Liste ermöglicht, die ich in dem Objekt selbst dann wie eine Enumeration zur Auswahl anbiete und selektieren kann. So habe ich mir z.B. ein ItemType Asset gebaut, das aktuell die Werte Weapon und Clothing als Strings hält. Auch das passt, nun möchte ich jedoch am Item genau dieses Asset laden, klonen und als eigene Instanz binden. Bisher habe ich folgendes im ItemEditor versucht: protected void OnEnable() { type = EditorUtils.LoadItemType("ItemTypes"); var item = target as Item; if (item.itemType == null) { item.itemType = Instantiate(this.type); EditorUtility.SetDirty(item); } // fill up the popup-list based on assets inherhited from specific type Type[] types = Assembly.GetAssembly(typeof(ItemAttribute)).GetTypes(); attributeNames = (from Type type in types where type.IsSubclassOf(typeof(ItemAttribute)) select type.FullName).ToList(); } Das klappt solange, bis ich Unity schließe. Wird das Projekt neu geladen erhalte ich beim Rendern ein NullReferenceException wenn ich item.itemType.DoLayout() aufrufe, da item.itemType nun wieder null ist. Wie bekomme ich den Wert am Asset gespeichert? Ich habe es auch schon über SerializedProperties versucht: protected void OnEnable() { type = EditorUtils.LoadItemType("ItemTypes"); var item = target as Item; if (item.itemType == null) { //typeIndex = type.labels.IndexOf(item.type); itemType = serializedObject.FindProperty("itemType"); if (itemType != null) { var value = itemType.objectReferenceValue; if (value == null) itemType.objectReferenceValue = Instantiate(this.type); serializedObject.ApplyModifiedProperties(); } //item.itemType = Instantiate(this.type); EditorUtility.SetDirty(item); } // fill up the popup-list based on assets inherhited from specific type Type[] types = Assembly.GetAssembly(typeof(ItemAttribute)).GetTypes(); attributeNames = (from Type type in types where type.IsSubclassOf(typeof(ItemAttribute)) select type.FullName).ToList(); } Das führt aber ebenfalls zu einem NullRefernceException an der gleichen Stelle. Meine Vermutung ist, ich bekomme den Wert nicht am Asset gesetzt. Ein Versuch AddObjectToAsset zu verwenden hat jedoch zu der Meldung geführt das der ItemType bereits gesetzt ist. Leider hilft mir das Netz nicht unbeding weiter, ich google schon in Einträgen rum, die älter sind als 8 Jahre Hat jemand von Euch eine Idee? Viele Grüße Hellhound
  13. Pirat mit Haken, Haken schießen (3D-Modell)

    Würde ich den Haken jetzt entfernen und in Unity wieder an das Modell setzten dann wird der Haken doch nicht mehr mit Animiert wenn der Pirat z.B. beim Laufen seinen Arm bewegt oder vertue ich mich da? Ja da irrst Du dich. Kenne mich mit Cinema4D nicht aus, sondern nur ein bissl mit Blender. Aber wird vermutlich ähnlich sein. Der Haken dollte eine eigene Meshgruppe sein, wie bereits erwähnt. Den Haken selbst musst Du dann ebenfalls Riggen und zwar mit dem gesammten Rig deines Modells. Wobei der Haken nur mit den betroffenen Bones am Armstumpf gewichtet wird. So mache ich das z.Z. in Blender um z.B. meinem Avatar auszurüsten. Z.B. mit einem Helm oder anderem Kleidungsstück. Jedes Modell hat dabei exakt das gleiche Rig. Google mal nach Rigging Clothing evtl. findest Du da was auch für Cinema4D. Ansonsten würde ich es so umsetzen wie Zer0Cool es beschrieben hat.
  14. Karten mischen per Script

    Ist eigentlich ganz einfach, die letzte Zeile die Du nicht verstehst, stellt sicher, dass die Karte die Du zuvor in Zeile 1 aus dem Deck genommen hast mit der Karte ausgetauscht wird, die Du in der zweiten Zeile per Zufall ausgewählt hast. Versuche Dir das ganze mal Beispielhaft an einem Pseudo-Ablauf zu visualisieren: Kartendeck: Herz 5, Pik 6, Caro Bube, Herz Dame Daraus folgt Kart.length = 4 In jedem Durchlauf wird zufällig eine Karte im Range des Decks ausgewählt: Zufall = Range (0,4) Zufallszahl beim Aufruf von Update z.B.: 2 Nun folgen die Iterationen über das Deck: i=0; i<4; i++ Kartenspeicher = kart[0] (Herz5) Kart[0] = kart[2] (Caro Bube) Kart[2] = kartenspeicher (Herz5) Kartendeck: Caro Bube, Pik 6, Herz 5, Herz Dame i=1; i<4; i++ Kartenspeicher = kart[1] (Pik 6) Kart[1] = kart[2] (Herz5) Kart[2] = kartenspeicher (Pik 6) Kartendeck: Caro Bube, Herz 5, Pik 6, Herz Dame usw ...
  15. Ah danke für den Hinweis . Na auf die Idee muss ersteinmal jemand kommen ...
×