Jump to content
Unity Insider Forum

Leaderboard

Popular Content

Showing content with the highest reputation since 01/24/2021 in all areas

  1. Aktuell hatte ich einige Tage Zeit, um ein neues Projekt im Comic LowPoly Stil zu beginnen. Noch gibt es nicht viel zu sehen, aber 2 Flitzer sind modelliert: Mal sehen, wie weit ich diesmal kommen werde. ūüôā
    4 points
  2. Hallo, heute möchte ich euch das erste Video von meinem Orfaya-RPG Projekt vorstellen. Zu sehen ist ein kleiner Rundgang am Strand und ein Dialog mit Lomar, einem Fischer aus dem Dorf. Vorab zum Ton. Mein schönes Studio-Micro ist leider defekt. Daher musste meine Webcam ran. Ich bitte den Ton zu entschuldigen. Was noch fehlt sind die Hintergrundgeräusche und es ist noch etwas leblos am Strand. Ich werde noch ein paar Krabben, Möven etc. einbringen.
    3 points
  3. Heute gibts mal wieder neue Bilder! Es hat sich die letzten Monate viel getahn, vor allem in der Landschaft hat es gr√∂√üere √Ąnderungen gegeben, die ich euch gern pr√§sentieren m√∂chte.
    3 points
  4. Youtube Video Pr√§sentation unserer M√∂glichkeiten, Augmented und Virtual Reality Anwendungen im Zusammenspiel zu erleben. Unser Hauptaugenmerk lag auf der hochwertigen Visualisierung eines interaktiven Modells f√ľr AR und VR und der Vernetzung der Anwendung. Sowohl AR- als auch VR-Anwendungen funktionieren f√ľr sich alleine, k√∂nnen aber auch miteinander vernetzt werden. Neue Produkte oder Ideen k√∂nnen so live einem breiten Publikum pr√§sentiert werden. Alle Kunden erleben die gleiche Interaktion mit unterschiedlichen Technologien (VR-Brille, Handy, Tablet, PC...). Diese Demo ist als Beispiel f√ľr den Einsatz bei virtuellen Messen, Tagungen oder anderen innovativen Herausforderungen angedacht. Weitergehende Information √ľber uns findet Ihr auf www.virtence.com √úber Feedback jeder Art freuen wir uns. Virtence
    3 points
  5. Benutze einfach daf√ľr DateTime. Das tut schon alles was du brauchst.
    3 points
  6. Hi, habe die letzten vier Tage damit verbracht mich tiefer in Blender einzuarbeiten. Habe das Raumschiff Comet aus der Serie Captain Future nachmodelliert. Nicht ganz perfekt, aber f√ľr einen Anf√§nger nicht schlecht -denke ich-
    3 points
  7. Ja und nein. C# ist eine typstarke Sprache. Das hei√üt, dass alle Variablen, Felder, Parameter und Funktionen (also Methoden, die etwas zur√ľckgeben) einen Typ deklariert haben m√ľssen. ...aber... C# ist auch eine objektorientierte Sprache. Deine Komponente erbt von MonoBehaviour, erbt von UnityEngine.Object, erbt (iirc) von System.Object. Und am Ende dieser Kette kommt immer System.Object. Sogar primitive Typen wie int und float erben davon. Was man machen kann ist, dass man einen gemeinsamen Supertyp benutzt: class Weapon : Item class Potion : Item class Armor : Item Dann gibt deine Methode ein Objekt vom Typ "Item" zur√ľck. Und weil Vererbung "ist-ein" bedeutet (ein "Weapon" ist-ein "Item"), kann das Item eben eine Waffe oder ein R√ľstungsteil sein. Wenn aber jetzt der Code, der den R√ľckgabewert in die Hand kriegt, eine Referenz auf eine Waffe erwartet, gibt's nen Compilerfehler - denn es k√∂nnte ja ein Trank sein, der da zur√ľck kommt. C# ist aber auch eine Sprache, die Generics versteht. Man kann einen Typ (oder mehrere) in einer Methodensignatur definieren und diesen dann im Rest der Signatur und im Rumpf benutzen: public T FindAThing<T>() Der generische Parameter "T" steht f√ľr einen Typ, der hier nicht weiter definiert ist, aber die Methode soll bitte ein Objekt dieses Typs zur√ľckgeben. Der Typ wird dann woanders definiert, z.B. beim Aufruf der Methode. Kennst du vielleicht von GetComponent. Light light = GetComponent<Light>(); // Geht Collider collider = GetComponent<Light>(); // Aua Die beiden Zeilen rufen dieselbe Methode auf, aber die untere Zeile wird nicht einmal kompiliert, weil der erwartete Typ (Collider) und der R√ľckgabetyp (Light) nicht passen. Die Methode gibt also unterschiedliche Dinge zur√ľck, je nach generischem Parameter. Du kannst das auch weiter spezifizieren: public T GetItem<T>() where T : Item Hier beschr√§nkst du T auf alle Typen, die von "Item" erben (und Item selbst). GetComponent hat z.B. das hier: public T GetComponent<T>() where T : Component Sodass GetComponent meckert, wenn du GetComponent<GameObject>() schreibst, weil GameObject keine Component ist. Vielleicht auch interessant ist Instantiate. Instantiate gibt ja immer etwas von dem Typen zur√ľck, den man reinsteckt: public MyComponent prefab; MyComponent instance = Instantiate(prefab); // oh yes GameObject goInstance = Instantiate(prefab); // oh no Das machen die so: public T Instantiate<T>(T original) where T : UnityEngine.Object Man kann einen generischen Typen also auch als Parameter benutzen, und dieser ist dann der gleiche Typ wie beim R√ľckgabewert. Hier also: Was reinkommt, kommt auch raus... zumindest Typ-weise. Wenn C# dann den Typen aus dem Parameterwert herleiten kann, braucht man den Parameter beim Aufruf auch nicht mehr explizit in die spitzen Klammern schreiben. Aber... das f√ľhrt schon etwas weit. In deinem Fall ginge also public T GetItem<T>() where T : Item Aber was macht man damit jetzt im Rumpf der Methode? Zuerst einmal kannst du T als Variablentyp benutzen: T thing = GetATFromSomewhere(); Dann kannst du den generischen Parameter in ein System.Type-Objekt umwandeln: System.Type type = typeof(T); Und jetzt wird's leider knifflig und sogar ein bisschen h√§sslich. Man kann n√§mlich nicht einfach schreiben: return (T)myWeapon; Das w√§re unsicher. Man kann das aber enforcen: return (T)System.Convert.ChangeType(myWeapon, typeof(T)); Da muss man dann nur echt aufpassen, dass T auch wirklich "Weapon" ist. if (typeof(T) == typeof(Weapon)) { return (T)System.Convert.ChangeType(weapon, typeof(T)); } Switch-Statement wird da schwieriger, aber man kann da evtl. auf Strings ausweichen. Hier ist sowieso alles unsicher, da machen Strings den Kohl auch nicht mehr... mager. Und man kann mit nameof ein bisschen den Schaden mitigieren. switch (typeof(T).Name) { case nameof(Weapon): return (T)System.Convert.ChangeType(weapon, typeof(T)); }
    3 points
  8. Hallo Leute, ich war lange wieder nicht aktiv weil viel um die Ohren. Der Jahreswechsel ist immer eine gute Zeit um kreativ zu werden. Vielleicht staut sich auch einfach etwas in mir weil meine t√§gliche Arbeit sehr Fakten basiert ist und sehr viel Analytik dazu geh√∂rt. Also wenig Raum um Kreativ zu sein. Sind halt Zahlen und Fakten. Also habe ich mich die letzten Wochen wieder damit besch√§ftigt meine zeichnerischen F√§higkeiten auszubauen. Das Ergebnis meiner M√ľhe m√∂chte ich hier Euch zeigen. Das erste Bild zeigt einfach einen Mann oder Cyborg (keine Ahnung) mit einer Waffe Das zweite Bild ist Phantom ein Held aus meiner Kindheit. Habe viele Comic √ľber die Abenteuer von Phontom gelesen. Das dritte Bild ist ein weiterer Comicheld aus meiner Kindheit, aber der ist ja heute bekannter als Phantom. Hoffe es gef√§llt
    2 points
  9. Hallo Du könntest einen LineRenderer nutzen. https://docs.unity3d.com/Manual/class-LineRenderer.html Christoph
    2 points
  10. Moin! 1. Die √ľblichere Schreibweise ist die Lambda-Schreibweise. Die gibt's in mehreren Sprachen und wird, wenn man sie erstmal kennt, meistens als angenehmer empfunden als da "delegate" hinzuschreiben. Ein Lambda-Ausdruck (genau wie mit "delegate") ist einfach eine Schreibweise f√ľr eine Methode ohne Namen. Man kann also als Beispiele Methoden nehmen und dann die entsprechenden Lambda-Ausdr√ľcke zeigen: a) private void Foo() { Debug.Log(5); } als Lambda-Ausdruck w√§re () => Debug.Log(5) b) private void Foo() { Debug.Log(5); Debug.Log(10); } als Lambda-Ausdruck w√§re () => { Debug.Log(5); Debug.Log(10); } Hier braucht man geschweifte Klammern, weil mehr als eine Anweisung drinsteht. c) Jetzt mal mit Parametern: private void Foo(int number) { Debug.Log(number); } w√§re number => Debug.Log(number) und private void Foo(int number, string text) { Debug.Log(number + text); } w√§re (number, text) => Debug.Log(number + text) Man bemerke hier, dass keine Parametertypen angegeben werden - da steht also nix davon, dass "text" ein string ist. Das liegt daran, dass Lambda-Ausdr√ľcke zu Methodenreferenzen evaluieren. Diese werden als normale Werte behandelt - man kann sie also in eine Variable speichern oder eben als Parameter √ľbergeben. Und in diesen F√§llen ist vom Typ der Variable bzw. des Parameters her schon vorgegeben, dass da eine Referenz auf eine Methode kommen muss, die ein int- und einen string-Parameter hat. Action<int, string> foo = (number, text) => Debug.Log(number + text); // und jetzt kann man die Methode aufrufen foo(5, " St√ľck"); Mit Lambda-Ausdr√ľcken kann man einem Objekt mehr als nur simple Werte in die Hand dr√ľcken, sondern ganze Verhaltensweisen. Deshalb kannst du die Dinger benutzen, um Buttons zu sagen, was sie tun sollen. btn.onClick.AddListener(() => GetComponent<MenuManager>().ButtonAction(i)); Soviel erstmal dazu. 2. Jetzt musst du (leider) das Konzept von Closures kennenlernen. Eine Closure ist wie ein Objekt, also ein Ding, das bestimmte Werte hat. Und jede anonyme Methode (also die, die du mit einem Lambda-Ausdruck erzeugst), hat so eine. Sie enth√§lt die f√ľr die Ausf√ľhrung der Methode relevanten Variablen aus der Umgebung, in der der Lambda-Ausdruck steht. var number = 5; Action foo = () => Debug.Log(number); foo(); Hier wird eine int-Variable mit dem Wert 5 definiert, eine Methode die den Wert der Variable ausgibt, und dann wird diese Methode aufgerufen. Es sollte also recht klar sein, dass die Zahl 5 ausgegeben wird. Die Variable "number" ist Teil der Closure der Methode, die von der Variable "foo" referenziert wird. Jetzt kommt der Knackpunkt: Closures machen pass-by-reference. Das hei√üt, dass hier nicht die 5 in der Closure gespeichert wird, sondern eine Referenz auf die Variable "number". Wenn du folgendes tust: var number = 5; Action foo = () => Debug.Log(number); number = 10; foo(); dann wird tats√§chlich 10 ausgegeben und nicht 5, weil beim Aufruf der Methode der aktuelle Wert der Variable angeschaut wird. Wenn du also eine Schleife hast und in dieser Schleife Methoden erzeugst, die irgendetwas mit der Z√§hlvariable i tun, dann wird am Ende jede dieser anonymen Methoden den aktuellen Wert von i nehmen - und das wird nun einmal der Wert am Ende des Schleifendurchlaufs sein, also in deinem Fall 1 bei einem Button bzw. 6 bei sechs Buttons. Die L√∂sung des Problems ist jetzt ein bisschen stumpf: Du machst in der Schleife eine neue Variable und kopierst da den Wert rein; dann benutzt du diese Variable in deinem Lambda-Ausdruck statt i: for(int i = 0; i < list.count; i++) { var btn = list[i]; var index = i; btn.onClick.AddListener(() => GetComponent<MenuManager>().ButtonAction(index)); } Dann wird die Variable "index" angeschaut, wenn man auf einen Button klickt - und der Wert dieser Variable √§ndert sich nicht mehr, weil sie am Ende des jeweiligen Durchlaufs (eigentlich) out of scope geht. √úbrigens kannst du es dir (so als Schmakerl) sparen, jedes Mal GetComponent aufzurufen, indem du das vorher einmal machst: var menuManager = GetComponent<MenuManager>(); for(int i = 0; i < list.count; i++) { var btn = list[i]; var index = i; btn.onClick.AddListener(() => menuManager.ButtonAction(index)); }
    2 points
  11. Hallo Das m√ľsste passen https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/operator-overloading Christoph
    2 points
  12. Entweder du nimmst einen Shader, der Beidseitig funktioniert, oder aber du erzeugst dir ein Kugel in einem 3d Programm, wie z.B. Blender, und drehst da einfach die Normalen der Flächen um.
    2 points
  13. Soda ist w√§hrend des aktuellen Unity Asset Store Sales √ľbrigens um stolze 50% reduziert! https://assetstore.unity.com/packages/tools/integration/soda-scriptableobject-dependency-architecture-137653
    2 points
  14. Mit dem Profiler wusste ich bis vor 3 Stunden noch nicht wirklich umzugehen. Ich konnte aber durch Zufall im Profiler das Problem oder Probleme lokalisieren und verstehe jetzt auch wo ich beim n√§chsten Mal suchen muss. Zum Gl√ľck hat sich ein weiterer Zufall dazu gesellt und ich konnte eine L√∂sung finden. Durch Spine 2D wurde ein Mesch-Generator angezeigt mit um die 40% Auslastung und im Deep Mode konnte ich das ganze auf Spine's Clipping Funktion zur√ľck f√ľhren. Die L√∂sung war in diesem Fall das Clipping zu vermeiden, daf√ľr gen√ľgt es den Hacken in der Skeleton Animation bei "Use Clipping" zu entfernen(F√ľr Alle die das selbe Problem haben)(Clipping scheint ein Feature zu sein, welches ich in meinem Fall nicht ben√∂tige). MfG DI3FL4MM3
    2 points
  15. Hallo Ich will euch heute mal mein derzeitiges Projekt zeigen. Es hei√üt ‚ÄěKonsequenz‚Äú und wie der Titel schon sagt, spielen Konsequenzen eine bedeutende Rolle. Einmal spielerisch, also welche Entscheidungen ich als Spieler treffe und auch die Geschichte dreht sich um die Folgen des eigenen Handels. Es gibt keinerlei K√§mpfe, daf√ľr viel zu lesen und zu reden. Mein gro√ües Vorbild ist dabei ‚ÄěDisco Elysium‚Äú. Nat√ľrlich unerreichbar, aber als Richtung in die das Ganze zielt. Ich habe schon viele Zeilen Dialoge geschrieben und feile die ganze Zeit an den Texten. Hier ein paar Impressionen: Die Unterwelt: Das Inventar des Spielers mit dem detaillierten Blick auf ein Item: Das Questfenster: Und hier ein paar Dialogzeilen: Und hier mit einem ‚ÄěAngler‚Äú: Es wird drei Welten geben. Die erste ist nun fertig und ich muss zugeben, dass ich den Aufwand total untersch√§tzt habe. Ich habe bereits sehr viel Zeit investiert und es ist noch kein Ende in Sicht. Allein das Finden von Bugs ist derma√üen m√ľhselig‚Ķ Da es mein erstes richtiges Spiel wird, musste ich auch viel Lehrgeld zahlen. Einige Module habe ich komplett neu entwickelt, bei einigen habe ich auf bew√§hrte L√∂sungen aus dem store gegriffen. Ich habe mir irgendwann die Frage gestellt, was ich eigentlich will: Spiele programmieren oder bsp. Lokalisierung. Ich habe mich dann manchmal f√ľr das Spiel entschieden! Es gibt noch viel zu tun: - Licht (hatte ich schon, aber zur Zeit aus, weil es noch zu h√§sslich war) - Sound - Ganz viel Finetuning (QoL ‚Äď Sachen) Jetzt freue ich mich auf eure ehrliche R√ľckmeldung!! Christoph
    2 points
  16. Hallo im Inspector lasse ich mir ein ObjectField anzeigen. So sieht das in OnInspectorGUI(). SerializedProperty textComponentProperty = serializedObject.FindProperty("m_textComponent"); EditorGUILayout.ObjectField(textComponentProperty); if (GUI.changed) { Debug.Log(textComponentProperty.objectReferenceValue); serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(target); } Dort kann ich ein text component reinwerfen. Wenn ich nun ein Text component drag and drop mache, wird beim Debug.Log auch kein null angezeigt. Heißt, dass es funktioniert hat mit drag and drop, doch danach ist es sofort wieder null. Ich weiß gar nicht mehr was ich machen soll. Im selben component ist string dabei und das lässt sich speichern. Benutze 2020.2.3f1 Hab es doch heraus gefunden: Ich hab zwei Types die Text heißen und hat nach falschen Text gesucht. Unity hat mir aber keine Fehlermeldung gezeigt, dass die Types nicht passen, sondern machte daraus direkt null. Zweites Type ist ein Child von UI.Text.
    2 points
  17. Then why did you ask about it just 2 days ago? This is the dumbest thread I've seen in here for quite some time...
    2 points
  18. √úbrigens kleine √§nderung bei mir, falls das hier jemals jemad liest : Ich habe mit einem Studium an der WBH im bereich Game Development begonnen. Bin jetzt seid ca 3 Monaten dabei. Also so ziemlich genau zwei Jahre nachdem ich mich hier im Forum vorgestellt habe. Mensch wie die Zeit vergeht... ūüôÉ
    2 points
  19. Hallo, ich habe meine Inselkarte bez√ľglich der Arbeitstitel etwas √ľberarbeitet. Ich hatte ja zwei √§hnliche Regionen vorgesehen. Es sollte den Fantasy-Wald und den Magie-Wald geben. Ich habe es jetzt beim Fantasy-Wald belassen und eine zus√§tzliche Region, die Bergwelt, dazu genommen. Das Sieht jetzt so aus: Desweitere habe ich mich an den Arbeitstitel ‚ÄěDas Dorf‚Äú gemacht und diesen Bereich etwas detaillierter ausgearbeitet. Geschichte/Beschreibung: Das Dorf stellt die grunds√§tzliche Versorgung von Orfaya sicher. Die Bewohner des Dorfes gehen dem Fischfang nach und liefern den gefangenen Fisch an die Ostk√ľste in den Fantasy-Wald. Der andere Teil der Bewohner arbeitet in den Minen. Die dort abgebauten Rohstoffe (Gold, Mineralien etc.) gehen ebenfalls in die Stadt an die Ostk√ľste. Vor ein paar Jahren gab es merkw√ľrdige Vorf√§lle auf Orfaya. Der einst so sichere Transportweg verwandelte sich nach und nach zu einem gef√§hrlichen Unterfangen. So richtete sich pl√∂tzlich die heimische Tier- und Pflanzenwelt gegen die eigene Bev√∂lkerung. Von Zeit zu Zeit √∂ffneten sich auch Portale aus denen monstr√∂se Gestalten erschienen und den Bewohnern nach dem Leben trachteten. Somit verharren die Bewohner des vorgelagerten Dorfes an diesem Ort. Niemand traut sich mehr an die Ostk√ľste zu gehen. Legende: = gesunkenes Schiff = Strand = Druide = Portal = H√§ndler = Zauberbrunnen = Teich = H√§ndler = Hochplateau = Wasserfall = √úbergang Hochebene = Mine = Mine = Mine = Erfinder = Mine
    2 points
  20. W√ľnsche euch allen ein sch√∂nes Wochenende!
    2 points
  21. Moin, hier mal ein neues Video von mir. Ich stelle hier die Funktionsweise verschiedener Reflexionstechniken anhand der Unity-Engine, in Verbindung mit gerenderten Szenen vor und zeige einen direkten grafischen Vergleich der einzelnen Techniken. Verglichen & erkl√§rt wird das Ray-Traced Reflection, Screen-Space Reflection, Planar Reflection und die klassischen Cubemaps. In diesem Video habe ich versucht, soviele Details wie m√∂glich einflie√üen zu lassen, ohne Zuschauer, die nicht mit der Spieleentwicklung vertraut sind "abzuschrecken". Jedoch denk ich, dass die Informationen meiner Recherche, die auch auf der Analyse des Sourcecodes einiger Renderer/Renderpipelines basiert, in dieser Form auch f√ľr den ein und anderen Entwickler interessant ist. Ich w√ľnsche mal viel Spa√ü mit dem aufwendigsten Video, das ich bisher gemacht habe:
    2 points
  22. Vielen Dank! das ganze Video war auf jeden Fall extrem Aufw√§ndig und ich musste f√ľr solche Effekte einige Tricks nutzen. Es handelt sich bei den Animationen aus einer Mischung von Unity 3D und Cinema 4D. F√ľr den √úbergang von 3:11 bis 3:15 wurden beispielsweise 8 verschiedene Renderp√§sse / Rendervorg√§nge ben√∂tigt: - Zwei dieser P√§sse bestehen aus ein in Unity gerendertes statisches Bild, welches in Cinema 4D auf Geometrie projiziert wurde - Zwei weitere f√ľr eine beleuchtete Geometrie - Zwei Wireframe-Versionen - Und zuletzt zwei Masken, die in After Effects dabei helfen, alles zu dem gewollten Effekt zusammen zu mischen. Hier mal ein Beispiel mit dem Frame 139 dieser Animation: Die anschlie√üende Welle war dabei relativ einfach, hier wurde die Szene ein weiteres Mal gerendert. Das rote Netz war hier w√§hrend der gesamten Animation sichtbar, so konnte ich w√§hrend der Videobearbeitung entscheiden, wann ich es ein oder ausblende. Die verformende Animation wurde ebenfalls in Cinema 4D erstellt. Insgesamt wurde diese Szene mit allen Effekten 13-mal mit verschiedenen Einstellungen gerendert. So √§hnlich hat es sich w√§hrend des ganzen Videos durchgezogen.
    2 points
  23. Ist gut, wenn man von solchen Dingen eine vern√ľnftig gro√üe Sammlung hat
    2 points
  24. Hab es gel√∂st bekommen. Das die L√∂sung ist, dass die Position als Parameter √ľbergeben werden musste. Hier meine l√∂sung: using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; public class WallPlacing : MonoBehaviourPunCallbacks { public GameObject wallPrefab; bool isInstantiated = false; PhotonView view; void Start() { //get the photon view component view = GetComponent<PhotonView>(); } // Update is called once per frame void Update() { if (view.IsMine) { if (Input.GetKeyDown(KeyCode.LeftControl)) { view.RPC(nameof(PlaceWall), RpcTarget.All, Camera.main.ScreenToWorldPoint(Input.mousePosition)); //view.RPC(nameof(RotateWall), RpcTarget.All ); } } } //place a wall at cursos pos [PunRPC] void PlaceWall(Vector3 position) { GameObject wall = PhotonNetwork.InstantiateRoomObject(wallPrefab.name, new Vector3(position.x, position.y, 0), Quaternion.identity); } [PunRPC] void RotateWall(GameObject wall) { var dir = Input.mousePosition - Camera.main.WorldToScreenPoint(wall.transform.position); var angle = Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg; wall.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward); } }
    2 points
  25. Hallo Community, heute möchte ich euch ein kleines Video zeigen. Es basiert auf meinem ersten Testlevel. Somit könnt ihr euch das schon mal in Bewegung ansehen.
    2 points
  26. Moin Leute! Gestern wurden vermehrt Spamnachrichten versendet und auch heute versucht der Spammerbot sich weiterhin anzumelden und danach Nachrichten zu versenden. Wir sind an dem Problem dran! Momentan heißen alle Spammer Inda mit ner Zahl hinten dran. Solltet Ihr von einer IndaXX eine Nachricht bekommen haben, dann bitte löschen.
    2 points
  27. @Peanut Ja, wir k√∂nnten eigentlich schon beim Eingang der Foruen gleich einen Link zum Unity-Mutterforum setzen. Dann br√§uchten wir hier nichts mehr schreiben. Wer will schon ein deutsches Forum haben. @Alessio Jeder Compressor verringert dir die Datenmenge, die im Spiel geladen und auch der Grafikkarte √ľbergeben werden muss. Das ist der Vorteil und der Grund dabei. Eine Komprimierte Grafik zu nutzen, macht bei der Performance eigentlich nichts aus. Unity nutzt eh komprimierte Grafiken und Sounds intern. Bei der Meshkompression ist das so √§hnlich. Da werden eigentlich nur die Dinge entfernt bzw. komprimieret, die nicht weiter n√∂tig sind. Da ist z.B. der Punkt eine Meshes, der ganz genau angegeben werden kann, aber nicht muss. Fazit: Du wirst keine Performance-Einbu√üen bekommen. Du wirst aber bei den Grafiken unsch√∂ne Kompressionsartefakte oder Farbverwaschungen sehen.
    2 points
  28. 2 points
  29. Cool zu wissen! Hast du auch eine Frage? Ansonsten ein Schuss ins Blaue: Nutze daf√ľr keinen Collider, sondern z.B. einen Raycast.
    2 points
  30. Moin, lösch mal in der if Abfrage das "int" vor randomNumbr.
    2 points
  31. Moin! Es kann sein, dass jetzt einiges kommt, was du schon wei√üt, aber ich fange einfach mal von vorne an. Nur zur Sicherheit... und wenn in Zukunft jemand UI-Probleme hat, kann ich einfach auf diesen Post verweisen Also... wenn er nicht auf "Constant Pixel Size" gestellt ist, sorgt der Canvas Scaler daf√ľr, dass der Canvas immer einigerma√üen‚ĄĘ gleich gro√ü bleibt. Ansonsten nimmt er H√∂he und Breite des Spielfensters an. Meine √ľbliche Konfiguration ist "Scale with Screen Size", eingestellt auf "Match Width Or Height", weil ich meine Grafiken nicht gestreckt haben will. "Match" ist dann ganz nach rechts auf "Height" gezogen. Damit verh√§lt sich der Canvas wie die normale Spielwelt: Die H√∂he ist immer gleich, und wenn das Spiel relativ dazu breiter wird, dann nimmt die Kamera halt mehr auf. Siehe Bild rechts: Bei 4:3 werden halt einfach links und rechts Teile abgeschnitten, aber die H√∂he bleibt konstant. Daraus ergibt sich jetzt aber leider, dass sich das UI √§ndern muss, wenn sich das Seitenverh√§ltnis √§ndert. Ich nehme an, genau davor sitzt du gerade. Hier gibt es leider keine simple Einstellung, die das Problem l√∂st. Das liegt daran, dass der Computer unm√∂glich raten kann, was gut aussieht. Schauen wir uns einfach mal Diablo 3 an: Hier haben wir die Questanzeige links, eine Minimap rechts oben und das Skillmen√ľ samt Lebensanzeige usw. unten mittig. Dazu noch zwei kleine Kn√∂pfe unten rechts. Das Skillmen√ľ wird sicherlich unten zentriert bleiben und nicht skalieren. Wird der Bildschirm breiter, bleiben links und rechts einfach mehr Platz. Das Questmen√ľ hat auch eine feste Breite, w√ľrde aber im Zweifelsfall sicherlich in der H√∂he mitgehen. Ich denke, Questmen√ľ f√ľllt immer die gesamte H√∂he aus, minus der H√∂he des Skillmen√ľs. Die Minimap ist einfach oben rechts verankert und ver√§ndert seine relative Gr√∂√üe nicht. Wird der Bildschirm breiter, bleibt die Minimap einfach an der rechten Seite kleben und geht mit. Was ich gerade als Text formuliert habe, kannst du Unity mitgeben, und dann passiert genau so ein verhalten. Daf√ľr musst du dir die RectTransform-Komponente deiner UI-Elemente genauer ansehen. Genauer das Men√ľ, das aufgeht, wenn du oben links auf das quadratische Symbol klickst: Hierbei handelt es sich um den "Anker" (Anchor). Es ist dieselbe Einstellung, die du in Form von 4 Zahlen siehst, wenn du "Anchor" aufklappst. Allerdings ist es viel intuitiver, mit diesem Popup zu arbeiten, und die genauen Zahlenwerte brauchst du eigentlich so gut wie nie. Dein UI-Element l√§sst sich also in eine dieser 16 Kategorien einsortierten. F√ľr jeweils die H√∂he und die Breite kannst du abgeben, ob auf dieser Achse zentriert werden soll, an eine der jeweiligen beiden Kanten angeklebt werden oder gestreckt werden soll. W√§hlst du eine neue Kategorie aus, √§ndern sich auch die Beschriftungen der Eingabefelder rechts davon in der RectTransform-Komponente. Ein zentriert verankertes Objekt wie im Bild hat z.B. Position, H√∂he und Breite. Ein Objekt, das vertikal gestreckt wird, keine vertikale Position oder H√∂he mehr, sondern stattdessen jeweils den Abstand nach oben und unten. Die Questanzeige w√§re also ein Kandidat f√ľr ganz unten links (vertikal gestreckt, horizontal linksb√ľndig). Der Abstand nach unten w√ľre dann die H√∂he des Skillmen√ľs. Das Skillmen√ľ selbst w√§re vermutlich bottom center. Die Minimap top right. Neben dem Anker kann man sich den Pivot-Punkt nochmal ansehen, der in manchen Situationen besser nicht mittig gesetzt sein sollte. Daf√ľr kann man die Werte der "Pivot"-Einstellung anfassen oder im Anker-Popup mal Shift gedr√ľckt halten. Aber das f√ľhrt hier eventuell ein bisschen zu weit. Wenn du jetzt zur Laufzeit Objekte erzeugst, dann musst du weiterhin mit diesen Dingen arbeiten. So nimmt man nicht die position-Eigenschaft, sondern anchoredPosition, wenn man die Position setzen will. F√ľr die Gr√∂√üe des Objekte nicht localScale benutzen, sondern SetSizeWithCurrentAnchors. Von deinem Prefab sollten Anker und Pivot im Vorfeld richtig eingestellt sein. Und dann kommen da noch die Layout-Komponenten. Wenn du z.B. eine Liste von Dingen hast (und da k√∂nnten auch die Kn√∂pfe im Skillmen√ľ in Diablo zuz√§hlen!), dann bietet es sich an, eine LayoutGroup zu benutzen. Wenn du da dann Objekte reinspawnst (also am besten bei Instantiate direkt die LayoutGroup als Parent mitgibst), dann sorgt so eine Komponente daf√ľr, dass Dinge richtig angeordnet werden. Wenn dir als das nichts hilft, poste doch einfach ein paar Screenshots, vielleicht liegt das Problem ja ganz woanders
    2 points
  32. Bin ja kein Fan von "Dinge zuf√§llig oft tun" in Code. Die alternative Variante mit berechenbarer Laufzeit ist das Gegenteil: Du hast eine Liste mit allen m√∂glichen Ergebnissen. Nach dem W√ľrfeln streichst du das gew√§hlte Ergebnis aus der Liste und hast beim n√§chsten Wurf nur noch die √ľbrigen M√∂glichkeiten.
    2 points
  33. Mit deiner Methode w√ľrde ich die Beiden Collider Tagen und mithilfe von CompareTag() in einer If abfragen welcher Collider nun getroffen wurde. Aber das ruft einige Probleme auf . Zum Beispiel was passiert wenn dein Spieler beide Collider trifft usw. Ich w√ľrde anders an die Sache rangehen. Unzwar nachdem dein Spieler mit dem Gegner collidiert ist w√ľrde ich einen Richtungsvektor zwischen Gegner und Spieler berechnen und diesen normaliesieren. Und je nachdem welche Werte dieser hat wei√üt du ob der Spieler √ľber dem Gegner war oder nicht. Hoffe ich konnte helfen
    2 points
  34. F√ľr die 3 Likes gibt es eine gerenderte Variante von dem Raumschiff.
    2 points
  35. Du meinst ein Script, das die Bewegung des Objekts direkt kontrolliert? Ich kaufe ein Z und löse: Der Autor dieses Controllers hat sich halt keine Sekunde lang um Physic Materials geschert
    2 points
  36. Ja, ist schon eine sehr mehrschichtige Frage. Zum einen das Thema, das @Thariel beantwortet: Welches Format wird genutzt? PlayerPrefs, eine Datei (Xml, Json, Yaml, ...?) oder vielleicht doch eine Datenbank (Sql oder was anderes)? Die Daten k√∂nnen auch auf einem Server verwaltet werden, aber ich nehme an, du m√∂chtest lokal auf dem Rechner des Spielers speichern. Dann w√§re da die Frage nach dem Inhalt des Spielstandes. Diese Frage hat direkt Einfluss darauf, welches Format sinnvoll ist. Wenn du einfach ein paar Zahlenwerte h√§ttest (welches Level ist fregespielt, wieviele M√ľnzen/Leben hat der Spieler), dann w√§re PlayerPrefs auf jeden Fall unproblematisch. Je komplexer es wird, desto unpraktischer werden sie, auch wenn sie theoretisch alles k√∂nnten. XML-Dateien sind etwas... "schwerf√§llig" und werden schnell gro√ü, weil da so viel Zeug drinsteht, was nicht direkt deine Daten sind. Daf√ľr versteht .NET ohne weitere Pakete sofort, wie die Dinger funktionieren (siehe @Thariels Link). F√ľr Json m√ľsstest du dir schon eine Json-Bibliothek besorgen. Gibt's aber ein paar f√ľr, Json ist sehr verbreitet und wird von Unity-Devs gerne genutzt. Unity versteht Json sogar (JsonUtility), aber das ist so lala im Handling, wenn du mich fragst. Es macht auch in der Implementation einen sp√ľrbaren Unterschied, ob du einfach konstant X Sachen speicherst oder nicht. So als Beispiel die VR-Spiele von Owlchemy Labs; Job Simulator oder Virtual Rick-ality. Die speichern nicht wirklich viel, sondern nur in welchem Level du bist. Da gibt's aber halt soundso viele Objekte, und von denen k√∂nnte man einfach die Positionen speichern und fertig. Beim Spielstart besorgt sich jedes dynamische Objekt in der Szene seine Position aus dem Savegame und gut ist. In einem Spiel wie Skyrim dagegen kommen Objekte hinzu oder werden gel√∂scht. Da brauchst du dann ein anderes System, das eine variable Anzahl von Objekten beliebiger Art speichern und laden kann. Es muss also alle deine Prefabs kennen, von denen Instanzen geladen werden k√∂nnen, und diese dann spawnen. Wie deine Implementation aussieht, hat aber keinen Einfluss darauf, welchen Dateitypen du nehmen solltest. Xml, Json, Yaml... die speichern alle dasselbe ab, nur in unterschiedlicher Syntax. Ist ein bisschen, als ob du dich entscheidest, ob du deine Notizen auf deutsch oder englisch aufschreibst. Sobald du dir einmal f√ľr alle diese Fragen eine Antwort ausgesucht und bewusst gemacht hast, werden alle weiteren Schritte einfacher.
    2 points
  37. Moin! Also... ich fang mal recht weit vorne an, ich glaube das hilft. Wenn du so etwas schreibst: void Blub(zeug) { kram } dann nennt man das eine Methode. Das ist ein St√ľck Code, das ausgef√ľhrt werden kann. Wenn man "Blub" aufruft, dann passiert "kram". (Statt "void" kann da auch was anderes stehen, ist aber hier erstmal nicht wichtig.) "zeug", also das, was in den runden Klammern steht, nennt man Parameter. Damit bestimmt man, wie "kram" passieren soll. Wenn du zum Beispiel eine Methode schreibst, die "Losgehen" hei√üt und das auch tun soll, dann ergibt es vielleicht Sinn, mit einem Parameter zu definieren, wohin das Objekt losgehen soll. Aber vielleicht wei√ü das Objekt das ja schon vorher und wartet nur noch auf das Startkommando - dann braucht die Methode keinen Parameter. Wenn eine Methode einen oder mehrere Parameter hat, dann kann man sie nicht aufrufen, ohne f√ľr jeden Parameter einen Wert zu √ľbergeben (lassen wir f√ľr's erste so stehen... ). Wenn du z.B. die Methode "transform.Translate" aufrufst, dann musst du beim Aufruf in die Klammern schreiben, in welche Richtung sich das Objekt bewegen soll: transform.Translate(Vector3.up); Irgendwo in Unity drin ist diese Methode definiert, und das sieht dann wieder so aus wie oben: void Translate(Vector3 direction) { kram } (Sieht in Wirklichkeit ein bisschen anders aus, aber das ist gerade nicht so wichtig.) Und jetzt macht Unity halt irgendeinen "kram". Dabei benutzt es den Wert, den du beim Aufruf in die Klammern geschrieben ("√ľbergeben") hast (Vector3.up), sodass du dich nach oben bewegst und nicht irgendwo anders hin. Wenn du jetzt OnTriggerEnter2D als Methodennamen hast, dann ruft Unity diese Methode magisch f√ľr dich auf, wenn eben ein anderer Collider mit diesem Collider in Ber√ľhrung kommt und einer davon ein Trigger ist. Jetzt ist es Unitys Aufgabe, da einen Wert zu √ľbergeben. Und Unity √ľbergibt da den Collider, mit dem dieses Objekt in Ber√ľhrung gekommen ist. Also "den anderen" Collider zum Beispiel. Und du kannst jetzt entscheiden, was du mit dieser Information anf√§ngst. Du kannst zum Beispiel ganz simpel in die Konsole schreiben, wen du da ber√ľhrt hast: void OnTriggerEnter2D(Collider2D collider) { Debug.Log(collider.gameObject.name + " hat mich ber√ľhrt!"); } Bemerke, dass da "Collider2D collider" steht. Ein Parameter ist immer wie eine Variable definiert, hei√üt: Typ name Der Typ bestimmt, was f√ľr eine Art von Wert hier √ľbergeben werden kann (z.B. ein Vector3 wie bei Transform.Translate), aber hier ist es eben ein Collider2D. Normalerweise bist du beim Schreiben einer Methode der Chef und kannst da reinschreiben, was auch immer du meinst, was die Methode braucht, um richtig arbeiten zu k√∂nnen. Wenn du aber hier etwas anderes als "Collider2D" schreibst, dann weint Unity aufgrund von Problemen mit der Magie, die ich eben meinte. "collider" ist hier ein beliebiger Name. Da kannst du auch "other" oder "otherCollider" oder "wurstbrot" hinschreiben. Wie du magst. Am Ende definierst du hier einfach einen Variablennamen, damit du im Rumpf der Methode (also dem "kram") beschreiben kannst, wovon du gerade redest. Hier zum Beispiel benutze ich collider.gameObject.name, also den Namen des GameObjects, zu dem der Collider2D geh√∂rt, und lasse ihn mit Debug.Log in der Konsole ausgeben. (Wieder ein Parameter hier, der in die Klammern kommt!) Hie√üe der Parameter anders, m√ľsste ich halt wurstbrot.gameObject.name schreiben. Jetzt kannst du mit einer if-Abfrage dein Objekt identifizieren. F√ľr den Anfang, aber wirklich nur f√ľr den Anfang, kannst du da Tags oder Namen benutzen und die abgleichen. Das w√ľrde ich auf Dauer keinesfalls empfehlen, aber die Gr√ľnde daf√ľr f√ľhren hier zu weit. Du kannst z.B. einem Objekt oben im Inspektor den Tag "Player" geben: Und dann in deinem Code sowas schreiben: void OnTriggerEnter2D(Collider2D collider) { if (collider.gameObject.CompareTag("Player")) { Debug.Log("Der Player hat mich ber√ľhrt!"); } } Du kannst dem Collider2D auch sagen, dass er Dinge tun soll. Du kannst z.B. sein GameObject zerst√∂ren: void OnTriggerEnter2D(Collider2D collider) { if (collider.gameObject.CompareTag("Player")) { Destroy(collider.gameObject); } } Wenn jetzt der Player in diesen Trigger l√§uft, dann wird er sofort zerst√∂rt. Alle anderen Objekte werden nicht betroffen.
    2 points
  38. Hallo, mir ist heute ein etwas √§lteres Projekt in die H√§nde gefallen mit dem ich mich letzten Sommer etwas besch√§ftigt habe. Es handelt sich um ein FPS-Projekt. Ich hatte schon vor einiger zeit hier im Forum mein Projekt ‚ÄěDie Zone‚Äú vorgestellt. Das hatte ich mit der Leadwerks-Engine versucht umzusetzen. Allerdings hat mir die gesamte Engine, das Handling und letztendlich das Ergebnis nicht sonderlich gut gefallen. Daher wurde das Projekt mit dieser Engine nicht weitergef√ľhrt. Allerdings wollte ich die Idee nicht verfallen lassen. Daher habe ich das Projekt, wie oben bereits erw√§hnt, letzten Sommer mit Unity wieder aufleben lassen. Das Projekt die Zone spielt in der Gegenwart. Es gab also einen Reaktorunfall, der ein Areal nuklear verseucht hat. In dieser Region herrscht Chaos und es ist unbewohnbar geworden. Selbstverst√§ndlich kriecht auch eine Menge von mutierten Lebewesen in der Welt umher die jeden Eindringlich gerne aufessen m√∂chten. Die Aufgabe des Protagonisten ist ebenfalls schnell erz√§hlt. Damit die Verseuchung sich nicht noch mehr ausbreiten kann, muss der Reaktor abgeschaltet werden. Daf√ľr werden aber diverse Schaltelemente ben√∂tigt. Diese wurden aber von den mutierten Wesen im gesamten Areal verteilt und m√ľssen (nat√ľrlich von Protagonisten) eingesammelt werden. Daf√ľr erh√§lt der Spieler von der Zentrale entsprechende Auftr√§ge. Des weiteren gibt es andere Fraktionen und S√∂ldner, die in den verseuchten Gebieten ihr Unwesen treiben. Der Spieler wird nach und nach in die Story einbezogen und erf√§hrt somit im Laufe der Zeit die gesamte Story. Ich stehe noch am Anfang und habe vom Gameplay noch nichts zum Vorstellen. Ich kann euch allerding schon mal ein paar Screenshoots der Milit√§rbasis geben, die bereits von S√∂ldnern besetzt ist. Etwas umherschie√üen kann auch schon.
    2 points
  39. Heute habe ich f√ľnf weitere Regionen fertiggestellt. Somit sind es dann schon insgesamt acht von 21 Leveln. Hier die einzelnen neuen Regionen mit einem kleinen Screenshot. Hier der Link zum Download der Demo: http://www.pchobbyspieleschmiede.de/lara/lara_0.1.0.rar Region Goldhain: Region Hochberge: Region Kleintann: Region Tieffels: Region Unterfelde: Region Wolfsfelde:
    2 points
  40. Hallo, heute m√∂chte euch ein kleines Video vom neuen Projekt zeigen. Um die ersten Ergebnisse mal vorzustellen, sollte ein unmoderiertes Video reichen. Zu sehen ist der Men√ľ-Level, die Karte von Symira und die erste Spielwelt Silberh√∂he. Im fertigen Spiel wird es nat√ľrlich eine gr√∂√üere Monsterwelle geben. Dies dient nur zur Demonstration. Nach Abschluss eines Monsterangriffs √∂ffnet sich der ‚ÄěLaden‚Äú f√ľr Upgrades.
    2 points
  41. Statt "eine Fehlermeldung" k√∂nntest du die besagte Fehlermeldung ja mal posten, dann muss man nicht raten Also... GetTimeCoroutine will eine Action<float> als Parameter kriegen. Was du reingibst ist: callback => return callback; Es handelt sich hier also nicht um eine Action, sondern eine Func, also eine Funktion, denn es wird etwas zur√ľckgegeben. Du √ľbergibst also etwas, das nicht zum Parametertyp passt.
    1 point
  42. Beim 2D-Raycast schie√üt du halt einen Strahl entlang des Bildschirms. Du testest also mehr Pixel als nur den, wo die Maus dr√ľber ist. Du kannst also je nach Richtung neben einen Collider klicken, und er wird trotzdem erkannt. OverlapPoint ist halt genau daf√ľr da, nur das eine Pixel zu testen und sonst nichts. Deine NullReferenceException kommt daher, dass du den Code √§ndern musst, da OverlapPoint etwas anderes zur√ľck gibt als Raycast. Raycast gibt dir einen RaycastHit2D zur√ľck, der mehr Infos enth√§lt als die, welcher Collider getroffen wurde. So etwas wie "wie weit der Strahl daf√ľr wandern musste", wo auf dem Collider der Strahl getroffen hat oder sogar, welchen Winkel zur Oberfl√§che der Strahl beim auftreffen hat. Das brauchst du hier alles nicht, und OverlapPoint gibt das auch alles nicht zur√ľck... ergibt ja auch gar keinen Sinn, da es keinen Strahl gibt. Entsprechend gibt OverlapPoint einfach nur den getroffenen Collider zur√ľck, oder null, wenn nichts getroffen wurde. Du musst also deinen Check von if (hit.transform != null) zu if (hit != null) bzw, in Unity w√§re das dasselbe, if (hit) √§ndern. Wobei ich nat√ľrlich "hit" umbenennen wollen w√ľrde, weil's ja kein hit mehr ist, sondern ggf. ein Collider. Bei hit.transform versucht Unity, dir die Transform-Komponente des getroffenen Colliders zu geben. Wenn es aber gar keinen getroffenen Collider gibt, f√§ngt Unity aber an zu weinen.
    1 point
  43. Also ich glaube eher, dass es am Sommer und der Erfahrung liegt. Du hast da schon recht, der große hype ist vorbei. Heutzutage gibt es viele Engines, die nix kosten und außerdem haben viele der Leute gemert, dass man seine Idee nicht mal eben so mit nen paar Klicks umsetzen kann. Trotzdem sind täglich jede Menge Leute hier und informieren sich. Nur, wenn man dann ne Zeit lang mit Unity gearbeitet hat, gibt es auch nicht mehr so viele Fragen zu stellen. Im Herbst wird es wieder anziehen, da bin ich mir sicher.
    1 point
  44. Kenne keinen Kill-Befehl, und es w√§re auch nicht anzuraten. Android-User sind es gewohnt, dass Apps nicht beendet werden k√∂nnen. Raustabben, und wenn's einem unter den Fingern kribbelt halt im Task-Men√ľ die App wegschieben, dann isse weg.
    1 point
  45. EventSystem.current.IsPointerOverGameObject gibt true zur√ľck, wenn der Mauszeiger gerade √ľber einem UI-Objekt h√§ngt.
    1 point
  46. Hmm.. der Reihe nach. Benutzt du denn nicht UnityGUI? Also Canvas und so? Wenn nicht, dann solltest du. Und dann entf√§llt das mit den Collidern. Joa, nicht zu viel reininterpretieren. Wenn du nicht jeden Frame pr√ľfst, dann w√§re das Ergebnis halt bl√∂dsinnig. Muss also sein - und wenn du was haben willst, musst du daf√ľr auch die Leistung verbrauchen. Daf√ľr ist sie schlie√ülich auch da. Au√üerdem darfst du Unity da ein bisschen vertrauen. Ich bin absolut sicher, dass Unity einfach jeden Frame einen Raycast macht und schaut, was es trifft. Da ist also nicht jedes Objekt in jedem Frame dabei, alles von Grund auf selber auszurechnen. Und Raycasts laufen √ľber Beschleunigungsstrukturen, ist also alles halb so wild. Joa wie gesagt. Warum sollte Unity das intern anders machen? Schau mal auf einen frisch erzeugten Canvas. Der hat eine Komponente namens "Graphic Raycaster". Rate mal, was der jeden Frame macht
    1 point
  47. Da hast du tats√§chlich einen Schwachpunkt an Unitys Serializer gefunden. Er kann tats√§chlich keine Subtypen serialisieren. Wenn du eine List<T> oder ein Array T[] hast, dann werden da x Objekte vom Typ T serialisiert. Kann sein, dass der Odin Serializer das besser macht, aber ob man da eine Dependency aufbauen m√∂chte, ist halt Geschmackssache. Wenn du Vererbung in serialisierten Objekten haben willst, dann m√ľssen das UnityEngine.Objects sein, weil diese dann vom Serializer nicht als Teil eines anderen Objekts gewertet werden, sondern als eigene Instanz. Und die haben dann eine Info, von welcher Klasse sie Instanzen sind. Dann kannst du Referenzen darauf auch ganz normal in eine Kollektion ihrer Superklasse serialisieren lassen, aber sie "leben" dann eigenst√§ndig und nicht in der Liste. Ist alles ein bisschen nervig, gar keine Frage. Was du machen kannst ist z.B. ScriptableObjects zu erstellen. Das w√ľrde schon reichen. Wenn du die aber nicht in den Assets rumfliegen haben willst, dann kannst du sie einem anderen ScriptableObject unterordnen. Das geht mit AssetDatabase.AddObjectToAsset. Ist initial ein bisschen Fummelkram. Dann kann man halt die untergeordneten Assets selektieren und der Inspektor zeigt die an. Man kann dann bestimmt auch mit PropertyDrawer-Magie machen, dass die Listenelemente direkt unterschiedlich aussehen. Wird aber ein bisschen wild, alles. Falls dir das alles Kopfschmerzen bereitet... herzlich Willkommen in der Welt der professionellen Entwicklung mit Unity. Du hast das Einsteiger- und das Fortgeschrittenen-Level mit diesem Thema definitiv hinter dir gelassen und die damit verbundenen Schmerzen sind normal
    1 point
  48. Hallo, heute habe ich zwei weitere Regionen fertiggestellt. Die Gegner sind noch die gleichen wie im ersten Level. Da wird es aber noch zahlreiche andere zuk√ľnftig geben. Hier ist die Region K√∂nigstann: Hier die Region Goldhain:
    1 point
  49. Das ist aber auch mächtig krummer Code, das hier wäre äquivalent: var _ability = UnityEngine.Object.Instantiate(Resources.Load<Ability>(_abilityName)); Aber ansonsten so wie beschrieben: Ein Ability-Objekt wird aus den Resources geladen und dann geklont.
    1 point

Announcements

Hy, wir programmieren f√ľr dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...