Jump to content
Unity Insider Forum

Leaderboard


Popular Content

Showing content with the highest reputation since 07/20/2018 in all areas

  1. 5 points
    so ich hab den Ritter aus der Daemonic Cathedrale ein wenig überarbeitet und die KI eingebaut .. der Kämpft jetzt mit Schild und wehrt Angriffe gerne mal ab .
  2. 5 points
    Version: 1.45 Entwicklerforum: Canyonbreed Forum DiscordChannel: https://discord.gg/NRaJKe2 Ein Respawnpunkt Ronith-4, ein sandiger Planet. Sandsturm im Zeitraffer
  3. 5 points
    Hallo zusammen, ich habe die letzten 10 Monate neben einem Spiel auch an einem Video gearbeitet. Ich dachte mir, dass eventuell einige von euch das Thema interessieren könnten. Es geht um eine relativ stark verallgemeinerte Erklärung, wie eine Game Engine realistische Modelle/Materialien darstellt.
  4. 5 points
    Moin zusammen, wir bei PHOS Digital, mein Kollege und ich, arbeiten an einem "postapokalyptischen racing shooter" im Stil von Mad Max und Co. und ich möchte euch unseren Titel kurz vorstellen. Seit Anfang des Jahres arbeiten wir daran und noch sind wir mitten in der Preproduction, aber ich denke zum zeigen ist es schon ganz ordentlich. Wer Interesse an dem Titel gefällt, kann uns gerne auf www.phosdigital.com über den Newsletter folgen oder uns auf Facebook / Twitter finden. Es wird typische Rundenrennen und andere Spieltypen gegen KI oder Online Konkurrenten geben, in denen ihr euch gegenseitig bekämpfen könnt... Ob mit guten Zeiten oder Waffen, ist euch selbst überlassen. :-) Hier ein paar Screenshots
  5. 4 points
    Ich denke, ich schreibe mal etwas dazu, auch wenn ich da Anfangs nicht so sicher war. Zu diesem Thema kursiert sehr viel Halbwissen und ich hatte keinen Bock, auf den Zug mit den Fackeln und Heugabeln aufzuspringen, bevor ich nicht das Gefühl habe, etwas besser informiert zu sein. Eine Kampagne wie die von Roman ist sicherlich gut, denn so oder so braucht das Thema so viel Aufmerksamkeit, wie es kriegen kann. Lasst euch aber nicht von reißerischen Phrasen wie "das Internet wird abgeschafft" oder "da wird unsere Meineungsfreiheit abgeschafft" triggern, ohne das Ganze mal zu hinterfragen. Hier also meine zwei Groschen dazu. Artikel 13 ist ein Entwurf für eine Gesetzesänderung, die EU-weit inkrafttreten soll. Sie soll Rechteinhaber von urheberrechtlich geschützen Werken unterstützen, dass die Einnahmen, die ihnen für die Werke zustehen, auch bei ihnen ankommen. Es geht hierbei nicht um eine Verschärfung des Urheberrechts. Was vorher nicht erlaubt war, ist immer noch nicht erlaubt (z.B. die Verbreitung von Filmen ohne entsprechende Lizenz), was vorher erlaubt war ist immer noch erlaubt und was vorher Grauzone war ist das theoretisch nach wie vor (z.B. Derivate und Parodien, inklusive Memes). Aktuell ist der Nutzer einer Plattform derjenige, der sich bei Gesetzesverstößen strafbar macht. Wenn hier ein User den neuen Marvel-Film hochlädt, dann macht er sich strafbar. Wenn wir den dann sofort löschen, dann sind wir als Plattformbetreiber auf der sicheren Seite. Der Entwurf sieht im Kern genau eine Sache vor: Die Strafbarkeit für Urheberrechtsverletzungen auf den Betreiber der Plattform auszuweiten. Das heißt, dass wenn hier ein User ein geschütztes Werk hochlädt, wir dafür verklagt werden können, obwohl wir selber keinen Verstoß begangen haben. Anderen solcherlei Verstöße zu auch nur im Ansatz zu ermöglichen, soll in Zukunft ebenfalls ein Vergehen sein. Daran finde ich für meinen Teil in der Idee nicht wirklich etwas auszusetzen. Das Internet funktioniert eben anders als analoge Medien und ermöglicht es überhaupt erst einmal, unmoderierte Plattformen anzubieten. Was immer in der Zeitung oder im Radio landet, läuft eben immer schon durch einen menschlichen Filter. Das Problem mit der Reform ist in ihrer aktuellen Fassung die Implementation der Forderungen. Ja, es wird zu keinem Zeitpunkt das Wort "Uploadfilter" erwähnt, obwohl es überall benutzt wird, um Leute anzustacheln. Aber schauen wir uns doch direkt mal das für uns alle am ehesten interessante Beispiel an: Unity-Insider. Es gibt einen kleinen Absatz, der kleinere Plattformen vor der Verantwortung schützen soll. Dieser Absatz verlangt, dass die Plattform nicht älter als drei Jahre ist und nicht mehr als 10 Mio. Euro pro Jahr eingenommen hat. Alleine, weil es Unity Insider schon eine Weile gibt, sind wir dadurch nicht geschützt. Es ergibt sich daher für uns die Herausforderung, mit "technischen Mitteln" sicherzustellen, dass keine Sekunde lang Urheberrechtsverletzungen in diesem Forum passieren. Und da gibt es potentiell drei Möglichkeiten: Wir machen einen Pauschaldeal mit Verwertungsgesellschaften, wie Youtube einen mit der Gema hat. Dafür gibt es keinen standartisierten Weg und würde vermutlich eine Menge rechtskräftiger Unterstützung bedürfen. Es ist nicht davon auszugehen, dass wir in der Lage sind so etwas zu erwirken. Uploadfilter. Wir müssten ein Stück Software besorgen, der auf irgendeine Art jeden Forenbeitrag überprüft und checkt, ob eine Urheberrechtsverletzung vorliegt. Wir stellen das Forum so ein, dass wir manuell jeden Post freischalten müssen. Merkste selbst. 1. und 3. kommen absolut nicht in die Tüte. 2., also Uploadfilter, sind extrem problematisch, und das aus zwei Gründen: Es gibt sie nicht in verfügbarer Form. Google hat auf Youtube das "Content ID"-System laufen, ansonsten gibt es diese Software einfach nicht. Woher sollen wir die kriegen? Wie viel würde sie kosten? Selber schreiben kommt höchstwahrscheinlich nicht infrage. Darüber haben sich die Befürworter des Entwurfs scheinbar keine Gedanken gemacht. Selbst Youtubes "Content ID" ist echt schlecht. Der "Praxistest", wie man "Content ID" im Rahmen der Artikel 13-Debatte bezeichnen könnte, löscht regelmäßig Derivate und Parodien, die eigentlich keine Urheberrechtsverletzungen darstellen. Darüber hinaus hat Youtube ein autmatisiertes System, mit dem man Urheberrechtsverletzungen geltend machen kann. Wie gut das funktioniert, hat sich in der Vergangenheit mehrfach gezeigt. Es wird oft gesagt, dass es die großen bösen Plattformen wie Youtube sind, die Versuchen, die kleinen Rechteinhaber über's Ohr zu hauen. Und ja, Youtube und andere große Plattformen sind gegen Artikel 13, weil sie tatsächlich verringerte Einnahmen zu erwarten haben. Das wahre Problem mit Artikel 13 liegt meiner Ansicht nach aber bei den kleinen Plattformen. Plattformen wie Unity Insider, die beim aktuellen Stand des Entwurfs keine Möglichkeit sehen, die Auflagen zu erfüllen und daraufhin schlecht dicht machen müssen. Kleine Plattformen, die einfach nur Meinungsaustausch oder Support anbieten wollen, sind allein durch die theoretische Möglichkeit der Urheberrechtsverletzung die wahren Gelackmeierten. Zusammenfassend ist Artikel 13 im Kern lediglich eine Anpassung der Gesetzeslage für das Internet, um dort die Rechteinhaber zu schützen, wie es in der analogen Welt schon lange der Fall ist. Das Problem ist der Inhalt des Textes, denn er schafft eine Menge Probleme für kleine Plattformen, für die keinerlei Lösungen angeboten werden. Es ist das typische "lasst uns erst einmal Gesetze auf den Weg bringen", und über die Folgen denkt man vielleicht noch einmal nach, wenn es denn zu spät ist. Als kleiner Zusatz eine Überlegung bezüglich der Meinungsfreiheit. In direkter Weise stellt Artikel 13 keinen Angriff auf die Meinungsfreiheit dar und bringt auch keine Zensur. Wer das erzählt, hat das Thema meiner Meinung nach nicht verstanden. Es gibt aber zwei Punkte, die indirekt eine Gefahr für die Meinungsfreiheit im Internet darstellen: Es gibt keine staatlichen Plattformen im Internet, die zum Meinungsaustausch genutzt werden. Selbst politische Diskussionen, so dumm die Idee auch ist, finden auf Twitter, Youtube, Facebook statt. Das sind alles private Plattformen und diese haben selbstverständlich das Recht, Meinungen nach Lust und Laune besser zu finden. Wenn Twitter einen politischen Tweet löscht, der nicht gegen Gesetze oder Richtlinien der Plattformen verstößt, dann ist das schade, aber deren gutes Recht. Da Artikel 13 in seiner aktuellen Form kleinere Plattformen angreift, bedeutet das indirekt, dass große Plattformen Einfluss auf die Meinungslandschaft des Internets gewinnen. Und damit wird es schwieriger, frei seine Meinung zu äußern. Es ist scheinbar bereits bekannt, dass die so genannte "Terrorverordnung" auf die Gesetzeslage, wie sie duch Artikel 13 entsteht, aufbauen würde. Nach dem Motto "Hey, wir haben bereits auf allen Plattformen Filter, wir sorgen jetzt dafür, dass terroristische Dinge auch rausgefiltert werden". Oder anders gesagt: Mit den einzuführenden Mechanismen, bestimmte Inhalte noch beim Posten/Hochladen zu verhindern, ist die technische Grundlage geschaffen, tatsächliche Zensur einzuführen. Ja, der Entwurf selber birgt keine Zensur, aber wer noch nicht gemerkt hat, dass das Einführen eines Überwachungsstaats immer schleichend und schrittweise passiert, der hat im Geschichtsunterricht gepennt. Ein Entwurf wie Artikel 13 ist daher immer auch nach seinem Potential zu beurteilen, Teil eines größeren Prozesses zu sein, der letztendes dann eben doch gegen Meineungsfreiheit geht. Meine Empfehung für euch ist: Informiert euch. Was ich geschrieben habe, habe ich selbst wieder aus anderen Quellen. Ich habe den Entwurf nicht gelesen. Meines Wissens nach ist der Entwurf nicht einmal öffentlich einsehbar. So oder so - plappert nicht einfach etwas nach, dass ihr von einer einzelnen Quelle erfahren habt. Wenn ihr dann gegen Artikel 13 seid, und wenn es nur gegen die aktuelle Form des Entwrufs ist, dann informiert euch weiter, was ihr dagegen tun könnt. Es finden vermehrt große Demos statt. Die Flut an E-Mails, die initial kam, wurde von den Witzfiguren der CDU als Bot-basierte Aktion von Google abgestempelt, weil so viele der Absender mit @gmail.com aufhörten. Kein Witz. Wenn ihr also wollt, dass die Kritik ernst genommen wird, dann werdet laut. Aber bleibt dabei auf dem Boden der Tatsachen. Denn wenn Leute unreflektiert "ZENSUR" brüllen, dann verstehen die Leute im Parlement nicht, wo das Problem ist.
  6. 4 points
    Mir ist dein anderer Thread dazu aufgefallen, also dachte ich mir, ich lass auch mal ein paar Worte fallen. Was das Alter angeht haben die anderen ja schon einiges gesagt. Das ist ziemlich irrelevant. Aus meiner Erfahrung ist das eine Eigenschaft von guten Programmierern. Die nehmen meistens Worte sehr genau. Ansonsten ist ein guter Programmierer meiner Meinung nach kein professioneller "Code-Schreiber", sondern ein Problemlöser. Probleme elegant und effizient zu lösen erfordert zum einen die Fähigkeit abstrakt zu denken, vor allem aber erfordert es Kreativität. Die guten Programmierer, die ich kennengelernt habe, denken oft outside of the box. Selbstreflexion ist ebenfalls eine wichtige Eigenschaft eines solchen Programmierers. Dabei geht es darum zum einen offen zu sein für neue Ansätze. Viele Programmierer, die leider oft auch in Senior Positionen sind, glauben, weil sie das seit 20 Jahren machen wissen sie alles. Aber man lernt niemals aus. Zum anderen treibt sie einen an sich selbst zu verbessern. Die besten Programmierer, die ich kenne, beschweren sich nicht bloß über fremden, sondern meistens über ihren eigenen Code Erfahrung ist natürlich viel Wert und über Programmierung gibt es viel zu wissen, aber im Endeffekt ist die Programmierung bloß eine weitere, anlernbare Fähigkeit, die auf solche Charaktereigenschaften aufbaut.
  7. 3 points
    Hi, ich habe in den letzten zwei Jahren immer wieder an einem Flüssigkeit Simulations Shader gearbeitet und seit Mitte letzten Monats ist er jetzt im AssetStore erhältlich. Mit Fluid Flow kann man in Echtzeit simulieren wie beispielsweise Blut oder Farbe an einer Oberfläche herunter fließt. Es ist keine 100% physikalisch korrekte Simulation, sondern das Asset versucht mit möglichst geringen Performance Einbußen überzeugend Flüssigkeit zu simulieren. Dazu werden die Berechnungen mithilfe eines Compute Shaders auf die Grafikkarte ausgelagert. Compute Shader benötigen allerdings mindestens DirectX 11 oder OpenGL 4.3 support! Zudem sind Android und iOS momentan nicht unterstützt! Fluid Flow Echtzeit Flüssigkeit Simulation dynamisches Anpassen der Flussrichtung unterstützt animierte Objekte Tropfen* * werden asynchron von der GPU zur CPU gelesen. Dieses Feature gibt es erst seit Unity 2018.2, und mit OpenGL wird es nicht unterstützt! Demo (win): https://drive.google.com/drive/folders/1ewcJn2Cc56Pcg3IVXPgvDDYucfRrU2mg Asset Store: https://assetstore.unity.com/packages/vfx/shaders/fluid-flow-143786
  8. 3 points
    Hier hast du einge Möglichkeiten: https://docs.unity3d.com/Manual/PositioningGameObjects.html Interessant für dich dürften wohl Surface Snapping oder Vertex Snapping sein.
  9. 3 points
    Hier mal mein neuester Kram. Wartburg 353WR für Assetto Corsa (Modding). Nix Unity. Wird aber auch noch
  10. 3 points
    so nach langer Pause auch mal wieder ein Bildchen von mir , ich poste sonst immer in meinem Discord Channel oder auf unserer Facebook Seite naja jeden falls hab ich hier ein Bild von unserem Necromancer in der Dämonen Kathedrale
  11. 2 points
    Hallo Unity Insiders 🖐️ ich habe die letzten Wochen ein kleinen Prototypen erstellt von einer Spielidee. Diesen möchte ich mit euch teilen und mir erstes wichtiges Feedback von euch einholen. Zum Spielprinzip: Du schuldest einen Drogenbaron Geld, dieser hat seine Schläger losgeschickt um dich zu finden. Dein Ziel ist es das Geld aufzutreiben und zu überleben. Halte dein Fadungslevel im Auge, sonst jagen dich nicht nur die Schläger, sondern auch die Polizei. Schläger greifen dich nur an, wenn sie keine Polizisten sehen. Screenshots: Controlls: WASD => Walk Right => Targeting/Rob Left + Right => Shoot R => Reload E => Pickup Video: Prototype-Download-Link: https://dock17.itch.io/tba-game-prototype Feedback Ich würde mich über Feedback/Anregungen/Kommentare freuen 😉 Best Grüße John / Dock
  12. 2 points
    So, ich hab jetzt mal etwas herumgebastelt, dabei ist dieser kleine Prototyp entstanden:
  13. 2 points
    Was ich noch dazu sagen möchte: PlayerPrafs sind nicht dazu da, wie Variablen gehandhabt zu werden! Man liest die Werte mit Get aus und speichert sie in Variablen. Mit diesen Variablen wird dann gearbeitet, nicht mit den Playerprefs direkt. Erst wenn es Zeit ist, die Variablen auf die Platte zurück zu schreiben, weil jetzt das Spiel beendet wird oder ein Szenenwechsel stattfindet , werden sie mit Set geschrieben. Du machst mit der ws3FasterShooting komische Dinge. Du liest mit GetInt das Playerpref w3sFS aus und übergibst sie dieser Variable. Hat sie z.B. den Wert 1, dann soll sie in der Funktion den Wert 2 bekommen. Anstatt du aber jetzt ws3FasterShooting direkt beschreibst, speicherst du den Wert in w3sFS, nur um ihn direkt wieder auszulesen und der Variable ws3FasterShooting zu übergeben. Das ist schon mal nicht so dolle. Aber dein Problem, was da jetzt entsteht, ist: ws3FasterShooting hat jetzt den Wert 2 und somit ist die Bedingung für die nächste If Abfrage erfüllt. Da drin bekommt die Variable jetzt den Wert 3 und nun ist auch die Nächste If Abfrage erfüllt! Also entweder drehst du die If-Abfragen um, fängst also mit der Abfrage 3 an, dann die 2 dann die 1, denn kleiner kanns ja nicht werden, oder aber du nutzt else if. if(wert==1){ // ich bin 1 also mache was } else if(wert==2){ // ich bin nicht 1, ich bin 2 also mache was anderes } else{ // ich bin weder 1 noch 2 also mache das was noch übrig bleibt }
  14. 2 points
    Allem voran der übliche Hinweis dass hier keiner Anwalt ist und keiner dir eine richtige Rechtsberatung geben kann. Eigentlich kannst du nicht einfach geistiges Eigentum von anderen nehmen und für dein eigenes Werk verwenden. Da gibt's den Urheber des Werkes und den Rechteinhaber, von denen mindestens einer dir die explizite Erlaubnis geben muss. Etwas in Richtung Grauzone geht's dann bei Fair Use. Das ist amerikanisches Recht, nachdem du die Erlaubnis der Rechteinhaber nicht mehr brauchst, wenn du bei der Verwendung der Werke bestimmte Kriterien erfüllst. Unter anderem können Parodien darunter fallen. Das ist aber kein Recht, das weltweit gilt, und von einem deutschen Äquivalent wüsste ich nichts. Da müsste man dann auch mal schauen, ob die Rechte gelten, in denen du sitzt, in denen du vertreibst oder in denen die Rechteinhaber sitzen. China z.B. gibt kein Stück auf westliches Copyright. Entsprechend kopieren da alle wie wild alles mögliche, weil die Regierung da kein Problem mit hat. Was wollen westliche Firmen auch tun, außer Lobbyarbeit zu leisten, sodass die Politiker Sanktionen gegen Chin....oh. Der ganze Kram mit dem (internationalen) Urheberrecht ist ein wildes Dickicht aus völlig verschiedenen Rechtssystemen, von denen jedes einzeln genommene schon immer komplett undurchsichtig ist. Das ist ja auch das Problem mit Artikel 13/17... Nichtmal Anwälte schaffen es, da definitive Antworten zu gebe, geschweige denn irgendwelche Algorithmen. Aber egal. Meine Empfehlung ist: Lass es sein. Selbst, wenn es theoretisch Möglichkeiten gibt - mit der Verwendung anderer Leute geistigen Eigentums begibst du dich immer in eine Welt des Schmerzes.
  15. 2 points
    Hast du das auch wirklich so gemacht, wie der Sascha es geschrieben hat? Einem GameObjekt untergeordnet und dann das Vaterobjeket auf 1,1,0 skaliert???
  16. 2 points
  17. 2 points
    Ich muss da Jomnitech zustimmen du machst dir das leben schwerer als es sein muss. Stell dir vor du willst die Scallierung der Buttons ändern das dauert dann wieder unnötig lange. Ich würde tatsächlich mit den Unity Buttons mit verändertem Sprite arbeiten. Aber wenn du das tatsächlich so machen willst schau dir mal die Erweiterung: TextMeshPro im Unity Store an. (ist for free) Damit haste mehr UI-Optionen als in Vanilla Unity vielleicht geht es mit dem Tool besser. LG Peanut :3
  18. 2 points
    Der erste Testlauf einer Kartengenerierung mit PerlinNoise ist erfolgreich abgeschlossen. Etwas mehr fein Tuning beim Algorithmus und mehr als 3 Kartenfeldtypen sollten es aber schon sein sonst ist das nicht sehr ansehnlich. Aber immerhin, es funktioniert und geht ins nächste NightlyBuild.
  19. 2 points
    Habe gerade ein Spiel laufen, deshalb sind die absoluten Werte etwas hoch, geht ja aber nur um die relativen Meine Funktion: 15ns (a - b).sqrMagnitude: 48.2ns Vector3.Distance: 65.2ns Die Benchmark-Werte schwanken natürlich immer etwas. Und wie gesagt, das Spiel im Hintergrund scheint da etwa +55% draufzupacken. Ansonsten braucht Vector3.Distance natürlich etwas länger als sqrMagnitude weil's dasselbe mit Wurzel hintendran ist.
  20. 2 points
    Ist jetzt nicht nötig, aber vielleicht trotzdem interessant. Das kannst Du auch (gut leserlich) kürzen: bool direction = true; if (Input.GetKeyDown(KeyCode.Space)) { direction = !direction; //direction wird einfach negiert }
  21. 2 points
    Moinsen! Ich habe mich vorhin nach langer Zeit dann doch dazu aufgerafft, mir einen Blog aufzusetzen, in dem ich einfach mal beliebige Themen behandeln kann... geht aber schon noch um Unity Ich habe heute Nacht zwei Artikelchen geschrieben, und mit der Zeit sollen es mehr werden. Die beiden sind soweit auf englisch. Deutsche Übersetzungen sind nicht ausgeschlossen, aber im Moment nicht sonderlich weit oben auf der Liste. Wer Lust hat, kann ja mal reinschauen. http://blog.13pixels.de/
  22. 2 points
    Okay... ist für mich schwer zu entscheiden, wo ich ansetzen soll. Einerseits kommt einige Verwirrung daher, dass deine Schleifenvariable ("Durchlauf") keine lokale Variable ist, sondern auch nach Beendigung deines Schleifencodes weiterhin bestehen bleibt und du deshalb manuell den Wert zurücksetzt. Aber anstatt darauf einzugehen, würde ich lieber noch ein, zwei Schritte zurückgehen und darauf hinweisen, dass es mehr Datensammelstrukturen als Listen gibt. Wenn dein Ziel ist, eine Sammlung von Elementen zu haben, in der kein Element doppelt vorkommt, und du willst wissen, ob ein bestimmtes Element drin ist oder nicht, empfiehlt sich ein HashSet. Das entspricht nämlich genau dem mathematischen Konzept einer Menge und erlaubt dir superfixes Nachschauen, ob ein Element schon drin ist. Zwar hat die Liste auch eine "Contains"-Funktion, aber es gibt gute Gründe, bei einer solchen Situation das Set zu nehmen. Performance ist nur einer davon, und nicht einmal der beste Hier ein Beispiel, wie man HashSets benutzt: var menge = new HashSet<int>(); menge.Add(5); menge.Add(10); Debug.Log(menge.Contains(5)); // true
  23. 2 points
    Ich weiß nicht, was dein Inputdisplay Text ist und wo du das Textelement beschreibst. Kann es sein, dass du den Text von deinem InputField ändern möchtest? Wenn ja, dann musste Input.Text nutzen.
  24. 2 points
    Wie Sachsa schon sagt. Ich wollte aber noch mal kurz erklären, was die Vertreiber prüfen. Die prüfen nämlich nur die Funktionalität und Stabilität deines Programms. Apple gibt gewisse Richtlinien vor, was alles drin sein muss und was nicht sein darf. Da geht es hauptsächlich um die Zugriffe auf die Hardware und ob es mit diversen OS auch läuft und ob diverse Dinge genutzt werden, die Apple untersagt hat. Apple testet bei jedem Update aufs neue. STEAM macht das so ähnlich. Die Testen ob deine Anganben im Shop auch der Realität entsprechen. Wenn du z.B. volle Controller unterstützung angegeben hast, dann testen die auch, ob denn alles mit einem Controller auch zu machen ist. Da geht es hauptsächlich um das BigPicture und den STEAM Controller, damit du das Spiel ohne Tastatur auf dem Fernseher spielen kannst. Steam testet nur einmal bei der Veröffentlichung. Danach ist denen egal was dein Update beinhaltet. Wie das bei den anderen Verreibern, wie GooglaPlay, Microsoft usw., ist kann ich nicht genau sagen, aber auch da wird es hauptsächlich um die Funktionalität und Stabilität des Programmes gehen. Die internen Mechanismen sind denen egal und können auch gar nicht ohne weiteres überprüft werden.
  25. 2 points
    Das ist die Logik dahinter. Wenn du 2 Sachen zusammen abfragst, dann ist das ja ein logisches UND. Also nur wenn das Eine UND das Andere wahr ist, dann mache etwas. Soweit so gut. Aber du nutzt else und dort wird etwas ausgeführt, wenn eins der beiden Dinge in der Abfrage nicht wahr ist. Dummerweise setzt du aber eins der beiden Dinge dann auf wahr. In deiner Abfrage rundest du mit dem Befehl Truncate die Zahl in Richtung 0, also so ähnlich wie mit Floor. Aus der 10,xx wird die 10. Aus 0,xx wird die 0. Dann willst du mit dem Modulo Befehl den ganzzahligen Rest dieser Zahl ermitteln, wenn du sie durch 10 teilst. Da Modulo nichts anderes ist als : a -(a/b) * b kommt bei der Time= 0,xx eben auch ein Rest von 0 raus, denn 0- (0/10) *10 ist 0. Und bei 10-(10/10)*10 , was ja 10 - 1*10 entspricht, ist auch 0. Das ist schon mal der Grund, warum es nicht nur bei der 10 passiert. Und es passiert mehrmals bei der 0 und der 10, weil du zwar i auf false setzt, sobald die Bedingung wahr ist. Aber im nächsten Durchlauf, wegen dem i nicht wahr ist und somit else greift. Das else setzt das i wieder auf true und somit ins im darauf folgenden Durchlauf wieder die Bedingung für deine Abfrage erfüllt. Solange bei deinem Truncate also eine 10 oder eine 0 raus kommt, wirst du alle 2 Durchläufe einen Ausdruck bekommen.
  26. 2 points
    Grüß Dich ! wir schreiben dich an, weil wir unsere Community in Gefahr sehen. Es ist keine finanzielle oder personelle Frage, sondern eine gesetzliche. Mit dem auf uns zukommenden Artikel 13 basierend auf dem Entwurf des Springer Verlags und durchgesetzt durch Axel Voss (CDU), werden in der Zukunft Seitenbetreiber bzw Forumbetreiber dazu verpflichtet sogenannte Uploadfilter einzusetzen. An dieser Stelle ist es uns lediglich wichtig dich auf dieses Thema aufmerksam zu machen und dir zwei Links an die Hand zugeben: https://saveyourinternet.eu/https://saveyourinternet.eu/de/de/ https://twitter.com/ChangeGER/status/1095794493578719242 Ein Link fehlt noch: https://www.gofundme.com/plakate-gegen-artikel-13 Bei dieser Kampagne wird Geld gesammelt, um mit Plakaten auf diese Geschehnisse aufmerksam zumachen. So ein Plakat erreicht viele Tausende Menschen, die mit dem Thema gar nicht konfrontiert sind oder es garnicht mitbekommen. Es Grüßt die unity-community PS: geht gleich alles noch mal per Mail raus.
  27. 2 points
    Da hast du dir aber was vorgenommen. Ein Aktion-RPG hat sehr viele Dinge die man machen muss. Combat-System, Dialogue-System, Quests, Inventar, Waffen usw. Soll jetzt nicht negativ klingen, ich handhabe das ja genau so. Habe als totaler neuling den Sprung vom RPG-Maker zu Unity gemacht. Und mache selber auch lieber das Spiel was ich will statt kleine Spiele zum lernen. Aus meiner Erfahrung kann ich einfach folgendes sagen. 1. Wie Sascha schon gesagt hat, lern coden. Es ist wirklich nicht so schwer und es gibt tonnenweise sehr gute YT-Tutorials. Die Zeit die du in das lernen des PlayMakers investierst, kannst du auch gleich ins coden investieren. Ist mir genau so ergangen. 2. Verwende möglichst wenig aus dem Asset Store. Nichts gegen den Store selbst, finde gut das es Ihn gibt, aber jedes Asset ist anders aufgebaut. Du musst viel Zeit investieren um herauszufinden wie welches Asset funktionert. In der Zeit kann man meistens das Zeug selber erstellen und weiss dann genau wie es funktioniert. Dazu kommt noch das viele Assets die vielversprechend aussehen nicht das machen was du dir vorgestellt hast. Du kaufst also öfters Assets bis du dann das gefunden hast was du willst. 3. Ein grosses Projekt gibt einem oft das gefühl nicht weiter zu kommen, da man einfach nicht so schnell den Vortschritt sieht und teilweise das gefühl hat das kein Ende in sicht ist. Lass dich davon nicht beirren und bleib einfach dran. 4. Stell dich darauf ein das wenn du als Anfänger ein grosses Projekt machst, sehr sehr viel neu machen musst. Du lernst ständig dazu und merkst das was du vor einem halben Jahr gemacht hast einfach nicht gut ist. Ist zumindest meine Erfahrung. 3d ist auf jeden Fall viel aufwändiger als 2d. Wie Sascha auch schon gesagt hat betrifft das hauptsächlich Grafiken, Charaktere und Animationen. Du kannst das natürlich auch mischen. Habe ich auch gemacht. Welt in 3d und Charakter und Gegner in 2d. Wie z.B. in dem Spiel Octopath Traveler.
  28. 2 points
    Super, für dich, schade für Diejenigen, die früher oder später das gleiche Problem haben und nur wissen, dass du es gelöst hast, aber nicht wie! Lg Ricky-W
  29. 2 points
    Moinsen! Ich habe eben mal meine Script Templates hochgeladen. Dieses Bild sagt vermutlich einiges: Alles schön sortiert, außerdem zusätzliche Templates für ScriptableObjects oder Editor-Scripts. Sind auch ein paar Änderungen gegenüber den Vanilla-Templates drin. Windows Line Endings und überall 4 Leerzeichen statt Tabs und so. Wenn ihr Sachen objektiv besser findet, immer her mit den Merge Requests, wenn subjektiv, gerne forken. Hier gibt's das Ganze: https://gitlab.com/FlaShG/unity-script-templates Anleitung steht in der Readme.
  30. 2 points
    In diesem Fall solltest du keine Liste benutzen, sondern ein Dictionary. Ein Dictionary ist ein Datentyp, bei dem ein Wert zu einem Schlüssel zugewiesen werden. Typ von Schlüssel und Wert kannst du dir aussuchen. Es erlaubt dir, den Schlüssel hineinzustecken und den entsprechenden Wert herauszubekommen. Du definierst es so: Dictionary<TKey, TValue> wobei TKey der Typ des Schlüssels und TValue der Typ des Wertes ist. Da der Typ deines Items "InventoryItem" ist und der Wert eine Zahl (die Anzahl) sein soll, muss das so aussehen: Dictionary<InventoryItem, int> storedItems = new Dictionary<InventoryItem, int>(); So fragst du die Anzahl ab: storedItems[ip] // z.B. Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); Gleichermaßen kannst du die Anzahl setzen: storedItems[ip] = 100; Wenn du ein Item anfragen willst, das aber gar nicht in der Liste ist, dann kracht es. Deshalb gibt es TryGetValue, falls du dir nicht sicher sein kannst: int amount; if (storedItems.TryGetValue(ip, out amount)) { // Es gibt dieses Item im Dictionary Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); } else { Debug.Log("Ich habe kein " + ip + " in meinem Inventar"); } Auf diese Weise kannst du auch Dinge hinzufügen oder wegnehmen: public void ChangeAmount(InventoryItem item, int changeAmount) { int currentAmount; if (storedItems.TryGetValue(item, out currentAmount)) { // Das Item gibt's schon im Inventar var newAmount = currentAmount + changeAmount; if (newAmount > 0) { // Ändere die Anzahö storedItems[item] = newAmount; } else { // Lösche das Item aus dem Inventar storedItems.Remove(item); } } else { // Das Item ist noch nicht im Inventar if (changeAmount > 0) { // Füge das Item in das Inventar hinzu storedItems.Add(item, changeAmount); } } }
  31. 2 points
    Programmieren seit ~20 Jahren. Unity seit ~10, glaube ich. Aber glaube nicht, dass du 10-20 Jahre brauchst, um "gut genug" zu sein. Du hörst nie auf, dich zu verbessern. Ich selbst habe mich gerade letzte Woche hier im Forum korrigieren lassen müssen, weil ich falsch lag Ob es realistisch ist, in einem Jahr ein Spiel zu releasen, und das auch als anfänger, hängt komplett von dir, deiner Lernfähigkeit und deinem Projekt ab. Flappy Bird klatsche ich dir an einem Tag hin. Rechne das mal X weil du noch dies und das lernen willst oder musst, um das zu implementieren, und du bist vielleicht bei einer Woche. Wenn dein Projekt allerdings keine Kleinigkeit ist, dann kann's auch mehr als ein Jahr dauern, egal, wie gut du solo bist. Ich sitze jetzt seit etwas über einem Jahr an meinem aktuellen Projekt. Da geht zeitweise schonmal die Motivation flöten und dann wird eine Woche lang eher nur gezockt... aber naja. Anderes Thema. Solange du an den Erfolg deines Projekts glaubst, wirst du auch Fortschritte machen. Als Anfänger würde ich vielleicht nicht unbedingt deine finanzielle Sicherheit von einem Traumprojekt abhängig machen, aber solange du dir die Zeit nehmen kannst, weiter zu arbeiten, wirst du auch immer weiter kommen. Und dich währenddessen weiterentwickeln und verbessern.
  32. 2 points
    Edit: Lösung war das der Windows Defender mit seiner Ordner-Überwachung sämtlichen Zugriff auf den Dokumente Ordner verbietet.
  33. 2 points
    ^ ist nicht das Zeichen für "Hoch", es ist das Zeichen für "xor". Potenzrechnung machst du in Unity mit der Mathf-Klasse: Mathf.Pow(4, 2); // 4 zum Quadrat
  34. 2 points
  35. 2 points
    Wenn du eine Szene lädst, dann wird die alte Szene entladen (alle Objekte darin werden gelöscht) und die neue Szene wird danach geladen (alle Objekte darin werden instanziiert). Wenn du ein Objekt in Szene 1 hast und dann Szene 2 lädst, dann sind alle Objekte weg, die in Szene 1 waren. Dass du jetzt ein GameObject mit der gleichen Komponente darauf auch in Szene 2 hast, bedeutet nicht, dass es sich um dasselbe Objekt handelt - es ist ein neues Objekt derselben Art. Also das gleiche Objekt, nicht dasselbe. Entsprechend sind alle Einstellungen, die du am Objekt in Szene 1 vorgenommen hast, weg. Ich könnte jetzt mit dieser oder jener Lösung anfangen, aber hier gibt es noch einige andere Probleme. Ich erkläre mal, wo es hakt, und dann zeige ich darauf aufbauend eine mögliche Lösung. Fangen wir mit den drei Booleans an. Beim Programmieren können Fehler passieren. Wir sind halt Menschen und Menschen machen Fehler. Darum ist es gut, sich bestimmte Techniken anzugewöhnen, um "guten Code" zu schreiben. Guter Code tut mehr, als einfach nur zu funktioneren. Er minimiert zum Beispiel das Risiko, Fehler zu machen. Ein Spieler wählt eine Klasse aus. Er hat immer nur eine. Das heißt, dass es sinnvoll wäre, dass das Programm auch nur eine Klasse zur Zeit zulässt. Wenn du allerdings drei Booleans hast, dann ist es theoretisch möglich, dass zwei oder mehr davon true sind, und der Zustand deines Programms ergibt keinen Sinn mehr. Dass das möglich ist, bedeutet direkt Fehlerpotential, denn du musst zu jedem Zeitpunkt darauf aufpassen, dass das nicht passiert. Und je mehr es gibt, auf das du ständig achten musst, um keine Fehler zu machen, desto unmöglicher wird es, keine Fehler zu machen. Stattdessen wäre ein enum möglich, aber ich zeige gleich lieber eine andere Lösung. Das nächste Problem wären Strings. In diesem Fall benutzt du Tags. Ich schicke eines gleich voran: In meinen Projekten benutze ich niemals Tags. In jeder Situation, in der man sie gebrauchen kann, gibt es jeweils mindestens eine bessere Lösung. Trotzdem kann man sie erst einmal benutzen. Problem ist halt, dass man sich bei Strings immer vertippen kann oder sie sich ändern, ohne dass einem der Compiler sagt, dass etwas nicht stimmt. Wenn du im Code "Krieger" falsch schreibst, dann siehst du erst einmal nur einen Fehler im Test und musst danach im Code suchen, anstatt dass der Computer das für dich übernimmt. Dann kommt noch die if-else-Kette. Du hast jetzt eine Klasse, die nach dem Tag ihres GameObjects schaut und ein Boolean auf true setzt. Eine andere Klasse hat für jeden dieser Booleans eine if-Abfrage und ein Prefab, das gegebenenfalls instanziiert wird. Das heißt: Wenn du n Klassen hast, hast du n Tags, n Booleans und n if-Abfragen. Jedes Mal, wenn du eine Klasse in dein Spiel hinzufügst, musst du also einen Tag hinzufügen, ein Boolean in die eine Klasse einbauen und eine if-Abfrage in die andere. Das sind drei Arbeitsschritte für eine einzelne Änderung an deinem Spiel. Das klingt vielleicht nicht nach viel, aber wenn du einen dieser Schritte vergisst, hast du gleich wieder einen Fehler gebaut - und zwar wieder einen, bei dem dir der Compiler nicht helfen kann. Bei komplexeren Systemen gibt es dann noch mehr Arbeitsschritte pro Änderung, sodass das Fehlerpotential immer weiter steigt. Es sei denn, man geht grundlegend anders an die Sache heran. Nun zu einem Lösungsvorschlag. Was du letztenendes tust ist, dass du mehrere Objekte hast und jedes dieser Objekte steht für jeweils ein Prefab, das nach dem Laden immer derselben Szene instanziiert wird. Also Knopf -> Prefab, denn jeder Knopf steht für ein Prefab. Aktuell haben wir aber Knopf -> Boolean -> if-Abfrage -> Prefab, und wir können den gesamten Zwischenweg einfach rausnhemen. Wir ändern die Klassen wie folgt ab: Deine Knopf-Klasse, auf die man drückt, erhält eine Referenz auf das Prefab, für das es steht: public GameObject classPrefab; Anstatt jetzt den Tag des GameObjects einzustellen, ziehst du auf jeden deiner Klassen-Auswahlknöpfe das jeweils passende Prefab. Als nächstes nehmen wir uns das Script vor, das in Szene 2 dieses Prefab instanziieren soll. Es kriegt ebenfalls ein Feld für ein Prefab und spawnt dieses einfach nur: public GameObject prefabToSpawn; private void Start() { Instantiate(prefabToSpawn, transform.position, transform.rotation); } Ich habe für Position und Rotation hier die Position und Rotation des GameObejcts genommen, auf die du das Spawner-Script ziehst. Dann kannst du deinen Spawner in der Szene platzieren, um zu entscheiden, wo man spawnt, anstatt dafür den Code ändern zu müssen. Jetzt haben wir zwei sehr kleine Klassen. Wir brauchen nur noch eine OnMouseDown-Methode in der ersten, die das eigene Prefab als "prefabToSpawn" der zweiten Klasse angibt und die richtige Szene lädt. Du siehst vielleicht bereits die Vorteile der ganzen Sache. Jetzt haben wir ein Problem, und zwar dasselbe wie vorher auch schon. Das Objekt, dem wir etwas mitteilen wollen (nämlich das mit der Spawner-Klasse darauf in der zweiten Szene) existiert noch gar nicht zu dem Zeitpunkt, wo wir in Szene 1 auf den Knopf klicken. Hier gibt es mehrere Lösungen, wie man eine Information an einem Ort hinterlegt, der nicht zusammen mit der Szene gelöscht wird. Ich zeige dir mal die einfachste, auch wenn es andere mit zusätzlichen Vorteilen gibt. Das Schlüsselwort static wird oft missverstanden, sei also vorsichtig, wenn du selber noch einmal danach suchst. Ich erkläre mal: Wenn du ein Feld anlegst, also eine Variable außerhalb einer Methode, dann gehört sie zum Zustand des Objekts. So hat z.B. Unitys "Light"-Komponente ein Feld "color", das die Farbe des Lichts angibt. Wenn du zwei Lichter hast, dann kannst du das eine rot und das andere blau machen, denn "color" gehört zum Objekt. Wenn du ein Feld allerdings als "static" markierst, dann gehört das Feld nicht mehr zum Objekt, sondern zur Klasse selbst. Wäre "color" als "static" markiert, dann würden alle Lichter immer dieselbe Farbe haben. Dadurch, dass statische Felder eben nicht zum Objekt gehören, gehen ihre Werte bei einem Szenenwechsel nicht verloren; denn das passiert ja dadurch, dass die Objekte gelöscht werden. Wir ändern deshalb die erste zeile des Spawner-Scripts ab und fügen ein "static" ein: public static GameObject prefabToSpawn; private void Start() { Instantiate(prefabToSpawn, transform.position, transform.rotation); } Wenn wir die Farbe eines Lichts ändern wollen, dann müssen wir definieren, welches der vielen Lichter wir überhaupt meinen. Sonst weiß Unity ja nicht, welches Licht ab jetzt weiß leuchten soll. Das macht man über die Punktnotation, also "irgendeinLicht.color = Color.white;". Da statische Variablen eben nicht mehr zu den Objekten gehören, sondern nur noch einmalig Teil der Klasse sind, benutzt man die Punktnotation zusammen mit dem Klassennamen. Nehmen wir also an, das Script mit der statischen Variable heißt "PlayerSpawn", dann müssen wir schreiben: PlayerSpawn.prefabToSpawn = irgendeinPrefab; und genau das machen wir jetzt in OnMouseDown der Klassenauswahl-Knopf-Klasse: public GameObject classPrefab; private void OnMouseDown() { PlayerSpawn.prefabToSpawn = classPrefab; SceneManager.LoadScene("Welt_01"); } Wenn du also auf dieses Objekt klickst, wird das Prefab, das du beim jeweiligen Knopf im Inspektor reingezogen hast, in der PlayerSpawn-Klasse registriert. Wenn dann der Szenenwechsel passiert, hat das Feld "prefabToSpawn" immer noch dieses Prefab referenziert und die Start-Methode greift darauf zu. Das alles in wenigen Zeilen Code, ohne Strings, ohne Tags, und wenn du eine weitere Klasse zu deinem Spiel hinzufügen willst, dann baust du einen neuen Button und ziehst das Prefab der neuen Klasse hinein und bist fertig. Ich hoffe, das hilft dir weiter, vielleicht nicht nur bei diesem einen Problem
  36. 2 points
    @devandart Nur ein kleiner Hinweis: private static DeineKlasse instance; public static DeineKlasse Instance { get { return instance; } } kann man ersetzen durch public static DeineKlasse Instance { get; private set; } Generell ist Singleton zu vermeiden, wenn's geht. In Unity ist es wegen der Serialisierung nicht-statischer Klassen weniger schlimm als überall anders, aber immer noch nicht gut. Es ist okay, sie zu benutzen, bis man etwas besseres findet. Das "Bessere" heißt dann in der Regel ScriptableObjects. In diesem Fall geht es ja um eine Liste von Sprites. Warum müssen diese in der Scene (also auf einer Komponente auf einem GameObject) definiert sein? Eine Liste, die in den Assets liegt, wäre doch viel besser. Also ScriptableObject auf und los gehts: using UnityEngine; [CreateAssetMenu(menuName = "Game/Sprite List")] public class SpriteList : ScriptableObject { public Sprite[] sprites; } In den Assets Rechtsklick, so ein Ding erstellt und Sprites reingezogen. Name "Minimap Sprites". Dann baust du deine Scripts um, die diese Sprites benutzen und machst [SerializeField] private SpriteList minimapSprites; und ziehst das ScriptableObject "Minimap Sprites" da rein. Dann benutzt du statt MinimapSpriteManager.Instance.MinimapSpriteIcon[1]; das elegantere minimapSprites.sprites[1]; und hast dadurch Modularität, Robustheit und andere Code-Qualitäten erhalten.
  37. 2 points
    So, jetzt habe ich es anders gemacht: Mit Processing, der Minim Sound-Bibliothek und OscP5 habe ich mir ein kleines Programm erstellt, dass nach Start die Daten sendet. In Unity lese ich sie mit OSC aus. Funktioniert einwandfrei!
  38. 2 points
    Moinsen! Ich habe gerade ein Paket im Asset Store veröffentlicht: Der Thread dazu auf Englisch im Unity-Forum: https://forum.unity.com/threads/released-13pixels-pooling.587068/ Falls jemand noch nicht so richtig weiß was Pooling ist: Instantiate und Destroy sind keine besonders performanten Methoden. Instantiate deserialisiert das gesamte Prefab einmal und Destroy erzeugt Memory Garbage. Pooling beschreibt den Ansatz, bestimmte Objekte nicht zu löschen, sondern zu deaktivieren und später wiederzuverwenden. Objekt-Typen, die oft spawnen und wieder despawnen, werden dabei performanter, wenn man Pooling benutzt. Es gibt bereits einige Pooling-Pakete, und ich habe einige angeschaut und ausprobiert... trotzdem habe ich mein eigenes geschrieben, weil mir nichts davon gefallen hat. Kurze Zusammenfassung, was mein Paket anders macht als andere: Kein Extra-Setup nötig. Andere Pakete haben meistens einen Pool Manager oder so, also ein Objekt, in das man seine Prefabs ziehen muss, damit man Pooling mit ihnen machen kann. Oder man muss die PRefabs alle in einen bestimmten Ordner tun. Bei 13Pixels Pooling gilt der Grundsatz: Pooling ist eine technische Angelegenheit, und deshalb sollte es im Editor so wenig wie möglich auftauchen. Deine Szenen werden sich nicht ändern, wenn du von Instantiate/Destroy auf dieses Paket umsteigst. Anpassbares Pooling-Verhalten pro Prefab. Standardmäßig benutzt das Paket GameObejct.SetActive, um Objekte zu de- und zu re-aktivieren. Je nach Prefab kann es aber auch reichen, das Objekt einfach aus der Szene rauszuverschieben oder eine einzelne Komponente gezielt zu deaktivieren. In solchen Fällen kann man ein einfaches Interface implementieren, um einem Prefab sein eigenes Pooling-Verhalten zu geben. Pooling-Instanzen können beliebigen Objekten untergeordnet werden. Oft müssen von einem Pooling-System instanziierte Objekte einem Pooling-spezifischen Objekt untergeordnet bleiben - hier nicht. Hier gibt's (auf Englisch) die Anleitung, um mal einen Einblick in den Workflow zu bekommen: http://13pixels.de/pages/assetstore/Pooling/User-Manual.pdf Hier gibt's das Paket im Asset Store zu kaufen: http://u3d.as/1nvh Feedback, Nachfragen und Ideen sind gerne gesehen. Und das nicht nur, weil ich das Ding in meinen eigenen Projekten benutze
  39. 2 points
    Hallo Ich habe vor kurzem Substance Painter abonniert und zum Test ein kleines Schwert modelliert und danach in Painter bemalt. Ist jetzt nicht perfekt, aber ich dachte ich könnte es ja trotzdem mal hier reinstellen, falls es jemand gebrauchen kann. Wenn gewünscht, könnte ich den Rost entfernen oder im unteren Teil auch noch etwas Rost hinzufügen. Sword.unitypackage
  40. 2 points
    Anstatt durchegehend einen Wert hochzuzählen, könntest du auch konstant die Startzeit speichern. Dann erhöhst du nicht mehr in jedem Update deinen Timer-Wert, sondern rechnest ihn aus, indem du diesen Wert von der aktuellen Zeit abziehst. Dann kann man so oft Pause machen, wie man will, da sich der Wert dadurch nicht ändert.
  41. 2 points
    Hier mein Script zur Anzeige der FPS. Einfach der Szene hinzufügen (vorzugsweise auf ein Text Ui) und eine Referenz eines beliebigen Text Ui hinzufügen. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// This script calculate the current fps and show it to a text ui. /// </summary> public class UiDisplayFps : MonoBehaviour { public string formatedString = "{value} FPS"; public Text txtFps; public float updateRateSeconds = 4.0F; int frameCount = 0; float dt = 0.0F; float fps = 0.0F; void Update() { frameCount++; dt += Time.unscaledDeltaTime; if (dt > 1.0 / updateRateSeconds) { fps = frameCount / dt; frameCount = 0; dt -= 1.0F / updateRateSeconds; } txtFps.text = formatedString.Replace("{value}", System.Math.Round(fps, 1).ToString("0.0")); } }
  42. 2 points
    Hallo Leute Ich arbeite zurzeit an diesem Projekt. Der Name ist noch nicht fix. Ich überlege mir noch einen passenden Namen. Zurzeit ist es einfach Das Projekt "DungeonGame"^^ Um was geht es in "DungeonGame"? Du startest in einer Stadt. Dort kannst du Waffen und Rüstungen kaufen und Quests annehmen. Danach kannst du dich für eine Dungeon anmelden. In der Dungeon kannst du zusammen mit Freunden kleine und grosse Monster verprügeln. Nach dem Ausflug kannst du dir bessere Ausrüstung und Waffen kaufen oder diese selbst herstellen. Aktueller Stand: Ich habe einmal das Dorf gebaut und den Markt, in dem der Spieler startet, wenn er ins Spiel kommt. Zukunft: In nächster Zeit werde ich versuchen eine Dungeon zu bauen und ein paar Monster zum leben zu erwecken. und versuchen ein einfaches Gameplay auszuarbeiten. Fortschritte werde ich hier im Forum posten Schreibt mir doch was ihr denkt. Ich würde mich freuen 😁
  43. 2 points
    Moin, habe mal ein Video erstellt, dass verallgemeinert ein grober Einblick in den Renderprozess einer Game Engine gibt. Ich habe recht viele Animationen erstellt um diese Prozesse zu visualisieren.
  44. 2 points
    Nur so eine Idee... @jan1267, wo hast du den Cube her... ist das ein Standard-Unity-Cube oder hast du den importiert?
  45. 2 points
    Junge! Schreib doch mal ganze Sätze. Ich weiß echt nicht wovon du redest. Was sind 6 gewesen und von was benutzt man 3???
  46. 2 points
    Mein 3D Lead arbeitet gerad am Workflow mit Vegetation Studio für die "Umwelt" und hat nun noch ein weiteres kleines Hindernis (Waffe) für die Rennstrecke gebaut... Was darf bei einem postapokalyptischen Battle Racer nicht fehlen? Genau, Minen!
  47. 2 points
    Ich fände es auch schön, wenn hier mal wieder mehr gepostet werden würde. War immer sehr interessant zu sehen woran andere hier grade so arbeiten.. Hier mal wieder ein Update zu meinem Blutfluss Shader..
  48. 2 points
    Hallo Community, Ich konnte den Fehler nun finden und beheben. Sollte noch jemand das Problem haben versuche es mal die Lösung könnte für mehrere Package Probleme helfen wenn ihr seltsame Probleme habt. Unity lädt die Packete nicht jedes mal neu runter sondern Speichert sie in einem Localen Ordner. Den Ordner findet ihr unter C:\Users\Benutzername\AppData\Local\Unity\cache\packages\packages.unity.com Löscht den Inhalt, dann lädt Unity die Packete neu runter und Fehler im Download werden so behoben. So konnte ich alle meine Fehler mit der HDR Pipline beheben.
  49. 2 points
    Da hier aktuell ja nicht viel los ist, ändere ich das jetzt mal. (Glücklicherweise habe ich auch mal was vorzeigbares) Generierung eines Straßenzuges, könnte zwar überall noch etwas mehr Varianz vertragen, aber immerhin funktioniert es.
  50. 2 points
    Ohwe ohwe war ich hier lange nicht mehr unterwegs... Kennt mich hier überhaupt noch jemand? Das Studium frisst einen auf... Aber: Ich kann endlich mal wieder was (öffentlich) von meiner Arbeit zeigen! Und noch dazu ein Unity-Projekt, was doch eher untypisch ist. In den letzten 4 Monaten habe ich im Rahmen des 5. Semesters ein Augmented Reality Sandbox Game entwickelt - vielleicht kennt ihr das aus Museen, Sea Life, etc, manchmal gibt es da so Sandkästen, auf die mehr oder weniger in Echtzeit Höhenlinien projeziert werden. Ich habe das gesehen und mir gedacht: Da muss man doch mehr mit machen können. Und nach viel viel Arbeit kann ich euch meine erste Installation präsentieren: Basic Info: Man nutzt den Schatten seiner Hände um herumwirbelnde Natur-Teilchen einzufangen, diese kann man in vorher gegrabenen Mulden sammeln und so Stück für Stück die Landschaft vergrößern. Technischer Breakdown: Ich nutze eine Microsoft Kinect 2 um die Höheninformationen des Sandes und der Hände zu bekommen. Aber: Das "Raw" Kinect Tiefenbild ist für diesen Zweck eigentlich komplett unbrauchbar. Das rauscht wie verrückt, und immer wenn es eine harte Kante gibt werden die Höheninfos an dieser Kante einfach null - lauter so Zeug. Deshalb war mein erster Schritt das Kinect Bild möglichst performant und vor allem schnell zu filtern und zu smoothen. Dieses GIF zeigt den Effekt. Normalerweise ist es ja so, dass wenn man seine Hand jetzt über den Sandkasten hält, diese Höheninformation auch in die Projektion aufgenommen wird und dort ein sehr hoher Berg entsteht (einer der Gründe für die große Verzögerung der bekannten AR Sandboxes). Ich wollte das auf keinen Fall, weshalb ich nach einem Weg gesucht habe, die Hände aus den Höheninformationen herauszufiltern. Das funktioniert viel billiger als man vielleicht annimmt: Man kalibriert den Tisch einmal ohne Hände und ab diesem Moment werden alle Informationen, die über einem bestimmten Threshold sind, einfach ignoriert. Sobald man die Hand 3cm über den Sand hält, wird diese wieder als Terrain wahrgenommen (Es gibt dann mehrere Thresholds für schnelle Bewegungen etc.) Das Resultat fühlt sich nach einer sehr "magischen" Interaktion an, da eben nur die wirklichen Sandinteraktionen auch Änderungen in der Projektion hervorrufen. Zugleich bekomme ich aus den gefilterten Höhendaten dann eine Maske für die Hände, mit der ich über OpenCV Handgesten und Formen für den Game Input erkennen kann. Da dieses ganze System dann doch immer langsamer und nicht richtig "befriedigend" auf den Input reagiert habe ich das Kinect Bild in 8, sich überlappende Teile aufgeteilt, die auf unterschiedlichen Threads verarbeitet werden. Threading (und vor allem Multi Core Threading) ist in Unity ja bekanntermaßen eher, nennen wir es mal: kompliziert. Aber für ein Spiel wie dieses war es super essentiell, dass alles so schnell wie möglich reagiert. Ich berechne die Positionen der Hand Schatten aus der Projekterposition und den Kinect Daten, um die Spieler damit Objekte einfangen zu lassen - da will man natürlich keinen Lag haben. Und auch das Graben fühlt sich so richtig gut an. Visuall Stuff Das Terrain wird aus einer Displacement Map (die aus den verbesserten Höheninfos generiert wird) erstellt. Der Rest passiert dann in einem Shader: Ich berechne mir die Normalen aus der Heightmap, indem einfach ein Vektor aus einem umliegenden Dreieck von Höhendaten berechnet wird - die Normalmap brauche ich für die richtige Beleuchtung der Landschaft. Wenn man jetzt die Höhe vom Mittelpunkt dieses Dreiecks mit der Höhe von den Eckpunkten vergleicht, kann man eine Realtime Curvature Map berechnen - die ist für schöne Schneebedeckte Bergspitzen und saftig grüne Täler. Die Steigung der Normalen wird auch noch dazu berechnet um Felsen an Steilwänden zu erzeugen und die Wälder an solchen Stellen auszumaskieren. Hier mal eine kleiner Debug Ansicht davon: Der ganze Landschaftsshader ist dann doch sehr groß - es gibt eine Art "Fake"-Erosion, damit die Felsen schick aussehen und eine riesige Anzahl Noises um die Sandstrände, Schneeverteilung, Wälderfarben, Meereswellen etc. zu erzeugen. Das ist aber nur die Landschaft! Es gibt auch noch die dunkle, zerglitchte Welt mit dem selben Setup, aber eben anderen erzeugten Effekten. Da sich das Spiel ja um das Fangen und Verbinden von Natur-Fragmenten dreht sollte diese "Verbindungs-Interaktion" etwas ganz besonderes werden und dem Spieler das visuelle Feedback geben, etwas richtiges getan zu haben. Mithilfe eines Voronoi Effekts habe ich die ganzen Natur-Teile sich miteinander verbinden lassen - jedes Natur Objekt kann sich über einen Shader so hin morphen, dass es in seine umgebenden Voronoi Positionen passt. Das erzeugt einen sehr coolen, snappy Effekt als ob man ein passendes Puzzlestück gefunden hat. Solltet ihr in zwei Wochen zufällig in Stuttgart sein könnt ihr gerne auf der FMX Conference 2018 vorbeischauen, wo das Spiel öffentlich präsentiert wird und dann auch tagsüber spielbar ist. Wenn nicht - ich versuche gerade Museen und Ausstellungen ausfindig zu machen, die sich für so ein Exponat interessieren könnten. Wenn ihr da Ideen habt, schreibt mir doch gerne! Zum Abschluss noch zwei schöne Making Of Bilder Vielen Dank fürs Lesen & ich freue mich auf Fragen und Feedback!

Announcements

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

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...