Plugin API - Wehre schön, wenn & Fehlerberichte - It would be nice, if & bug reports

A new update is now available, introducing a lot of new content!
Latest hotfix: 0.7.5.2 (2024-09-10)
  • die meisten Inventar- und Item-Events

    Kein Stress, wollte nur Testen weil es "neu" da ist:thumbup:


    Ist zwar nicht ganz so elegant

    aber Funktioniert wunderbar.
    Im algemeinen ist das super, das die Menüs getrennt sind. Ich will da auch garnicht so viel an bringen ^^
    Wunderbar das es möglich ist:wow:


    Ein UIElement kann leider nur auf einem Target gleichzeitig sein

    Kein ding, das ist nur eine wichtiege Info, wenn mann in die Versuchung kommt

  • Für ganz Hinten auf der Liste:D

    Bei moveToLocalPosition würde ich gerne noch die Höhe wehren dessen überarbeiten
    Wenn ich mir etwas hinterher "laufen" lasse und es durch entfernung getriggerte neue Positionen gibt (der zurüch kelegte weg ist mal Kürzer oder Länger und kann auch mal mehr Steigung haben), fürt der Weg manschmal durch ein hügel oder über ein Tal, und in diesen Momenten würde ich gerne ein getTerrainsHeight einbauen^^
    Entwerder da eine kleine Calback/Run oder mit der möglichkeit moveToLocalPosition(Vector3f position, float speed, boolean includeWater) wo der Scann schon mit drinn ist
    Mir wehre ein calback lieber, feinere Kontrolle.


    Ich weiß nicht wie weit der Status genau ist, aber zur Info UILabel.setFont will auch noch nicht wirklich


    Könnte der ClassLoader vom Spiel, die nicht vorhabdene Klassen überspringen?

    Ich würde das später im Enabel Abschnit selber Prüfen ob das Plugin mit den Klassen Vorhanden ist oder nicht;)

  • ich wünsche mir einPrefab.setAnimatorResetTrigger(String path, String trigger), wie bei Animator.ResetTrigger
    OK, ich probiere es erstmal mit einer Boolean Steuerung^^
    Also mit Boolean bekommt man das eigendlich ziemlich gut hin.
    :wacko:vieleicht braucht mann den ResetTrigger doch nicht :D

  • Bei moveToLocalPosition würde ich gerne noch die Höhe wehren dessen überarbeiten
    Wenn ich mir etwas hinterher "laufen" lasse und es durch entfernung getriggerte neue Positionen gibt (der zurüch kelegte weg ist mal Kürzer oder Länger und kann auch mal mehr Steigung haben), fürt der Weg manschmal durch ein hügel oder über ein Tal, und in diesen Momenten würde ich gerne ein getTerrainsHeight einbauen ^^
    Entwerder da eine kleine Calback/Run oder mit der möglichkeit moveToLocalPosition(Vector3f position, float speed, boolean includeWater) wo der Scann schon mit drinn ist
    Mir wehre ein calback lieber, feinere Kontrolle.

    Das ist leider etwas schwierig... momentan wird die Bewegung bei moveTo vom Client und Server separat berechnet (d.h. der Client bekommt die Anweisung, das Objekt "smooth" an die Zielposition zu bewegen, und der Server berechnet die derzeitige Position eigenständig). Das ist deshalb so gemacht, damit der Traffic zwischen Client und Server so gering bleibt wie möglich (so wird nur 1 Paket zum Client gesendet, statt jeden Tick die Position zw. Client und Server zu synchronisieren, was selbst bei kurzen Strecken zu hunderten oder gar tausenden Paketen führen würde)...


    Denkbar wäre ggf. aber ein optionales Callback, in welchem die aktuelle Position übergeben wird, die man dann entsprechend ändern könnte... das würde aber natürlich auch zu viel Traffic führen... dazu müssten wir uns mal Gedanken machen :thinking:


    Ich weiß nicht wie weit der Status genau ist, aber zur Info UILabel.setFont will auch noch nicht wirklich

    Ja, das ist leider noch nicht ganz umgesetzt... das wird sich hoffentlich bis zum nächsten Update ändern ^^


    Könnte der ClassLoader vom Spiel, die nicht vorhabdene Klassen überspringen?

    Ich würde das später im Enabel Abschnit selber Prüfen ob das Plugin mit den Klassen Vorhanden ist oder nicht ;)

    Das klappt leider nicht :/ Grundsätzlich ist es erstmal noch kein Problem, wenn eine Klasse nicht gefunden wird (weil zB noch nicht geladen). Wenn diese Klasse aber dann bereits verwendet werden soll (obwohl noch nicht geladen), gibt es entsprechend einen Fehler (was ja auch logisch ist, schließlich kennt Java weder den Konstruktor noch eine der Methoden dieser Klassen).

    Dieses Problem tritt i.d.R. dann auf, wenn Klassenvariablen (oder statische Variablen) direkt ein fremdes Objekt initialisieren. ZB wenn ein fremdes Plugin eine Klasse namens "UnknownObject" hätte, und in deinem Hauptplugin diese Variable vorhanden wäre (public UnknownObject o = new UnknownObject();), dann wird dieses Objekt direkt initialisiert, sobald das Plugin geladen wird (und wirft entsprechend einen Fehler, da er "UnknownObject" ja noch nicht kennt und er nicht weiß, was im Konstruktor von UnknownObject überhaupt passieren soll).

    Was hingegen funktioniert: Die Variable erst in "onEnable()" initialisieren (also die Variable ist nur als public UnknownObject o; deklariert und in onEnable() wird o = new UnknownObject(); ausgeführt).


    ich wünsche mir einPrefab.setAnimatorResetTrigger(String path, String trigger), wie bei Animator.ResetTrigger

    Das können wir mit dem nächsten Update einbauen ;) Auch wenn du zwischenzeitlich eine andere Lösung gefunden hast, ist es trotzdem sinnvoll, möglichst viel von der Unity-API auch in der Plugin-API abzubilden :D

  • Denkbar wäre ggf. aber ein optionales Callback, in welchem die aktuelle Position übergeben wird, die man dann entsprechend ändern könnte... das würde aber natürlich auch zu viel Traffic führen... dazu müssten wir uns mal Gedanken machen :thinking:

    Ja, das ist ein nicht zu unterschätzendes Problem mit dem Trafic:thinking:
    Könnte die CallBack Serialisiewrt werden und an den Client Übertragen werden?
    Also Irgendwie dass der Clien nur das Runable bekommt, ohne Lambad (daten von Außen)^^


    Was hingegen funktioniert: Die Variable erst in "onEnable()" initialisieren (also die Variable ist nur als public UnknownObject o; deklariert und in onEnable() wird o = new UnknownObject(); ausgeführt).

    :wacko::saint: Ja das kommt mir bekannt vor||hätte ich auch selber drauf kommen können



    nächsten Update

    möglichst viel von der Unity-API auch in der Plugin-API abzubilden :D

    :wow::love:

  • Ja, das ist ein nicht zu unterschätzendes Problem mit dem Trafic :thinking:
    Könnte die CallBack Serialisiewrt werden und an den Client Übertragen werden?
    Also Irgendwie dass der Clien nur das Runable bekommt, ohne Lambad (daten von Außen) ^^

    Das ist warscheinlich Quatsch oder zu umständlich.

    Da karm mir ein Gedanke:
    Eventuell bekommen ja noch die NPC's eine Phat Steuerung, ich meine das wo Figuren Automatisch um Blokierte bereiche herumm gehern.
    Das wehre ja am Ende ein Polygon der den Weg enthält, wo auch die Höhen passend gemacht werden können.

    Das müsste doch Sparsam im Traffik sein, Server schickt einmal weg an die Clients und die Melden wenn sie da sind

    Kann die Meldung das sie Angekommen sind mit einem CallBack versehen werden, ggf. auch eine fals im weg etwas unvorhergesehenes Steht (Spieler) und er Abgebrochen wurde?
    Also für die NPC's würde ich mir das Wünschen, dann könnte man dort den Animator Setzen:D

  • Also ich habe mal etwas mit dem Prefab herum Gesspielt:D

    Das Project ist noch im Versuchs Sdadium, also ein wenig Kaotisch ^^


    VFX

    mit einem Unterordner [1.] vfx_Spawn und dem [2.] VFX im Prefab, kann ich wunderbar die Steuerung nutzen.

    Java
    lokalPrefabRauch.playVFX("vfx_Spawn");
    lokalPrefabRauch.stopVFX("vfx_Spawn");
    lokalPrefabRauch.reinitVFX("vfx_Spawn");


    Animator

    Der [2.] Animator läst sich ebenfalls wunderbar [3.] Steuern.

    Java
    lokalPrefab.setAnimatorParameter("Neu_Mimic_gehen", "walk", true);
    lokalPrefab.setAnimatorParameter("Neu_Mimic_gehen", "walkSpeed", 1.25f );


    Shader

    Selbst erstellte Shader sind ebenfalls gut zu Steuern.

    Zuerst war ich ein wenig Verwirrt da es kein Boolean Parameter gibt, aber als ich mich getraut habe den mit dem Integer (0/1) zu benutzen hat es ebenfalls geklappt.

    Java
    lokalPrefab.setMaterialParameter("Neu_Mimic_gehen/Cylinder.002", "_Albedo", new TextureAsset() );
    lokalPrefab.setMaterialParameter("Neu_Mimic_gehen/Cylinder.002", "_hasFresnel", 1);
    lokalPrefab.setMaterialParameter("Neu_Mimic_gehen/Cylinder.002", "_FresnelColor", new Vector4f() );
    lokalPrefab.setMaterialParameter("Neu_Mimic_gehen/Cylinder.002", "_FresnelPower", 2.25f);


    Animator 2

    Ich kann auch den Shader Animieren, nur dazu muss der Animator auf den Richtigen Unterordner angepasst sein (Unity interner)

    Java
    lokalPrefab.setAnimatorParameter("", "goOn", true);




    red51 Jetzt habe ich nur das Problem das ich wenn der "Animator 2"[2.] Aktiv ist, kann ich nicht mehr "Shader"[2.] nutzen, warscheinlich überschreit die Animation die werte. Ich Habe versucht ihn mit der API zu Aktivieren oder Deaktivieren, leider ohne erfolg.

    Java
    lokalPrefab.stopAnimatorPlayback("");
    ...oder..
    lokalPrefab.setComponentEnabled("", "_Animator", true); //auch schon mit "_animator"

    ^^wo ist hier mein Denkfehler oder ist es noch nicht Fertig Implementiert, wie benutze ich die Richtig?



    Was ich auch noch gerne wüste, was mache ich mit invokeComponentMethod, klingt Spannend, aber konnte da, noch nix mit bewirken.



    Was ich mir noch Dringend :saint: wünsche ist das auslesen des Transform und eine Liste der enthaltenen Unterordner^^ also jeden Tranform im Prefab mit Namen
    Ich möchte Quasie Spezielle Pivot Punkte Setzen, um z.B. bei einem Stuhl die Sitzfläche oder die Auflagefläche für die Hand an der Armlehne zu ermitteln, Modulbauweise Elemente einrasten Lassen.
    Die ich dann in der API auslesen kann und damit andere Bauteile genauer zu Platzieren kann.
    Oder gibt es für soetwas einen besseren Ansatz, als mit den Unterordnern? Eine Aksen/Tranform Liste im Stile einer MashMap/List?


    Ich versuche ja gerade einen NPC zu erstellen, dafür nutze ich gerade ein Timer um die Bewegungen und Richtungen zu Koordienieren.
    Dabei ist mir aufgefallen das ein Timer nicht das Optimale ist, besser wehre es wenn ich mit Events Arbeiten könnte (Angekommen,Kolliedirt mit, und weiteres), das würde die Performance verbessern.
    Allerdings bräuchte man schon eien "kontinuirlichen Event" um z.B. die entfernung zum Spieler zu ermitteln, der müsste aber nicht auf jedem Tick hängen, vieleicht nur bei Spieler Bewegung, Change World, Load/Spawn, MoveToFinish:)
    Wenn du schon ein wenig zu NPC's und API sagen könntest:love:wehre das Super.
    In Trello sieht es gerade nicht danach aus das es geplant ist:thinking:


    Was mich aber schon eine weile Verrückt macht ist, der Schatten :drunk:
    Wie hast du das gemacht das die vom Licht abgewante Seite nicht im Schwarzen Schatten Versinkt?

    Hier habe ich einfach mal ein Shader gebaut der die Basistexture Abdunkelt und als Emissiv raus gibt:thinking:das macht es erstmal
    Ist das der Weg den du auch genommen hast?



    Wenn du für die UI noch die Liste und Dropdown freigeben könntest wehre das Wunderbar<3
    Oder für die Nutzung von USS & UXML, noch einen kleinen Tip gibst, wie mann das geladen bekommt wenn beide StyleSheetAsset vorhanden sind:D

  • red51, noch ein kleiner Fehlerbericht:

    Code
    [ERROR] [23:36:39] Unknown packet response in callback: RisingWorld.Network.Packets.General.ShowCustomMessageDialogResponse
    UnityEngine.Debug:LogError(Object)
    RisingWorld.PluginAPI.Objects.<>c__DisplayClass489_0:<ShowColorPicker>b__0(Object)
    RisingWorld.Server.Network.Listeners.ServerGeneralListener:ShowCustomMessageDialogResponseReceived(IPacket, AbstractConnection)
    JIW.Network.Core.Common.Event.ReceiveServerPacketEvent:Execute(AbstractNetworkServer, NetworkEvent)
    JIW.Network.Core.Common.Event.NetworkEvent:Execute(AbstractNetworkServer, AbstractNetworkClient)
    JIW.Network.Core.Common.Channel:Run()
    System.Threading.ExecutionContext:Run(ExecutionContext, ContextCallback, Object)

    ich habe das geschafft, mit:

    Java
    playerLokal.showColorPicker("Farb Auswahl", 0, (col) -> {
    ColorRGBA colRGBA = new ColorRGBA(col);
    ...
    });


    Könnte eventuell bei dem ColorPicker noch die Intesity hinzugefügt werden, vieleicht mit einem weiteren Schalter HDR^^

  • Sorry ersmtal für meine späte Antwort! :saint:


    Zuerst war ich ein wenig Verwirrt da es kein Boolean Parameter gibt, aber als ich mich getraut habe den mit dem Integer (0/1) zu benutzen hat es ebenfalls geklappt.

    Unity verwendet intern keine bools für Material-Parameter (das wird einfach über floats abgebildet), aber wir könnten das der Einfachheit halber trotzdem zur API hinzufügen ^^


    red51 Jetzt habe ich nur das Problem das ich wenn der "Animator 2"[2.] Aktiv ist, kann ich nicht mehr "Shader"[2.] nutzen, warscheinlich überschreit die Animation die werte. Ich Habe versucht ihn mit der API zu Aktivieren oder Deaktivieren, leider ohne erfolg.

    Das ist merkwürdig :wat: Kannst du mir das AssetBundle (und den Namen des Prefabs) ggf. einmal zusenden? Dann kann ich versuchen es bei mir zu reproduzieren ;)


    Was ich auch noch gerne wüste, was mache ich mit invokeComponentMethod, klingt Spannend, aber konnte da, noch nix mit bewirken.

    Damit kann eine beliebige Methode einer Component aufgerufen werden. Die meisten wichtigen Methoden der wichtigsten Komponenten sind bereits exposed (zB die Animator- oder Material-Methoden), aber diese Funktion ist hilfreich für Dinge, die noch nicht nach außen getragen wurden. Beispiel: Wenn dein Prefab eine Rigidbody-Komponente hat, und du zB die WakeUp() Methode aufrufen möchtest, könnte der Code dazu so aussehen:

    Code
    prefab.invokeComponentMethod(null, "Rigidbody", "WakeUp");


    Oder die Translate() Methode der Transform-Komponente, bei der ein Vector3 als Parameter übergeben wird:

    Code
    prefab.invokeComponentMethod(null, "Transform", "Translate", new Vector3f(10f, 0f, 0f));


    Analog dazu gibt es noch die setComponentProperty() Methode, womit "Properties" statt Methoden/Funktionen aufgerufen werden können. Beispiel: Wenn du die Masse eines Rigidbody auf 100 setzen möchtest (in Unity ist "mass" ein Property), könntest du das zB so machen:

    Code
    prefab.setComponentProperty(null, "Rigidbody", "mass", 100f);


    Was ich mir noch Dringend :saint: wünsche ist das auslesen des Transform und eine Liste der enthaltenen Unterordner ^^ also jeden Tranform im Prefab mit Namen

    Schwierig... das Problem ist leider, dass dafür das Modell zusätzlich serverseitig geladen werden muss. Bei Prefabs aus AssetBundles ist das zwar nicht so das große Problem, aber zB FBX Dateien brauchen relativ lange zum laden... das würde leider ein sehr teurer Funktionsaufruf... :dizzy:


    Wir können mit dem nächsten Update aber eine neue "readLocalPosition()" bzw. "readWorldPosition()" einbauen, mit welcher von einem Prefab bzw. einem beliebigen Child die derzeitige lokale bzw. globale Position (und Rotation) ausgelesen werden kann. Der Aufruf ist dann an einen Spieler gebunden und arbeitet mit einem Callback (da die Position vom Client abgefragt wird - schließlich könnte sie theoretisch bei jedem Spieler anders sein, vor allem wenn eine Komponente zB animiert oder physikalisch ist). Ich weiß nicht, ob das in deinem Fall vll schon weiterhilft? :thinking:


    Dabei ist mir aufgefallen das ein Timer nicht das Optimale ist

    Warum? Für wiederholende Aufgaben ist ein Timer eigentlich die geeignete Lösung. Ansonsten kannst du sonst auch das UpdateEvent abgreifen, welches jeden Tick aufgerufen wird. Für komplexe Rechenaufgaben o.ä. wäre sonst auch ein klassischer Thread denkbar.


    Allerdings bräuchte man schon eien "kontinuirlichen Event" um z.B. die entfernung zum Spieler zu ermitteln, der müsste aber nicht auf jedem Tick hängen, vieleicht nur bei Spieler Bewegung, Change World, Load/Spawn, MoveToFinish :)

    Das Problem ist leider die Entkoppelung von Client und Server... da die API niemals clientseitig ausgeführt wird, sind Millisekunden-genaue Aufrufe leider nicht möglich (allein der Ping zw. Client und Server ist der begrenzende Faktor). In vielen Fällen aber ist ein Timer (mit einem Interval von 0) oder das o.g. UpdateEvent aber normalerweise ausreichend.


    Wenn du schon ein wenig zu NPC's und API sagen könntest :love: wehre das Super.

    Leider noch nicht :( Bisher ist da noch nicht viel in dem Bereich passiert, da wir momentan noch zu sehr mit anderen Features beschäftigt sind... sobald die Java Version endlich durch die neue Version ersetzt wurde haben wir hoffentlich mehr Luft dafür ;)


    Hier habe ich einfach mal ein Shader gebaut der die Basistexture Abdunkelt und als Emissiv raus gibt :thinking: das macht es erstmal
    Ist das der Weg den du auch genommen hast?

    Öhm... ist die Frage an mich gerichtet gewesen? :saint:


    Wenn du für die UI noch die Liste und Dropdown freigeben könntest wehre das Wunderbar <3

    Hehe, "freigeben" klingt ein wenig so, als müssten wir nur einen Haken setzen, damit die Dinge verfügbar werden :D Ein Dropdown Element ist in unserer UI leider generell nicht vorhanden bisher, stattdessen verwenden wir was anderes (siehe zB die Auswahlelemente für Dinge wie Auflösung etc. im Settings-Menü). Das wollen wir aber auch noch in der API abbilden ;)


    Es gibt zwar von UI Toolkit derartige Elemente, die haben wir aber nie verwendet (und auch deren Style nie angepasst), da diese vor nicht all zu langer Zeit leider nur im Editor verfügbar waren und nicht zur Runtime :/ Wir könnten das aber trotzdem in Zukunft integrieren und in der API exposen bei Bedarf.


    Eine List-View können wir allerdings leider nicht anbieten (da diese virtualisiert ist und das nicht über die API abgebildet werden kann), aber eine Scroll-View ist geplant (damit kann dasselbe erzielt werden) ^^


    Oder für die Nutzung von USS & UXML, noch einen kleinen Tip gibst, wie mann das geladen bekommt wenn beide StyleSheetAsset vorhanden sind :D

    UXMLs kannst du leider noch nicht laden, sondern nur USS Dateien (als StyleSheetAsset) ;) Die können einem UI Element dann via addStyleSheet() zugewiesen werden. Es können darin ja Klassen definiert werden, diese können dann via addToClassList() zugewiesen werden.


    red51, noch ein kleiner Fehlerbericht:

    Oh, danke für den Hinweis, das wird mit dem nächsten Update behoben :saint:


    Könnte eventuell bei dem ColorPicker noch die Intesity hinzugefügt werden, vieleicht mit einem weiteren Schalter HDR ^^

    Wie meinst du das mit der Intensity genau? :monocle:


    Mit HDR meinst du vmtl. eine Möglichkeit, RGB oder HSV Farbraum vorzugeben, oder?

  • Kein Stress, ich habe einfach etwas gesammelt:saint:

    aber wir könnten das der Einfachheit halber trotzdem zur API hinzufügen ^^

    Ich denke da Reicht eine kleine Info in der JavaDoc:thumbup:


    ob das in deinem Fall vll schon weiterhilft? :thinking:

    Bei Statischen Objeckten wehre es ja halb so wild, das Bräuchte der Server ja nur ein mal am Anfang. (das würde dafür Reichen)
    Bis zu den Animationen hatte ich noch nicht gedacht, aber ja, hier wehre es interresannt ein Objeckt an einen Bone zu Befestiegen (Sowas wie Waffe oder Hut). Das sollte dann aber schon, irgendwie mit dem Client Verbunden sein. Also das mann ein ChildObject an einen Bone Binden kann, das ChildObject könnte man Ein/Aus Blenden


    Warum?

    Ja, ich meinte mehr Event Management. Aber Dank Sandboxgamer habe ich den TriggerEven entdeckt. Damit kann ich mir ja sowas wie (OnStop,StartWalk, oder so) selber bauen.
    Ober später die NPC-Klasse ausbauen


    UpdateEvent aber normalerweise ausreichend

    Ja, das werde ich dann mit dem TriggerEvent zusammen machen. Es geht abern annähernd secunden genau ;) Timer und Zeit gesteuerter UpdateEvent schwanken um 5-20 Milisekunden, das ist für mich im Rahmen.


    da wir momentan noch zu sehr mit anderen Features beschäftigt sind

    Kein Problem<3ich will vieles ja nicht im nächsten Updat. Nur mal drüber Sprechen :D


    ist die Frage an mich gerichtet gewesen?

    ^^Ja, wie machst du das mit dem Schatten/der Schatten Seite?
    Deine Objecte sind niemals Schwarz solange Licht in der nähe ist ^^. Benutzt du den Standard Lit Shader?

    Aber wenn das zu den Geheimnissen gehört ist auch gut;)


    Hehe, "freigeben" klingt ein wenig so, als müssten wir nur einen Haken setzen

    Ja, das war ein wenig "Blauäugig" Formuliert :D
    Ja ich übersehe immer mal wieder den Unterschied zwischen der Unity-API und Unity

    Ein Scrool-View wüde voll ausreichen, ich freue mich auf das Update wenn es dann kommt. Kein Spress:!:


    Es können darin ja Klassen definiert werden, diese können dann via addToClassList() zugewiesen werden.

    Damit muss ich mich noch beschäftigen:Dund ein kleines Tutorial Finden


    Wie meinst du das mit der Intensity genau?

    Bei RGB und HSV ist der Wertebereich ja 0-100%.

    In Unity gibt es doch für Color den Default Mode und den HDR Mode, bei dem kann noch die Intensity eingestellt werden, wo die Farbe zu Leuchten begint.
    Ähnlich wie setMaterialParameter("", "Color", new Vector4f(1, 1, 5, 1));, da sehe ich gerade das ColorRGBA ja nur 0-100% kann und das bräuchte ein bereich von 0-100%+x%, :lol:

    Ich meinte den Multiplikator

    Da werde ich einfach selber ein Multiplikator dazu bauen:thumbup:


    Kann der ColorPicker in eine UI eingebaut werden?

  • Sorry für die späte Antwort, wollte mich schon früher melden :drunk: Ich habe mir aber mal das Problem mit den Animatoren genauer angeschaut: Wenn du über einen Animator eine Material-Eigenschaft änderst, dann fügt Unity unter der Haube einen sog. MaterialPropertyBlock hinzu (was die normalen Material-Eigenschaften überschreibt). D.h. reguläre Änderungen über setMaterialParameter() haben keinen Effekt mehr (bis der Animator gelöscht wird).


    Leider bleibt der MaterialPropertyBlock auch nach dem Deaktivieren des Animators aktiv. Wir werden mit dem nächsten Update aber eine neue Funktion clearMaterialPropertyBlock() einbauen, mit welcher du den MaterialPropertyBlock löschen kannst ;) Das funktioniert aber nur, wenn der Animator deaktiviert wird (sonst fügt Unity sofort wieder einen neuen hinzu). Das könnte in deinem Fall dann zB so aussehen:

    Java
    //Disable component on main prefab element
    prefab.setComponentEnabled(null, "Animator", false);
    //Remove material property blocks from child element (first mat)
    prefab.clearMaterialPropertyBlock("Neu_Mimic_gehen/Cylinder.002", 0);


    Bis dahin wäre aktuell der einzige Workaround, den Animator zu löschen (danach kannst du ihn aber logischerweise nicht mehr verwenden). Das ist also nur sinnvoll, wenn du den Animator nicht mehr brauchst... Löschen kannst du ihn via Prefab.removeComponent() , also zB prefab.removeComponent(null, "Animator");


    Bis zu den Animationen hatte ich noch nicht gedacht, aber ja, hier wehre es interresannt ein Objeckt an einen Bone zu Befestiegen (Sowas wie Waffe oder Hut). Das sollte dann aber schon, irgendwie mit dem Client Verbunden sein. Also das mann ein ChildObject an einen Bone Binden kann, das ChildObject könnte man Ein/Aus Blenden

    Meinst du ein Hinzufügen an Bones bzw. Childs eines Prefabs, oder an beliebige Elemente im Spiel (zB Hände des Spielers oder eines NPCs)? Grundsätzlich wäre das möglich (und auch praktisch), das Problem ist nur, dass ein Löschen des Parents (zB wenn der NPC stirbt) automatisch das Prefab löschen würde... wir müssen mal schauen, dass wir das entsprechend abfangen :thinking: Wir machen uns dazu mal Gedanken ^^


    ^^ Ja, wie machst du das mit dem Schatten/der Schatten Seite?
    Deine Objecte sind niemals Schwarz solange Licht in der nähe ist ^^. Benutzt du den Standard Lit Shader?

    Aber wenn das zu den Geheimnissen gehört ist auch gut ;)

    Wir verwenden zwar einen eigenen Shader, allerdings sollte das keine große Rolle spielen :wat: Ich konnte das Problem tatsächlich mit deinen Prefabs reproduzieren... es scheint so, dass die Prefabs kein indirektes Licht erhalten. Offenbar schmeißt Unity beim Builden des Asset-Bundles die notwendigen Shader-Varianten raus ||


    Ich muss mal schauen, wie man das am besten verhindern kann! Ich melde mich nochmal, wenn ich weitere Infos habe.


    In Unity gibt es doch für Color den Default Mode und den HDR Mode, bei dem kann noch die Intensity eingestellt werden, wo die Farbe zu Leuchten begint.
    Ähnlich wie setMaterialParameter("", "Color", new Vector4f(1, 1, 5, 1));, da sehe ich gerade das ColorRGBA ja nur 0-100% kann und das bräuchte ein bereich von 0-100%+x%, :lol:

    Ich meinte den Multiplikator

    Achso :D Also grundsätzlich kann das ColorRGBA beliebige Farben repräsentieren (da die einzelnen Farbwerte als float gespeichert werden), d.h. auch Bereiche außerhalb von 0-1 sind möglich. Das Problem ist nur, dass so eine Farbe nicht mehr als int repräsentiert werden kann. Die API verwendet leider an vielen Stellen nur ints für die Farben.


    Da aber das Spiel bisher aber beim Colorpicker keine Intensität benötigte, fehlt diese Funktionalität... ich schaue mal, was wir da am besten machen könnten :thinking:


    Kann der ColorPicker in eine UI eingebaut werden?

    Leider ist das momentan nicht vorgesehen, da der ColorPicker bislang als eigenständige Message Box konzipiert ist...


    Ginge das auch für "GameObject" und "UIElement" :D

    Ja, das können wir grundsätzlich einbauen ;)

  • Da aber das Spiel bisher aber beim Colorpicker keine Intensität benötigte

    Ja,das ist halb so Willt, ich bräuchte das gerade um ein Bisschen herum zu Spielen.
    Ich glaube nicht das es im fertigen Plugin/Spiel motwendig sein wird eine Farb Leuchtkraft anzugeben, ansonsten kann ich das noch mit einem Extra Regler machen:thumbup:



    Ich muss mal schauen, wie man das am besten verhindern kann! Ich melde mich nochmal, wenn ich weitere Infos habe.

    Kein Stress, aber gut das es ein greifbaren Grund gibt;)



    Wir machen uns dazu mal Gedanken

    Da bräuchte doch "nur" der Bone und die PrefabID hinterlegt sein, das Bräuchte es doch für die Funktion (Wer hängt wo drann) und die könnte doch auch für's Aufräumen genutzt werden:D



    Leider bleibt der MaterialPropertyBlock auch nach dem Deaktivieren des Animators aktiv.

    Großen Danke für die Tiefgehende Recherche, kein Stress bislang hat das keine höhe Priorität
    Hatte mur mal herumgesoielt was so geht, aber wehre schön wenn es später Möglich wird<3

  • Hi red51,
    ich Versuche mich gerade intensiv an dem OBJ&FBX Modellen8)


    Also die Dateipfade sind Koreckt, aber die Normal wird nicht benutz, jedenfalls ist keine wölbung drin zu erkennen:/
    Bei den Prefab's klappen die Normal einstellungen, Siehe eigenes Decal


    Kannst da das mal Bitte Prüfen, ob ich was Vergessen habe für die Normal:saint:

  • :party:Ich habe was Cooles gefunden:D

    Zum Platzieren der Objecte Setze ich sie auf GameObject.setLayer(Layer.getBitmask(Layer.IGNORE_RAYCAST));, das Klappt auch Super die Objecte Wandern nicht mehr in meine Richtung.

    Nur wenn ich ein FBX oder OJB Setze

    Und dann da Rein gehe

    ist das Object Voll mit Wasser:lol:


    :saint:Wenn ich den Layer wieder auf z.B.Layer.OBJECT Setze ist es wieder Trocken:crazy:

    Das verhält sich im Meer wie eine Methan Blase:wacko:

  • Also die Dateipfade sind Koreckt, aber die Normal wird nicht benutz, jedenfalls ist keine wölbung drin zu erkennen :/
    Bei den Prefab's klappen die Normal einstellungen, Siehe eigenes Decal

    Das scheint ein Problem seitens des Spiels zu sein :wat: Genau genommen ist das Problem, dass das MaterialAsset unter der Haube den Standard HDRP Lit Shader verwendet. Die Normal-Map wird zwar zugewiesen, aber bei diesem Shader sind die Normal-Maps zusätzlich an zwei Keywords gekoppelt (also separate Shader-Varianten). Aus technischer Sicht ist sowas zwar einfach nur unnötig (nahezu 0 Performancegewinn und unnötig lange Build-Zeiten sowie höherer VRAM Verbrauch), wenn aber diese Keywords nicht explizit gesetzt werden, dann hat die Normal-Map in dem Fall keine Wirkung...


    Wenn im Editor mit dem HDRP Shader gearbeitet wird, dann werden diese Keywords automatisch gesetzt, sobald du eine Normal-Map zuweist. Das gilt aber leider nicht für programmatisch erstellte Materials, daher muss das dort manuell erfolgen.


    Auf jeden Fall danke für den Hinweis, das werden wir mit dem nächsten Update beheben :saint:


    Zum Platzieren der Objecte Setze ich sie auf GameObject.setLayer(Layer.getBitmask(Layer.IGNORE_RAYCAST));, das Klappt auch Super die Objecte Wandern nicht mehr in meine Richtung.

    Oh, die Art zum Zuweisen der Layer ist leider nicht ganz korrekt: Hier wird keine Bitmaske benötigt, stattdessen musst du die Layer direkt zuweisen, also gameObject.setLayer(Layer.IGNORE_RAYCAST);. Eine Bitmaske ist nur in bestimmten Fällen nötig, zB beim Raycast, denn da ist ja unter Umständen gewollt, dass ein Raycast mehrere Layer berücksichtigen soll (und diese mehreren Layer werden dann über die Bitmaske abgebildet)^^


    Die Layer.IGNORE_RAYCAST hat den Int-Wert 2, bei der Bitmaske wird im Grunde eine 1 in Binärdarstellung einfach nur um so viele Stellen nach links verschoben (also hier 1 << 2), was in dem Fall 4 ergibt (1 << 2 == 0b100 == 4). Und 4 ist der Int-Wert für Layer.WATER (d.h. in deinem Fall hast du effektiv Layer.WATER zugewiesen), daher denkt das Spiel, dass es sich dabei um Wasser handeln würde (und wenn das Spiel eine Wasseroberfläche oberhalb des Spieler entdeckt, denkt es, du wärest unter Wasser) :D

  • gameObject.setLayer(Layer.IGNORE_RAYCAST);

    :thumbup:Ja, das war die Magie^^

    Wie ist das denn eigendlich geplant, mit dem Layer.TRIGGER?
    Weil Aktuell braucht ja das Object was gerayCastet wird auf jeden Fall einen Collider, und lässt damit auch den Spieler nicht durch
    Kann der Trigger ohne Collider gemacht werden aber dennoch für den RayCast möglich sein?
    Oder der Player Colliediert nicht mit dem Trigger?

    :wacko:Wenn du sagst das es schon so geregelt wird, dann muss ich nochmal Teste nur diesmal ohne Layer.getBitmask, warscheinlich hat das mein Test verfälscht:lol:

  • Grundsätzlich sind die Layer eine direkte Abbildung der Layer, die es im Spiel gibt. Mit ein paar Collidern kollidiert der Spieler generell nicht (zB TRIGGER, MISC, ITEM, DEBRIS, OBJECTINTERACTION usw).


    Bei einem Raycast kannst du grundsätzlich gegen jede Layer prüfen. Du kannst also durchaus zB die Layer TRIGGER benutzen und bei einem Raycast dann gegen diese Layer prüfen. Wichtig ist aber wie gesagt, dass du bei einem Raycast immer eine Bitmaske angibst (also in dem Fall Layer.getBitmask(Layer.TRIGGER);) ;)


    Kann der Trigger ohne Collider gemacht werden aber dennoch für den RayCast möglich sein?

    Leider unterstützt Unity selber erstmal nur einen Raycast innerhalb der Physik-Engine, welche wiederum zwingend Collider benötigt... die Java Version konnte zwar auch einen Mesh-genauen Raycast durchführen ohne dass es einen Collider gab, aber dabei würde eine Menge Garbage auf nativer Seite entstehen - und damit kann Unity aufgrund seines prähistorischen Garbage-Collectors leider nur sehr schlecht umgehen, anders als Java. Wir haben sowas aus dem Grund nie in der neuen Version umgesetzt und setzen daher selber auch nur auf Collider... :|


    Was aber mit dem nächsten Update hinzukommen wird: Support für "Ghost Collider" (in Unity über den "Trigger" Flag definiert - nicht zu verwechseln mit Layer.TRIGGER, die hat damit nix zutun). Damit kannst du einen Collider hinzufügen und mit diesem Flag sagen, dass der Spieler trotzdem immer durchlaufen können soll (egal welche Layer gesetzt ist). Der Collider hat dann nur noch bei Raycasts Relevanz (sowie Hit & Interaktion) ^^

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!