Jump to content
Unity Insider Forum

All Activity

This stream auto-updates     

  1. Past hour
  2. Genau, mein zweiter Level ist eine neue Szene. In der neuen Szene ist dann auch ein neuer Player, eine Kugel. Das Skript befindet sich auch auf der Kugel, es sind sozusagen 2 oder 3in1. Das Hauptscript war, dass die Kugel am Anfang der 1. Szene neustartet, sofern sie die Spielbahn verlässt. (Ist ein Sidescroller.) Darein habe ich dann auch gesetzt, dass ich nur 5mal abstürzen darf, danach wird ein "GameOver Screen" gezeigt und das Spiel ist zuende. Den Counter wollte ich dann auch im Bild, hat für die 1. Szene auch funktioniert. Leben/Tode werden angezeigt, zählen rauf bzw runter, nach 5 Abstürzen ist Schluss. In der 2. Szene ist das dann eben wieder restet und startet bei 0... Ich bin leider absoluter Newbie und kämpfe mich da durch, verstehe vieles auch überhaupt nicht, weil es in den Begleitheften für mein Studium echt schwer beschrieben ist.
  3. Today
  4. Du kannst auch einfach deine Variablen statisch machen. Normale Variablen gibt's mit je einem Wert jeweils einmal pro Objekt (wenn du z.B. zwei Lichter hast, kann das eine blau und das andere rot sein, weil die "Farbe"-Variable des Lichts nicht statisch ist). Statische Variablen gibt's nur einmal pro Programm und sind an einem festen Ort, wo jeder Code ihn finden kann, wenn du das möchtest. Da statische Variablen nicht Teil von Objekten sind (also dem Ding im Inspektor, das auftaucht, wenn du da dein Script reinziehst), gehen deren Werte auch nicht flöten, wenn das Objekt durch einen Szenenwechsel zerstört wird. Die Variable existiert einfach einmalig von Anfang bis Ende des Programms. Du kannst das so machen: Statt public int deaths; machst du public static int deaths; Damit ist die Variable statisch. Nach dieser Änderung dürfte dir auffallen, dass "Deaths" auch nicht mehr im Inspektor auftaucht, wenn du dir ein GameObject mit deiner Komponente anschaust. Zugreifen kannst du auf die Variable genau wie vorher, aber zusätzlich auch noch so, wenn du das willst: DerNameDeinesScripts.deaths += 1; Denk aber eben daran, dass es die Variable "deaths" jetzt nur noch genau einmal gibt, also nicht mehr einmal pro Objekt. Wäre die Farbeigenschaft der Lichtkomponente statisch, dann hätten alle Lichter dieselbe Farbe, anstatt dass eines blau sein kann und das andere rot. Bei "wie oft ist der Spieler gestorben" ist das völlig okay, in vielen anderen Fällen natürlich nicht.
  5. Ne, viele Layer helfen da nicht. Ist aber so oder so keine ganz triviale Aufgabe. Du hast ja eine potentiell große Menge eigener Einheiten, die das Sichtfeld aufspannen, und mindestens eine gleich große potentielle Menge gegnerischer Einheiten, die jederzeit sichtbar oder unsichtbar werden können. Der ganz naive Ansatz wäre daher, in regelmäßigen Abständen (muss ja nicht bei jeden Update sein, kann auch seltener oder konsistenter sein) den Abstand von jeder deiner Einheiten zu jeder gegnerischen zu messen und entsprechend die Sichtbarkeit umzuschalten. Das kannst du zwar sogar machen, indem du Gegner auf einen "Unsichtbar"-Layer schiebst... kannst aber auch einfach den Renderer deaktivieren. Das Problem an diesem Ansatz ist, dass der Rechenaufwand exponentiell steigt. Für jede neu gebaute eigene Einheit muss jede existierende gegnerische Einheit also eine Abstandsmessung mehr machen. Bei 20 gegen 20 bist du also bei 20*20 = 400 Berechnungen, bei 30 gegen 30 bist du schon bei 30 * 30 = 900... 50% mehr Einheiten auf beiden Seiten, aber mehr als doppelt so viele resultierende Berechnungen. Das System skaliert also sehr schlecht nach oben hin. Und darum wird die ganze Sache knifflig. Bessere Ansätze bedeuten, dass du dir eine Beschleunigungsstruktur besorgst. Die kannst du dir entweder selber bauen, was eine sehr lehrreiche Sache wäre (kann ich deshalb mal empfehlen), oder du probierst, das zu nutzen, was PhysX (bzw. Box2D) dir mitgibt. Letzteres würde bedeuten, dass du deinen eigenen Einheiten SphereCollider gibst (CircleCollider2D wäre besser, ist aber vermutlich anstrengend umzusetzen, wenn deine Grafik 3D sein sollte). Diese Collider sind auf einem speziellen Layer (damit man ausschließlich gegen diese Gruppe checken kann), und alle gegnerischen Einheiten schauen, ob sie sich in einen solchen Collider hinein- oder hinausbewegen, um sich dann entsprechend sichtbar oder unsichtbar zu machen. Diesen Chack kannst du mit z.B. mit CheckSphere oder einem eigenen Collider machen. Ich denke, die Lösung mit der eingebauten Physikengine kann ganz gut funktionieren, aber nicht selten ist es schwierig, diese Gesamtpakete auf kleinere Jobs zu beschränken. Wenn da unvorhergesehene Probleme auftreten, die sich nur schwer lösen lassen... oder wenn die Performance am Ende nicht so gut ist wie erhofft, dann muss man da etwas selber bauen.
  6. Wenn das da oben wirklich der einzige Code ist und die Meldung bei der längeren Zeile auftritt und ganz sicher nicht woanders, dann ist trainerPrefab einfach nicht gesetzt. Der Code ist soweit nämlich okay, und eine andere Stelle gibt es da nicht, wo dieser Fehler entstehen kann. Wenn du dir ganz sicher bist, dass du da ein Objekt reingezogen hast, ist die wahrscheinlichste Fehlerursache, dass du irgendwo versehentlich mal eine zweite Instanz dieser Komponente irgendwo in deine Szene gesetzt hast, eventuell ohne es zu merken. Schau aber erstmal, ob die Fehlermeldung tatsächlich von genau dieser Zeile kommt und ob da nicht noch ein paar Zeilen mehr im Spiel sind.
  7. Yesterday
  8. Hey Leute ich mache ein kleines Multiplayer ARTS Game und sitze gerade vor dem Problem wie ich es lösen kann das sich die Gegnerischen Einheiten erst ab einer bestimmten Distanz sehen können. Über Layers aber muss man da nicht zu viele Layer hinzufügen? Danke für die Hilfe
  9. Dein 2ter Level ist eine neue Szene? Wenn ja, dann gib dem Script einfach in der Awake() oder Start() den Befehl: DontDestroyOnLoad(). Schau dir mal den Link an, da sind einige Beispiele bei. https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html Mit diesem Befehl, wird das GameObject nicht beim Szenenwechsel zerstört und ist in der nächsten Szene noch da, mit all den Werten, die es in der alten Szene hatte. Natürlich darfst du nicht nochmal so ein Objekt in der neuen Szene haben, weil dann hättest du ja 2 Objekte der gleichen Art. Ich weiß nicht wie fortgeschritten du bist, deswegen gehe ich jetzt nicht auf ein Singleton ein. Außerdem musst du wissen, dass ein Script nicht alleine in einer Szene sein kann. Das Script muss immer auf einem Gameobject liegen, und somit solte dein Script, (welches die Werte hat) auf einem neutralen Objekt liegen, also nicht auf dem Player oder der Kamera, denn die sind in der neuen Szene bestimmt nochmal drin. Und noch was Wichtiges: Da dein Objekt sich bei einem Szenenwechsel nicht zerstört, musst du es per Befehl zerstören, wenn du aus dem Spiel ins Hauptmenü zurück gehst, oder du gestorben bist und wieder bei Lvl1 anfangen willst. Dort im Lvl1 wird ja dieses Object geladen und hat die default Werte.
  10. Warum du die Meldung bekommst, weiß ich jetzt auch nicht so direkt, da du ja schreibst, dass du das trainerPrefab hinterlegt hast. Wobei ich nicht genau weiß, was du mit hinterlegt meinst. Also du hast es im Inspector auf die Public Variable gezogen?! Du solltest aber die Variable newEnemy nicht in der Start bilden, sondern oben, wo auch dein trainerPrefab ist. Ja und dann castest du ja als GameObject, obwohl das TrainerPrefab eh vom Typ GameObject ist und du es mit newEnemy verknüpfst, was ja auch ein GameObject ist. Vielleicht mag er das ja nicht.
  11. Hi, ich bräuchte mal Hilfe. Ich sollte ein Skript erstellen, das mir anzeigt, wie viele Leben ich noch habe und wie oft ich schon gestorben bin. Das Skript habe ich und es funktioniert auch. Problem: Ich habe 2 Level und wenn ich dieses Skript in das 2. Level nehme, dann zählt es von vorne los. Ich möchte aber, dass die Leben und wie oft ich gestorben bin, einfach übernommen werden und es weiterzählt... wie krieg ich das hin? Ich arbeite mit C#.
  12. Beim folgendem Code (Gekürzt) bekomme ich immer den Error:"NullReferenceException: Object reference not set to an instance of an object". Im Editor habe ich das Objekt aber "hinterlegt". public GameObject trainerPrefab void Start(){ GameObject newEnemy = (GameObject) Instantiate(trainerPrefab,new Vector3(...),Quaternion.identity); }
  13. Irgendwelche Zahlencodes umherschieben brauchst du niemals, und davon würde ich auch abraten. Ich würde auch nicht zu viel Semantik auf den Button selbst schmeißen wollen. Stattdessen kann der Button einfach von einer Komponente die "Ja wurde gedrückt"-Methode aufrufen, und innerhalb dieser Methode schaust du dann einfach nach der Tageszeit.
  14. Last week
  15. okay dann probier ich das vielleicht mal mit einer klasse. Aber dann für jeden der beiden knöpfe eine eigene methode aufrufen und eine variable mitschicken um zu erkennen um welche konversation es sich handelt richtg?Dieses benutzen der selben buttons für unterschiedliche konversationen ist mein Problem. Kannst du mir den Befehl sagen wie ich den übergangsparameter eines onclick button events von einem andere script aus verändern kann(oder die methode die aufgerufen wird vom onclick event)? in meinem beispiel soll am morgen der "ja" button die zahl 1 übergeben,mittags dann 3 und abends 5 . So das ich dann in der aufgerufenden methode mit dieser variable unterscheiden kann um welche konversation es sich handelt.
  16. Fein! Poste ruhig hier auch mal ab und zu, nicht nur aufm ollen Discord!
  17. 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
  18. Also... grau und blassgrün und beige sind keine guten Farben dafür. Wenn du nämlich die Straße anschaust, dann besteht dessen Graustufen-Ton zu gleichen Teilen aus rot, grün und blau; den additiven Grundfarben. Wenn du das tust, was Unity's Terrain-Shader (als Beispiel für so genannte Splatmap-Shader) tut: Dann kannst du diese vier Kanäle stattdessen benutzen, um mit ihnen Texturen zu kodieren. Rot steht für Alphalt, grün für Gras, blau für Sand. Da Texturen noch einen vierten Kanal, den Alpha-Kanal haben, kannst du den noch für etwas anderes benutzen. So oder so brauchst du für dieses Vorhaben einen Shader, der fünf Texturen akzeptiert: Die Splatmap, also die Daten, wo welche andere Textur zu sehen ist, und eben die anderen vier Texturen, eine für jeden der vier Kanäle der Splatmap. Du machst dann einen UV-Lookup für jede der fünf Texturen auf jedem Pixel und interpolierst dann die Pixelwerte der vier Texturen in Abhängigkeit vom entsprechenden Wert des Kanals in der Splatmap. Ich könnte da noch spezifischer werden... aber entweder, du kannst das so umsetzen... oder, wenn nicht, solltest du dir ein paar Shadergrundlagen anschauen und ein bisschen mit denen warm werden.
  19. Hallo, schaut euch mal die angehängte Textur an. Diese liegt vor. Defacto ein gewisser Rahmen an festgelegten Pixelfarben. In diesem Beispiel gibt es: - grün - hellgrau - dunkelgrau - beige/sandfarbe - rot/weiß - weiß Also bis hierher ja ziemlich einfach. Jetzt würde ich gerne eine Texturverbesserung vornehmen und alles was "grün" ist mit einer neuen Textur, die entsprechender hochwertiger nach Gras aussieht überblenden, bzw. überschreiben - zur Laufzeit. Nachdem die Kanten jedoch scharf bleiben sollen (um zb die Streckenabgrenzungen in weiß zu erhalten) stehe ich logisch ein wenig an. Habt ihr da eine Idee wie ich das angehen könnte? lg & danke
  20. Auch dafür würde ich das hier empfehlen: Da kannst du nämlich dann wiederum weitere Monologe referenzieren, die dann als Folgemonologe gelten. Könnte z.B. als ScriptableObject so aussehen: [AddComponentMenu] public class Monologue : ScriptableObject { public string text; public Monologue nextMonologueIfYes; public Monologue nextMonologueIfNo; } Obwohl... naja, geht natürlich auch wieder simpler, und du ersetzt die beiden "Monologue"-Felder durch string-Felder. Aber auch dann hast du schön den Eingangstext und die beiden Folgetexte an einem Ort.
  21. ah ok du meinst also den ganzen Dialog in einem array speichern und dann aufrufen. Ich denke so viel muss es garnicht sein.Sind halt immer nur die gleichen zwei Personen und wenige Zeilen.Ist allerdings das gleiche Problem wie schon in einen meiner alten Threads. Ich habe mehrere Konversations Szenarien auf die man immer nur mit Ja oder Nein antworten kann. Dafür möchte ich natürlich immer die selben Buttons benutzen. Wie gebe ich jetzt zum einen den Button weiter (zurzeit ja einfach mit einer variable entweder 1 oder 0) Aber wie gebe ich ausserdem eine Variable weiter um zu wissen um welche Konversation es sich handelt. Du hast oben in deinem Beispiel 2 Übergabevariablen .Ist es möglich das man eine durch den Button onclick mitgibt und die andere von einem anderen Script gesetzt und übergeben wird. Ich möchte zum Beispiel folgendes machen. Das die Mutter einen zum essen ruft zu bestimmten Uhrzeiten(Morgens,Mittags,Abends).Je nachdem soll natürlich ein anderer Satz angezeigt werden. Man soll darauf immer per Button nur mit Ja oder Nein antworten können. Nach dem Button klick sollen je nach Button und je nach Uhrzeit unterschiedliche Antworten in einem Textfeld ausgegeben werden. Ist das mit den 2 ÜBergabevariablen eine valide Idee oder geht das smarter?
  22. 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
  23. @Timothyee Es ist zwar schon ne Woche her, aber vielleicht siehst du es ja doch noch. Ich habe mal ein Video zu deinen Problemen gemacht, weil es zu viel Text gewesen wäre. Hier kannste gucken:
  24. Hi devandart vielen dank für deine Hilfe.Ich habe das yield return scheinbar vergessen weshalb ich diese Fehler bekam. Sehe ich es richtig das ich für ein simplen Delay jedes mal eine neue Methode erstellen muss(ich weiss nicht, ob dass das richtige Wort bei einem IEnumerator ist.)?In meinem Beispiel habe ich 2 Buttons jeder Button soll eine andere onversation starten. Die einzelnen Texte möchte ich halt durch kleine Delays ein wenig angenehmer lesbar machen. Ich wollte aber bei beiden Buttons die selbe Methode aufrufen und per mitgegebener variable entscheiden welche conversation gestartet wird. Z.B so: public void motherAnswer(int answer) { if (answer==0) { blabla.text=Hallo delay blabla.text=wie gehts; } if (answer==1) { blabla.text=Moin delay blabla.text=na du; } } könntest du mir erklären wie und ob das möglich ist ohne das ich dafür eine IEnumerator Methode aufrufen muss,oder ob es möglich ist die in meinem Beispiel einzuarbeiten? Das ist nur ein Beispiel, am Ende werde ich deutlich mehr Buttons haben weshalb es sehr angenehm wäre wenn ich das zu wenigen Methoden zusammenfassen kann,wie in meinem Beispiel.
  25. 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 } //...
  26. Hi Leute, ich würde gerne dafür sorgen das ein Text sich nach einer Sekunde ändert.Also ein delay erstellen. Ich habe gelesen dafür ist IEnumerator am besten.Allerdings funktioniert das nicht bei mir.Muss man dafür noch etwas bestimmtes hinzufügen? Als Beispiel habe ich das hier erstellt: IEnumerator test() { } Er meckert über das Wort test. Und als Hilfe sagt er mir " "test" durch Eigenschaft ersetzen." Weiss jemand was ich falsch mache oder was mir fehlt? PS: Ich was das für die volle funktionsweise noch mehr benötigt wird aber hier bekomme ich immer den Fehler.
  27. Malon

    nebel

    naja, ich hab mir mal das Aura asset geholt, aber iwi tut sich da gar nix. da muss ich wohl noch googlen und testen wo ich das script rein tun muss. im direction light passiert gar nichts. aber danke erstmal für eure antworten 🙂
  28. Hah, manchmal kann's auch einfach sein Ich meine mich zu erinnern, dass es in den Project Settings beim Sound eine globale Einstellung dafür gibt. Wenn du die ausstellst, brauchst du nicht bei jeder AudioSource einzeln darauf zu achten.
  1. Load more activity

Announcements

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

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...