Jump to content
Unity Insider Forum

Leaderboard


Popular Content

Showing content with the highest reputation since 07/17/2019 in all areas

  1. 4 points
    @appo Nö. Ich nehm nix zu ernst. Mir war egal, warum du so angepisst warst und wie viel der Handhabung du überhaupt schon weißt. In deinen weiteren Texten konnte ich aber erkennen, was dir nicht klar ist und deswegen habe ich ( obwohls mir relativ egal ist) mal ein Tutorial gemacht. Das könnte dir weiter helfen. Und nicht nur bei dem "wie" sondern auch bei dem "warum"!
  2. 3 points
    Moin zusammen! Nach etwa einem Jahr Arbeit (mit Pausen... ) kann ich mein neues Asset Store-Paket vorstellen! Es handelt sich dabei um eine stark weiterentwickelte Implementation der Konzepte, die in diesem Talk vorgestellt werden: Um es kurz zu fassen: Damit könnt ihr extrem saubere Architekturen bauen, doch der Kniff ist: Ihr arbeitet hier mit Unity und nicht dagegen an. Das Paket ersetzt keine von Unitys Funktionalitäten, es gibt kein "das kannst du jetzt so nicht mehr benutzen". Es wird ausschließlich erweitert, was schon da ist. Ich sag mal so... ich arbeite nicht mehr ohne, seit ich das Ding für meine eigenen Projekte gebaut habe. Falls ihr euch jetzt fragt, wie das geht... ich könnte erstmal eine Menge schreiben, aber schaut euch besser den Talk an, der ist hervorragend. Hier geht's zum Paket: https://assetstore.unity.com/packages/tools/integration/soda-scriptableobject-dependency-architecture-137653 Bei Fragen gerne fragen!
  3. 3 points
    Willst du irgendwie Hilfe oder wolltest du einfach nur ne Runde Dampf ablassen? Ich hoffe, du hast dir vor dem Update den Text im Fenster durchgelesen, der dir sehr deutlich sagt, dass du kein Update machen sollst, ohne vorher ein Backup deines Projekts zu erstellen.
  4. 2 points
    Fein! Poste ruhig hier auch mal ab und zu, nicht nur aufm ollen Discord!
  5. 2 points
    Ich arbeite übrigends immer noch an dem Projekt 😅. Die meisten Updates poste ich allerdings nur noch auf meinem Discord Server Discord: https://discord.gg/8khMMPW
  6. 2 points
    Eine Klasse ist ein Stück Code, das als Bauplan für Objekte funktioniert. Ein Objekt ist dann ein Ding im Speicher, das spezifische Werte für alle Zustandsfelder (=Variablen außerhalb von Methoden) speichert. Nehmen wir mal eine Beispielkomponente: public class Dingsbums : MonoBehaviour { public Color color; } Sie hat ein Zustandsfeld "color". Ich ziehe einfach mal zwei davon auf ein GameObject: Was du hier repräsentiert siehst, sind zwei Objekte. Eines mit einer roten Farbe für "color" und eines mit einer blauen Farbe. Beides sind Instanzen derselben Klasse "Dingsbums". Und selbst, wenn sie die gleiche Farbe hätten, wären es immer noch zwei verschiedene Objekte. Wenn du also ein Script auf ein GameObject ziehst (oder auch eine beliebige andere Komponente hinzufügst), dann repräsentiert dieser Abschnitt im Inspektor ein neues Objekt, das du gerade erstellt hast. Und die Felder und Funktionen die es hat entsprechen dem, was die zugrundeliegende Klasse vorgibt. Jetzt sind aber Komponenten nicht die einzige Art von Objekten, die es gibt. GameObjects sind auch Objekte der Klasse "GameObject". Jedes einzelne deiner Assets wird von Unity als Objekt interpretiert. So ist deine Grafik ein Texture2D-Objekt und deine Sound-Datei kommt als AudioClip-Objekt an. Kommt ganz auf die Art deines Objekts an. Ein AudioClip ist bereits automatisch von Unity mit den Sound-Daten gefüllt, weil Unity die Sound-Datei lädt. Eine Komponente ist mit den Daten gefüllt, die du im Inspektor einstellst - die lädt Unity dann beim Szenenstart (oder beim instanziieren eines Prefabs). Wenn dein Objekt kein "UnityEngine.Object" ist (wie z.B. Komponenten es sind), dann lädt Unity dir gar nichts. Dafür kannst es mit Code selber zusammenbasteln. Ich könnte da kurz drauf eingehen, wie das aussehen kann, aber ich denke, ich beschränke mich lieber auf das, was ich auch empfehlen würde... wird nämlich schon ein bisschen viel auf einmal. Stattdessen, probiere mal ScriptableObjects aus. Packe dir dieses Script in deine Assets: using UnityEngine; [CreateAssetMenu] public class Sword : ScriptableObject { public int price; public int strength; public int speed; } Da sind jetzt zwei neue Sachen: Die Klasse erbt von "ScriptableObject" statt von "MonoBehaviour". Damit ist es keine Komponente mehr. Du wirst feststellen, dass du dieses Script nicht auf ein GameObject ziehen kannst. Das Attribut [CreateAssetMenu] fügt diese Klasse zum "Create"-Menü deiner Project View (und dem Menüpunkt "Assets" ganz oben links) hinzu. Speichere die Datei und lass Unity kompilieren. Als nächstes kannst du mitten in deine Assets rechtsklicken, dann gehst du auf "Create" und solltest ganz oben "Sword" finden. Wenn du da draufklickst, erstellst du wieder ein neues Objekt vom Typ "Sword", aber nicht als Komponente auf einem GameObject, sondern als Asset in deinem Projekt. Das kannst du jetzt anklicken, einen Namen geben und wie eine Komponente im Inspektor bearbeiten. Und du kannst es in andere Objekte reinziehen, um es zu referenzieren. Zum Beispiel kannst du eine Shop-Komponente basteln, indem du ein Array von Schwertern anlegst, die zum Verkauf stehen: public class Shop : MonoBehaviour { public Sword[] swordsForSale; } Da kannst du alle Schwerter in die Liste ziehen, die der Laden im Angebot haben soll. Deine Datenbank, die du haben willst, besteht dann aus lauter einzelnen Objekten, die du in deinen Assets einzeln anklicken und bearbeiten kannst. Punktnotation! Mal so als Beispiel könnte man die Schwerter des Shops alle in einer Start-Methode auflisten: private void Start() { foreach (var sword in swordsForSale) { Debug.Log(sword.name + ": " + sword.price + " gold"); } } Auf "strength" und "speed" kannst du genauso zugreifen wie auf "price". Das gilt natürlich für alle weiteren Felder, die du der Sword-Klasse gibst, solange sie "public", also öffentlich sind. Du schreibst direkt vorher: In dem Moment, in dem du das zweite Script auf ein GameObject gezogen hast, hast du wie gesagt bereits eine Instanz erstellt. Durch das Ziehen in den Inspektor des ersten Scripts hinterlegst du lediglich eine Referenz, die dem einen Objekt sagt, wo es das andere im Speicher finden kann. Allgemein gilt zum Problem "wie mache ich, dass Objekt A Objekt B kennt" zu sagen, dass viele Wege nach Rom führen, und jede Variante hat ihre Vor- und Nachteile. Da jetzt ins Detail zu gehen, würde extrem zu weit führen. Du wirst jahrelang immer neue Varianten kennenlernen, diese Frage zu beantworten. Ich benutze Unity jetzt seit zehn Jahren und habe das letzte Jahr an einem Asset-Store-Paket gearbeitet, das ich vor kurzem veröffentlicht und hier vorgestellt habe. Dabei geht's genau um diese Frage, und seit ich das zugrunde liegende Video geschaut habe (siehe Link) und das Ding implementiert habe, arbeite ich niemals mehr ohne. Damit läuft bei mir alles wesentlich besser, und trotzdem bin ich neun Jahre lang ohne ausgekommen Daher eins nach dem anderen, und für die erste Zeit gilt auf jeden Fall: Solange es funktioniert, ist es schonmal gut. Und sobald du selber Probleme bemerkst und dich fragst, ob das eventuell an der Herangehensweise liegt, sag Bescheid
  7. 2 points
    Achso das kann sein, wir arbeiten noch mit der 5.6 Joa, würde ich auch so schreiben. Am performantesten ist es nicht, aber am einfachsten, wenn man keine Ahnung von Modeln usw. hat.
  8. 2 points
    SRY Aber ich muss das jetzt einfach mal so sagen. Anscheinend hast du dich noch nicht wirklich mit programmieren auseinander gesetzt. Durch stures Copy&Paste wirst du auf dauer nicht weit kommen. Schau dir am besten erstmal die C# Grundlagen an. Dann solltest du deinen fehler auch selbst erkennen.
  9. 2 points
    Na, dann will ich auch mal wieder was hier rein Posten. Hab's eben fertig gemalt. Das Crypt wird das Hauptelement in meinem neuen Flipper werden der Ghouls heißen wird. Natürlich habe ich es so low poly wie möglich gebaut. Aber gute 2000 Polys sind es dann doch geworden. Die Textur ist 2048x2048 groß und komplett handgemalt. Das hat ein wenig gedauert, war aber ne gute Übung.
  10. 1 point
    Da gibt's verschiedene Varianten. Statt deine Texte in deine Methode einzubauen, kannst du auch direkt die strings übergeben: private IEnumerator DoMonologue(string[] texts, float delay) { var wait = new WaitForSeconds(delay); textComponent.text = texts[0]; for (var i = 1; i < texts.Length; i++) { yield return wait; textComponent.text = texts[i]; } } Auf lange Sicht kannst du auch eine Klasse für Monologe oder Dialoge schreiben, und die stattdessen da rein tun. Da kannst du dann beliebig schick werden und verschiedenste Erweiterungen einbauen. Sei es unterschiedlich lange Zeiten pro Satz oder ein wechselndes Charakter-Portrait je nach Situation. P.S. Du kannst deinen Code auch so lesbar machen, und zwar mit dem <>-Knopf
  11. 1 point
    Moin, es ist einfacher, den Code der ganzen MonoBehaviour zu posten, damit man ein Bild vom Code bekommt. Aber was Du möchtest, sollte eigentlich so ähnlich lösbar sein: //über der klasse einbinden, damit man IEnumerator nutzen kann using System.Collections; //... private WaitForSeconds waitForSeconds = new WaitForSeconds(1f); void Start() { //irgendwo musst du die Coroutine starten StartCoroutine(Test()); } IEnumerator Test() { yield return waitForSeconds; //IEnumerator erwartet einen Rückgabetypen, dieser wartet eine Sekunde //dein text = neuer text } //...
  12. 1 point
    Ich nehme mal an, Doppler-Effekt hast du schon ausgestellt? Ansonsten, wenn man das mit Einstellungen nicht einfach lösen kann, würde ich versuchen, eine kleine Audio-Szene zu bauen: Einen AudioListener am Nullpunkt und AudioSources in der Nähe, deren Position (und Vorhandensein) von Scripts gesteuert werden, die AudioSources ersetzen und sich dort befinden, wo die Source eigentlich wären. Wenn das nicht so richtig hinhaut oder nicht schön genug umsetzbar ist, könnte man auch überlegen, Unitys Soundsystem links liegen zu lassen und ein anderes zu nutzen, FMOD oder so. Da hättest du dann über solche Dinge mehr Kontrolle.
  13. 1 point
    CSteamID other_SteamID = new CSteamID(ulong.Parse(p.UserId)); Oder, falls du bei der Fehlerbehandlung Exceptions vermeiden willst: if (ulong.TryParse(p.UserId, out var userid)) { CSteamID other_SteamID = new CSteamID(userid); } else { Debug.LogError("oh no"); }
  14. 1 point
    Hallöchen! Time.deltaTime ist eine krumme Angelegenheit, da der Rechner da im Bereich von Sekundenbruchteilen die Zeit zwischen zwei Frames misst. Und die hängt von lauter Faktoren ab, je nach dem, wieviel deine Kiste sonst gerade so macht. Du kannst also Je nach Framerate problemlos über das Ziel hinausschießen. Je niedriger die Framerate, desto weiter kannst du im schlimmsten Fall gehen. Deswegen willst du die Position genau setzen, sobald die Bedingung dafür erfüllt ist: if (MoveDirection == Cubespawner.MoveDirection.L) { if (transform.position.x < 0) // Beachte: Kleiner-als statt kleiner-gleich { transform.position += transform.right * Time.deltaTime * MoveSpeed; if (transform.position >= 0) { var pos = transform.position; pos.x = 0; transform.position = pos; } } }
  15. 1 point
    Kommt drauf an, welche Auflösung das Quadrat hat. Hätte es 100 Pixel Höhe und Breite, würde es bei den eingestellten 100 Pixels Per Unit eine mal eine Einheit groß sein. Am Grid im ersten Screenshot sieht man, dass das Quadrat aber etwas größer ist, deswegen nehme ich an, dass das Bild 128x128 Pixel groß ist, und das Quadrat daher 1.28x1.28 Einheiten. Wenn du jetzt willst, dass das Quadrat 1x1 Einheit groß wird (und das ist immer eine ganz gute Idee), dann musst du die PPU auf 128 stellen. Vorausgesetzt, ich habe richtig geraten.
  16. 1 point
    Hallo zusammen, mein Name ist Dirk und ich bin gerade über dieses Forum gestolpert. Ich wusste gar nicht das es ein deutsches Unity Forum gibt. Ich habe auch nie wirklich danach gesucht weil ja alle immer englisch reden. 😂 Ich bin Softwareentwickler und arbeite in meiner Freizeit an einem Spiel das ich mit Unity entwickel und das hoffentlich irgendwann mal fertig ist. 😳 Vor 3 Jahren habe ich mich wieder entschieden mir der Spieleprogrammierung anzufangen und bin dann bei Unity gelandet, weil ich gesehen habe wie die die Engine vorantreiben und natürlich weil Joachim für mich das verkörpert was einen echten Entwickler ausmacht. 😋 Außerdem sind es Spiele die mich vor Urzeiten zum Programmieren gebracht haben. Spiele programmieren ist für mich eine schöne Abwechlung zur alltäglichen Datenschupserei im Job.
  17. 1 point
    Müsste sowas nicht funktionieren? private void ActivateScene(string sceneName, bool activate) { var scene = UnityEngine.SceneManagement.SceneManager.GetSceneByName(sceneName); foreach(var go in scene.GetRootGameObjects()) { go.SetActive(activate); } }
  18. 1 point
    Also es ist ja so, dass du irgendwo deine Listen abarbeiten musst. Ob das nun direkt in einer Methode ist oder woanders, ist erst einmal egal. Ich persönlich würde es aber nicht innerhalb der Methode machen, in die der Button etwas sendet. Die Methode dient ja lediglich dazu, zu registrieren, dass ein UI Element etwas gemacht hat. Du kannst da einfach eine Variable verändern, die ein anderer Codebereich für die Listenabarbeitung nutzt. Das würde das Ganze übersichtlicher machen, denn die Buttons wären aus der Verarbeitung dann einfach heraus genommen. Aber wie gesagt; irgendwo musst du duch die Listen gehen. Entscheide selbst und lerne dabei ob es gut war oder eher nicht. Ich selber verändere ständig meine Herangehensweise bei neuen Projekten denn ich habe auch noch keinen goldenen Weg gefunden. Aber es wird jedes Mal besser!
  19. 1 point
    Willkommen! Schön, dass du uns gefunden hast.
  20. 1 point
    Das könnte passieren. 😉 Wie ich sehe bist du auch Hamburger. 😎
  21. 1 point
    Wieso müssen das die Buttons wissen? Geh doch mal anders an die Sache heran: Stell dir mal vor, die Buttons wären Leute in einer Fabrik, die einer Tätigkeit nachgehen. Die bearbeiten einfach ein Dingen nach Vorgabe, egal was später daraus wird. So ist das auch bei den Buttons. Jeder Button warten nur auf einen Klick um dann in eine definierte Methode rein zu springen. Was da drin passiert, kann den Buttons total egal sein. Innerhalb der Methode, wird ausgewertet was als nächstes passiert und ob überhaupt etwas passiert. Denn dort, oder in dem Script der Methode, ist ja klar, welche Liste gerade genutzt wird. Ob ein Button jetzt aktiv ist, und/oder welche Erscheinung er haben soll, könnte der Button für sich selber in Erfahrung bringen. Das kann aber auch von Außen gesteuert werden. Das ist eine Sache der Vorliebe und hängt davon ab, wie viele UI Objekte sich verändern sollen. Wenn du also den Kaufbutton disablen willst, wenn nicht genug Geld für das angezeigte Objekt da ist, könnte der Button eine Variable abfragen oder auf ein Event warten. Es kann aber genau so gut ein Verwaltungsscript den Button disablen bzw. enablen wenn die richtige Bedingung eingetreten ist. Außerdem: Buttons sind auch nur Gameobjects. Du kannst sie also einem EmptyObject unterordnen und dieses dann Aktivieren oder deaktivieren. Wenn der Vater deaktiviert wurde, sind die Kinder auch deaktiviert. So kannst du ganz leicht komplette Gruppen innerhalb eines Canvas ein- oder aussschalten. Oder auch einfach wo anders positionieren.
  22. 1 point
    Das ist so eine Sache, wo ich selber noch nie "die" Lösung gesehen habe, und ich gehe davon aus, dass es die auch nicht gibt. Gibt also für alles Vor- und Nachteile. Was recht üblich ist, ist deine Computerszene additiv zu laden. Das bedeutet, dass die vorherige Szene nicht entladen wird, sondern bleibt. Dann kannst du ihre Inhalte manuell deaktivieren, irgendwann die additive Szene entladen und die andere wieder aktivieren. Das Deaktivieren und Reaktivieren der ersten Szene ist hier das problematische. Ich habe gerade noch einmal nachgeschaut... es scheint nach wie vor keinen Weg zu geben, Szenen zu deaktivieren. Du müsstest also sowas machen wie die gesamte Szene einem GameObject unterzuordnen und dann dieses zu deaktivieren. Alternativ kannst du einfach die zweite Szene lassen und stattdessen z.B. ein Prefab instanziieren. Dabei hast du natürlich dasselbe Problem, dass der Rest der Szene irgendwie auf Pause gesetzt werden muss.
  23. 1 point
    Du benutzt nicht den Namen des Schwertes als Schlüssel, sondern das Schwert selbst. Du kannst deshalb sämtliche Eigenschaften des Objekts ändern, denn dadurch geht dessen Identität nicht verloren. Warum solltest du die Reihenfolge der Elemente in einem Array nicht ändern können? Brauchst nur eins. Dann du kannst einfach nachschauen, ob ein bestimmtes Schwert überhaupt als Schlüssel drinsteht. Wenn nicht, ist das Schwert offenbar nicht freigeschaltet. Edit: Ach ja, wegen des Menüs: Da hatte ich reingeschaut, aber da wäre etwas mehr Aufwand für mich, mich da reinzufuchsen, und da habe ich bisher keine Zeit zu gehabt. Generell hilft es, ein Problem ein kleinstmögliche Teile runterzubrechen, und sich dann bei den kleinen Problemen helfen zu lassen, als bei einem großen
  24. 1 point
    Damit können Instanzen anderer Klassen den Wert dieser Variablen (ich bleibe jetzt mal bei dem Namen...) zwar ansehen, aber nicht ändern. Das ist ein Konstruktor. Der wird beim Erstellen eines Objekts dieser Klasse ausgeführt. Da dieser Konstruktor einen Parameter hat, kann man kein Objekt erstellen, ohne da einen Wert zu übergeben, siehe new SwordInstance(swordClass) Da hast du einen guten Punkt. Dann lass mich dir eine andere Variante vorschlagen: Ein Dictionary. Weiß nicht, ob du das kennst, aber ein Dictionary ist ähnlich einer Liste, aber anstatt lauter Dinge in einer Reihenfolge 0, 1, 2, 3, ..., n gelistet zu haben, werden hier Werte ihren Schlüsseln zugeteilt. Wie ein Wörterbuch eben: Du kannst nach einem Wort (Schlüssel) suchen und dann die Übersetzung (dazugehöriger Wert) anschauen. So kannst du auch dein Schwert als Schlüssel verwenden und der dazugehörige Wert ist eine Zahl. private Dictionary<Sword, int> swordPurchases = new Dictionary<Sword, int>(); swordPurchases[theSwordThatWePicked] += 1;
  25. 1 point
    Zu meinem Network System zeige ich hierwie ein ServerLogic bei meinem Networksystem, mit einem Chatserver Beispiel, funktioniert:
  26. 1 point
    Gibt da verschiedene brauchbare Varianten, aber lauter Listen, die eine versteckte semantische Verbindung haben, dass Werte mit demselben Index zusammengehören, ist keine davon. Du möchtest in jedem Fall Objekte haben und dann eine Liste dieser Objekte, ob das jetzt ScriptableObjects sind oder nicht. Du kannst z.B. eine neue Klasse SwordInstance anlegen, die irgendwie so aussehen könnte: public class SwordInstance { public Sword swordClass { private set; get; } public int someVariableData; public SwordInstance(Sword swordClass) { this.swordClass = swordClass; } } Wenn du dann deinen Laden hast und du kaufst davon ein Schwert, dann erstellst du eine neue Instanz dieses Schwerts. Das ScriptableObject enthält nur die immer gleichbleibenden Daten, während die SchwertInstanz neben der Referenz auf die Schwert-Klasse die ganzen variablen Daten enthält. public void BuySelectedSword() { var swordClass = swordsForSale[displayIndex]; playerInventory.AddSword(new SwordInstance(swordClass)); } Da gibt's dann wieder neue offene Fragen, wie man das baut, aber... so als Beispiel dafür, wie du ScriptableObjects mit dynamischen Laufzeitdaten kombinieren kannst.
  27. 1 point
    Die anderen Variablen sind Teil von Komponenten, auf GameObjects, in einer Szene. Szenen werden beim Spielstart bzw. während des Spielverlaufs geladen und dann irgendwann, spätestens beim Shutdown des Programms, wieder zerstört. Der Zustand einer Szene, vom Vorhandensein eines GameObjects bis hin zu jeder kleinen Eigenschaft jeder Komponente, wird nicht gespeichert, sondern neu aus der Szenendatei geladen, wenn du den Play Mode beendest. Ist ja auch logisch: Du willst nicht deine Spielfigur nach jedem Test wieder manuell auf Anfang zurückschieben. ScriptableObjects (so wie wir sie hier benutzen) sind allerdings sind nicht Teil deiner Szene, sie existieren in den Assets, neben deinen Texturen, Sounds und 3D-Modellen. Wenn du im Play Mode z.B. ein Material änderst, dann bleibt das auch nach dem Beenden des Play Modes so. Und das gilt halt auch für ScriptableObjects. Wenn die Frage kein direkter Follow-Up zum eigentlichen Thema ist, mach gerne ein neues Thema dafür auf. Gerne auch mehrere auf einmal wenn du mehrere (unzusammenhängende) Fragen hast
  28. 1 point
    ScriptableObjects eignen sich erstmal am besten für Daten, die einfach nur geladen werden, sich dann im Spielverlauf aber nicht ändern. Bei meinem ScriptableObject-basierten Paket können die das zwar, dass sie sich wieder zurücksetzen, aber das ist keine ganz einfache Sache gewesen. Es ist daher eher eine Idee, die ScriptableObjects ausschließlich für konstante Daten zu benutzen und dann andere Objekte für die dynamischen Daten zu nehmen. Es sei denn natürlich, du brauchst keine serialisierten Startwerte. Also, sprich: Du brauchst keine Startwerte im Editor eingeben, dann kannst du Variablen auch einfach komplett aus Unitys Händen nehmen. Wenn deine Variable öffentlich sein soll, kannst du dieses Attribut drübersetzen: [System.NonSerialized] public int amount = 0; Falls da jetzt ein paar offene Fragen zu dem Thema sind, hilft vielleicht das hier: http://blog.13pixels.de/2019/an-intro-to-serialization-in-unity/
  29. 1 point
    Einmal das Fenster erstellen und es für alle Items immer wieder benutzen klingt sehr gut. Du kannst das so machen, dass du die UI-Elemente, die die Daten des Items anzeigen, referenzierst (wieder mit reinziehen) und dann deren Eigenschaften (Text, Bildinhalt, ...) mit denen des Sword-ScriptableObjects überschreibst, sobald du wechselst. Könnte zum Beispiel so aussehen: public Text nameDisplay; public Text priceDisplay; public Text speedDisplay; public Image itemGraphicDisplay; public Sword[] swordsForSale; // The index of the currently displayed sword private int displayIndex = 0; private void Start() { UpdateDisplays(); } // Das hier muss der "Next"-Button auslösen public void DisplayNext() { displayIndex++; if (displayIndex >= swordsForSale.Length) { displayIndex = 0; } UpdateDisplays(); } // Das hier muss der "Previous"-Button auslösen public void DisplayPrevious() { displayIndex--; if (displayIndex < 0) { displayIndex = swordsForSale.Length - 1; } UpdateDisplays(); } private void UpdateDisplays() { var sword = swordsForSale[displayIndex]; nameDisplay.text = sword.name; priceDisplay.text = sword.price + " Gold"; speedDisplay.text = sword.speed + ""; itemGraphicDisplay.sprite = sword.graphic; } In die Displays oben ziehst du die richtigen Objekte, dann gibt's wieder die Liste an Schwertern, wo du alle Schwerter reinziehst. Dann verkabelst du noch die Buttons mit den richtigen Methoden. DisplayNext und DisplayPrevious machen nichts weiter als hoch- und runterzählen, aber wenn der index am Anfang oder am Ende vorbei geht, fängt's an der jeweils andere Seite wieder an. Dann wird UpdateDisplays aufgerufen, welches das Schwert mit dem aktuellen Index aus dem Array holt und dessen Werte in die UI-Elemente stopft.
  30. 1 point
    Modifikationen für Module stehen zwar auf der ToDo Liste, aber noch sehr weit unten. Der Kampf ist aktuell bewusst noch sehr rudimentär und ohne großartigen Feedback gehalten. Hier ist der Link zu einem Eintrag wo ich schon deutlich mehr Sachen drin hatte, was aber einfach bei der Umstellung von XNA auf MonoGame und jetzt auf Unity verloren gegangen ist. http://bradley-labs.de/2015/04/19/space-opera-release-090/ Ziel ist es auch von der statischen Ansicht, auf eine tatsächliche Gefechtskarte zu wechseln: Auch das gab es mal als Prototyp in einer vorgehenden Inkarnation. Was der Ressourcen Abbau angeht, auch der ist 'noch' bewusst reduziert gehalten. Hier in dem Video hatte ich mal vorgestellt, was ich mir mit den Ressourcenabbau vorgestellt habe:
  31. 1 point
    Achso, hätte ich echt das Häckchen nicht sofort gesehen, für mich sah es mehr als eine leere erweiterbare Modifikation für eine Waffe als nach Waffe Aktivierung aus Da musst du bischen nachbessern. Mich störte zudem, dass es irgendwie zu wenig Feedback vom Kampf kommt. Und die Gegner erscheinen viel zu oft, dass man schnell Motivation verliert zu kämpfen und mit dem Rückzug verliert man dann mehr Schildstärke. Ah ja, ist das normal, dass man an einem Punkt (unendlich?) oft Ressourcen rausnehmen darf? Und wenn ich mehrmals einen Punkt scanne, dann erhalte ich jedes mal andere random Werte.
  32. 1 point
    Exakt, bis auf eine Kleinigkeit: Das ist meiste ist nichts Unity-spezifisches, dass alles und jeder ein Objekt ist, ist normal bei objektorientierten Sprachen wie C#. Das GameObject/Komponenten-System gehört da schon nicht mehr zu, ist aber auch nichts, was Unity erfunden oder patentiert hätte Von Performanceproblemen kann hier so oder so nicht die Rede sein, aber ich empfehle, das ganze so aufzubauen, dass dein Code nicht zu einer großen Portion Spaghetti wird. Und dafür ist es sinnvoller, auf dem Button zu definieren, was der Button macht, als irgendwo anders eine Abfrage einzuführen. Du könntest einem Script zwei Methoden geben: "ShowSwords" und "ShowShields", und dann ruft der eine Button die eine Methode auf und der andere die die andere.
  33. 1 point
    Hi! Weder, noch. Bitte benutze Objekte dafür. Also statt int[] prices; int[] strengths; int[] speeds; einfach class Sword { public int price; public int strength; public int speed; } und dann Sword[] swords; Damit sind deine Werte schön innerhalb von einem Schwert gruppiert, anstatt dass da eine unsichtbare Verbindung zwischen deinen Zahlen verschiedener Arrays besteht, die einzig durch denselben Index in den Arrays definiert ist. Wenn du deine Schwert-Klasse jetzt noch von ScriptableObject erben lässt und ein nettes Attribut draufknallst, kannst du deine Schwerter sogar schön im Editor als Assets erstellen und anpassen. Grundregel für Performance: Nicht lange fackeln, sondern ausprobieren und daran herumschrauben, wenn es sich als Problem herausstellt. Wegen güffeliger 30 Abfragen in Update braucht kein modernes Handy überhaupt den Ofen anschmeißen. Wenn du dann doch etwas feststellst, hilft dir der Profiler beim identifizieren von Problemquellen. Aber ernsthaft, mach dir da bitte keinen Kopf. Jeder noch so krüppelige Handyprozessor knallt dir heutzutage problemlos zehn- bis zwölfstellig Operationen pro Sekunde raus. Ein deaktiviertes GameObject bedeutet, dass alle seine Komponenten inaktiv werden. Das gilt natürlich auch für den Renderer. Im Gegensatz zu "enabled = false;" werden bei "SetActive(false)" aber auch alle laufenden Coroutinen gestoppt. Was aber nicht darunter fällt ist, dass man mit Objekten interagieren kann. Die Komponenten kriegen keine MonoBehaviour-Events mehr (Start, Update, ...), aber wenn dein Code zu dem Objekt geht und eine Methode aufruft, dann wird die nach wie vor ausgeführt. Nicht wirklich. Wenn du in deinem Code Typ name schreibst, dann deklarierst du eine Variable. Das ist ein kleines Stück Speicher, in dem ein Wert drinstehen kann. Ist "Typ" z.B. "int", dann steht in diesem Speicherbereich eine Zahl. Welche Zahl da drinsteht, kannst du mit einer Zuweisung ändern. int zahl; zahl = 10; Wenn aber "Typ" ein Objekttyp ist, also der Name einer Klasse (z.B. einer Komponente), dann steht in diesem Speicherbereich die Position eines Objekts dieses Typs, die sogenannte "Adresse", oder der Wert für "null", also "kein Objekt". Wenn du also "Timescript DataTiemscript" schreibst, dann reservierst du einen kleinen Speicherbereich, um darin die Adresse eines "Timescript"-Objekts irgendwo anders im Speicher einzutragen. Aber es wird kein "Timescript"-Objekt erstellt, und ohne weiteres Zutun steht da nicht einmal eine Adresse drin. In Unity hast du halt die Eigenart, dass du im Editor in ein solches Feld ein Objekt einfach mit der Maus reinziehen kannst. Ich bin mir recht sicher, dass du das auch schon gemacht hast. Du ziehst also dein GameObject mit dem "Timescript"-Script in dein Feld und speicherst die Szene. Das ist sehr vergleichbar damit, zahl = 10; zu schreiben, also eine Zuweisung. Bemerke, dass du aber das GameObject vorher selbst erstellt hast, und dass du auch dein Timescript da draufgezogen hast. Das ist der Moment, wo das Objekt erstellt wurde. "Timescript DataTiemscript" erstellt halt nur die Variable.
  34. 1 point
    Moin... sorry für die späte Antwort, hab deinen Post irgendwie übersehen... Dafür würde ich ein Event anlegen. Eben weil das Springen der Fische kein Teil der Definition der Spielfigur ist. Die Figur funktioniert bestimmt auch einwandfrei, ohne dass da irgendwo definiert ist, was ein Fisch ist. Und auch wenn es keine Fische in der Szene gibt. Und was das Springen der Fische angeht: Was das auslöst, ist auch kein Teil der Definition eines Fisches. Das Springen könnte ja auch genausogut von etwas anderem ausgelöst werden. Anders wäre es, wenn du da mehr Semantik im Fisch-Sprung hättest. Wenn nur Fische in einem bestimmten Radius um den Spieler springen sollen, oder wenn rote Fische auf den einen Spieler und blaue Fische auf den anderen reagieren sollen... da kann man sich das nochmal überlegen, das anders anzugehen. Ich hab's gerade einfach mal hochgeladen: http://13pixels.de/pages/assetstore/soda/documentation/annotated.html
  35. 1 point
    Zunächst möchte ich mich mal ordentlich entschuldigen - da hat Sascha vollkommen recht - das dumme Genöle von mir bringt natürlich gar nichts ! Ich hatte eine sch.... Tag und dann noch die Errors....... Nachdem ich alles gelöscht und mich etwas beruhigt hatte Gehirn eingeschaltet und das Ganze von vorne: Hub installiert, die letzte 18er Version wieder installiert, Altes Projekt geöffnet, (war noch auf Festplatte) auch hier wieder einige Errors - div. Assets (AQUAS Water !!) reloaded, Projekt geschlossen - Projekt geöffnet VOILA - ALLES GEHT WIEDER !!! Mit der 19er warte ich noch.
  36. 1 point
    @Lenny Mach gerne dein eigenes Thema auf, anstatt eins von vor fast sechs Jahren rauszukramen
  37. 1 point
    Frag einfach drauflos!
  38. 1 point
    Da gibt's lauter Sachen, die alle mehr oder weniger wichtig sind oder mehr oder weniger die Funktion verändern. Das geht los bei so Sachen wie der Klammersetzung - die öffnenden geschweiften Klammern werden in C# in der Regel in die nächste Zeile gepackt, also: if ( ... ) { // Code statt if ( ... ) { // Code Aber hier geht's um die Lesbarkeit und ist darüber hinaus im Zweifelsfall auch Geschmackssache. Konsistenz ist hier wichtiger als eine der beiden Varianten für sich genommen. Ist ja aber auch nur ein Beispiel für die Kleinigkeiten, an denen man schrauben könnte. Wenn man sich wichtigere Sachen anschauen will, sollte man auf jeden Fall nicht in "richtig" oder "falsch" denken. Du musst dir bewusst machen, was du genau willst, und dann genau das implementieren. Zum Beispiel wird hier Vector3.MoveTowards benutzt. In diesem Kontext bedeutet das eine gleichbleibende Geschwindigkeit bis zum Ziel. Du könntest den Code dahingehend abändern, dass die Figur erst schnell ist, und dann immer langsamer wird, je näher sie dem Ziel kommt. Oder dass sie von 0 auf "speed" beschleunigt, wenn sie losläuft. Und natürlich besonders interessant wird es, wenn deine Figur nicht mehr durch Wände laufen können soll. Um auf dieser Ebene etwas zu verändern, musst du von jeder Zeile, von jedem Teil jeder Zeile wissen, was er tut. Dann kannst du diese Teile abändern, unnötiges wegnehmen oder neue Features hinzufügen. Von daher gilt auf jeden Fall: Wenn du Code findest - auch wenn er sofort und problemlos funktioniert - stelle sicher, dass du ganz genau verstehst, warum. Bei Fragen in dieser Hinsicht sind wir auf jeden Fall für dich da! Zum Schluss noch: Wenn dein Code genau das tut, was er soll, ist der nächste Schritt, gute "Code-Qualität" zu haben. Damit ist gemeint, dass dein Code nicht nur richtig funktioniert, sondern noch einige zusätzliche Merkmale erfüllt, wie z.B. Lesbarkeit oder Robustheit. Lesbarkeit ist dafür da, dass andere Leute verstehen können, was dein Code macht, ohne den eine Woche lang zu studieren. Unterschätze nie den Wert davon: Wenn du selber nach ein paar Monaten deinen Code wieder anschaust und er ist nicht sonderlich lesbar, dann kannst nicht einmal du selbst mit diesem Code weiterarbeiten... es sei denn, du arbeitest dich superlange wieder ein . Aber... wie gesagt, das kommt später, wenn dein Code genau das tut, was er soll.
  39. 1 point
    TextMeshPro ist doch jetzt Standartmäßig drin. Am besten du suchst dir die Textur und machst dort deine schrift drauf. Ist denke ich am performantesten (wird das so geschrieben?🤯).
  40. 1 point
    Entweder das, was @malzbie schreibt, oder ein Decal Asset benutzen (eine andere Textur, also die Schrift, auf das Auto "legen"), oder mit Unity UI ein 3D Canvas basteln und auf das Auto packen oder das gleiche mit TextMeshPro (freies Asset aus dem Store). Ob das performancetechnisch sinnvoll ist, kommt drauf an.
  41. 1 point
    Phase 1 von Space Opera ist abgeschlossen und auch die WebGL Version des Nightlybuilds ist so umgestellt worden das er wieder spielbar ist. Zeit einen Blick auf Phase 2 zu werfen: Englisch und Deutsche Lokalisation Dazu brauche ich eigentlich nicht viel zu sagen. Space Opera soll in mindestens 2 verschiedenen Sprachen spielbar sein. Da ich hier das Rad nicht neu erfinden will, habe ich nach einer einfachen Lösungen gesucht. Die Lösung habe ich hier gefunden: https://youtu.be/yHOV9Jyyrrc Letztendlich reduziert sich das ganze auf eine Fleißarbeit. Gefechtsmanöver Die aktuellen Gefecht sind noch sehr sehr statisch. Der erste Schritt um das aufzubrechen, wird das Einführen von Gefechtsmanövern sein. Damit verbunden kommt auch etwas Energiemanagement ins Spiel. Im folgenden Beitrag hatte ich ein komplexeres Kampfsystem und ein entsprechendes Energiemanagement beschrieben. Da will ich wieder hin. http://bradley-labs.de/2015/04/19/space-opera-release-090/ Neue Gegnertypen Eigentlich eine klare Sache. Das Spiel braucht noch ein paar unterschiedliche Gegner. Ein paar Ressourcen am Ende eines Gefechts, als Belohnung wäre natürlich auch nicht schlecht. Fog of War Auch hier etwas das ich den in den alten Versionen drin hatte. Nicht zu wissen was hinter der nächsten Ecke liegt, kitzelt ja immer ein wenig den Forscherdrang.
  42. 1 point
    Hmm... habe da nicht wirklich Erfahrung mit, aber ich würde annehmen, dass du einen Development Build machen können solltest, und mit dem gibst du dir aus, was die Kauf-Funktion dir so zurückgibt. Die sollte irgendeine Art von Fehlerbehandlung anbieten. Ich würde zuerst auf irgendetwas mit dem Authentifizierungsschlüssel tippen, aber... keine Ahnung.
  43. 1 point
    Hallo Insider, ich bin eigentlich schon seit 2015 Mitglied in diesem Forum, habe aber bisher mehr mitgelesen und mit getüfftelt. Meist war ich mit mit meiner Antwort aber viel zu langsam. 🤷‍♂️ Nun möchte ich mich aber mehr im Forum einbringen, denn davon lebt so ein Forum schließlich. Ich hoffe ich kann dem ein oder anderen User helfen und/oder ihr könnt mir helfen. Ich freue mich auf die weitere Zeit hier und hoffe das auch die Aktivität wieder ein wenig zunimmt.
  44. 1 point
    Letzter Post August 2018 Oo Ich arbeite schon länger an einem eigenen Network System. Kann in meinem Dedicated Server nun sowas reinprogrammieren. Einfach mal 2 Gameserver und einen Chatserver in der selben Programm starten. Braucht noch viele Optimierungen, aber finde es bis jetzt cool. Der allgemeine Server wurde so aufgebaut, dass man ihn für vieles benutzen kann. Darum geht auch ein Chatserver. Ein Beispiel, wenn man es für Unity verwenden möchte. Dort sieht man zwei Klassen die extra für Unity gemacht sind. NetworkObject sind sozusagen die Spieler und ScenenObject, die durch den Dedicated Server kontrolliert werden bzw. zum Synchronisieren benutzt werden. In dem Fall ist es natürlich Clientsided. Was ich aber abändern möchte ist, dass es nicht direkt gestartet werden soll. AgarioServerLogic zum Beispiel könnte ein paar abgeänderte Einstellungen haben.
  45. 1 point
  46. 1 point
    Ich hab's! Ich habe den Layer meiner Tilemap von Default auf eines der anderen fünf Vorlagen umgestellt. Vielen Dank für deine Unterstützung!
  47. 1 point
    - Ist dein Grid ein Child Ojbekt von irgendwas? - Ist der origin Point auch mittig von dem Grid?
  48. 1 point
    Weil es die Dissonanz zwischen visueller Wahrnehmung und Gleichgewichtssinn ist, die Schwindel verursacht. Gibt ein paar Leute, die damit keine Probleme haben, aber ein sehr großer Teil der Spieler kann ein Spiel direkt weglegen, wenn die Kamera nicht nahezu ausschließlich durch den Kopf kontrolliert wird.
  49. 1 point
    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
  50. 1 point
    Screenshotsaturday!! Hier kommt einfach mal ein Screenshot vom neuen Ghost House Flipper, von gerade eben. Alle Lämpchen sind an, was normalerweise nicht vorkommen kann.

Announcements

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

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...