Jump to content
Unity Insider Forum

All Activity

This stream auto-updates     

  1. Yesterday
  2. Hallo liebe Unity-Community, ich habe vorgehabt einen Schwierigkeitsgrad im Spiel einzubauen. Dabei sollen auf Knopfdruck die Werte von Variablen im Spielgeschehen geändert werden. Auf Easy, Default und Hard (Funktionen im Script) habe ich jeweils die Werte der einzelnen Variablen (Spielverhalten von Objekten) geändert. Diese Änderungen sollen sich natürlich auch ingame bemerkbar machen. Beispielsweise möchte ich, dass der 'float lifetime' Wert von (default) 1f bei Knopfdruck auf 0.5f geändert wird und diese Änderung in der Laufzeit wirksam ist. Ich hab es hinbekommen, dass die Änderungen vor Spielstart wirksam werden (durch Bool-Werte: also Easy und Default Schwierigkeitsgrade sind auf 'false' und Hard ist auf 'true' für den Schwierigkeitsgrad Hard ==> siehe Anhang). Jedoch möchte ich dies wie gesagt während des Spiels ändern und wirksam machen. Hat jemand möglicherweise Ideen bzw. Lösungsvorschläge, wie man dieses Problem bewältigen kann? Zusätzlich sei noch erwähnt, dass ich die neu bearbeiteten Werte bei neuladen der Szene in Laufzeit beibehalten möchte. Mit freundlichen Grüßen killstriker64
  3. Irgendwie machst du es uns verdammt schwer zu verstehen wo dein Problem liegt. Habe versucht aus deinen zwei Varianten das Problem zu interpretieren, aber ohne Erfolg xD Du hast das Problem, bei der Reparatur des Moduls die nötige Anzahl von Ressourcen abzuziehen bzw. zu prüfen? Oder hast du ein Darstellungsproblem? Möchtest nur dann das Panel anzeigen lassen, wenn das Raumschiff Schaden erlitten hat?
  4. @malzbie, @Felix K. danke für das Lob
  5. Ich bräuchte eine Empfehlung über ein allgemeines vorgehen. Der Hintergrund meiner Frage ist folgender: Der Spieler fliegt ein Raumschiff, dessen Werte sich aus Modulen wie Struktur, Panzerung etc. zusammen setzten. Diese Module können z.B. im Kampf beschädigt werden. Um eben diese Schäden zu reparieren, braucht man Ressourcen. Die benötigten Ressourcen sind für jedes Modul unterschiedlichen und errechnen sich aus den Produktionskosten eines Moduls. Die Anzeige erfolgt in einem Panel innerhalb des Prefabs, im Bild rot markiert. Jetzt zu meiner Frage: Die erste Idee, die mir gekommen ist, war das ich im PreFab der Modulinformationen alle Ressourcen einbinde und dann per Code wieder herausnehmen, wenn diese nicht gebraucht werden. Die zweite Idee, die mir gekommen ist, ist das Panel zu Beginn überhaupt nicht zu füllen und erst bei Bedarf mit dem Images und Texten zu füllen. Gibt es weitere Varianten, die mir entgangen sind? Ich würde eher der Variante 2 den Vorzug geben. Allerdings bin ich aktuell daran gescheiter innerhalb vom Code ein Image und ein Text zu erstellen.
  6. - Ist dein Grid ein Child Ojbekt von irgendwas? - Ist der origin Point auch mittig von dem Grid?
  7. Last week
  8. Schließe mich @malzbie an! Allgemein sieht das vorhandene Menü zum Spiel stimmig aus.
  9. Hi und Danke für deinen Tipp. Ja, den Animator kenne ich und damit habe ich auch schon gearbeitet. Jetzt, wo du es sagst, scheint dieser Weg wohl doch der sinnvollere zu sein. Obwohl ich mit dem Animator schon einige Sachen realisiert habe, hänge ich leider gerade fest. Die Animation habe ich erstellt und dem Button (Image) hinzugefügt und diese auch in den Inspector reingezogen (bei Controller). An der Main Camera hängt das Script und auch dort existiert eine Animator-Komponente (mit zugewiesenem Controller). Der Animation (Fade-Out) habe ich die Variable Animation mit Integer 1 zugewiesen. Sobald im Code diese auf 1 gesetzt wird, müsste also die Ausblend-Animation laufen. Der Code ist dieser hier (im Vergleich zum anderen deutlich abgespeckter): using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // Notwendig, damit z.B. auf die Image-Componente zugegriffen werden kann public class PanelToggle : MonoBehaviour { private bool buttonStatus = true; // Mit wahr initialisieren private GameObject[] buttonArray; // Array aller Buttons public Animator animator; // Variable für den Zugriff auf die Animator-Komponente void Start() // Buttons beim Start einmal suchen und im Array cachen. { buttonArray = GameObject.FindGameObjectsWithTag("Button"); // Array aus allen GameObjects generieren, die Buttons sind } public void ToggleButtons() // Alle Buttons ein- bzw. ausblenden { buttonStatus = !buttonStatus; // buttonStatus togglen foreach (GameObject button in buttonArray) // Für alle Buttons: { Transparenz(buttonStatus, button); // Transparenz für aktuellen Button verändern Debug.Log("Buttons sind: " + buttonStatus); // OK } } public void Transparenz(bool buttonStatus, GameObject button) // Übergebenen Button entweder ein- oder ausblenden { animator = GetComponent<Animator>(); // Zugriff auf die Animator-Komponente if (buttonStatus) // Wenn Button eingeblendet werden soll: { animator.SetInteger("Animation", 0); // Idle-Animation abspielen bzw. keine } else // Ansonsten, ausblenden: { animator.SetInteger("Animation", 1); // Fade-Out-Animation abspielen } } } Leider passiert nichts, wenn ich mit der Maus auf das Panel klicke Auf dem Screenshot sieht man, dass die Animation schon mal korrekt ist: So sieht der Animator-Controller aus: (Komischerweise scheint die Vorschau unten rechts nicht zu funktionieren - sie wird abgespielt, es passiert aber nichts.) Ziel ist, dass beim Klick/Touch auf das Panel die Animation abgespielt wird, so dass alle Buttons ausgeblendet werden. Danke nochmal für eure Hilfe!
  10. Was weiß ich denn, wie dein Spielfeld auszusehen hat? Ich weiß ja nichtmal, was das für ein Spiel ist oder welche Regeln es hat. Bin nicht in deinem Kopf drin Werden denn die Karten gelöscht, die bereits existieren, wenn du die Szene wechselst?
  11. naja man sollte erkennen dass ein spielfeld nicht so aussehen sollte normalerweise werden 3 Gebiete ausgeteilt, Feld, Hand1, Hand2 stattdessen wird die Hand-Auffächern-Animation jetzt auf dem Deck getriggert und dann fliegen noch überall anders irgendwelche kartenrum nachdem das hauptspielfeld längst aufgebaut wurde... Ja, ich habe eine komponente die nicht gelöscht werden darf. Aber darum rufe ich ja auch Stopallcoroutines auf und das sogar auf der Instanz dieses Objekts. also... ?????
  12. Als Erstes würde ich dir empfehlen solche Sachen einfach zu animieren. Dafür musst du natürlich erst einmal lernen, wie das mit Animationen so funktioniert. Aber glaub mir, es lohnt sich. Zu deinem Problem will ich aber auch noch was schreiben. Du fährst eine Schleife durch, bei der du den Alphawert einfach solange erhöhst, bis er 255 erreicht hat. So eine Schleife wird komplett ausgeführt und erst danach geht es im Code weiter. Da ist es komplett egal, ob du innerhalb der Schleife eine Coroutine startest. Das Einzige, was es bewirkt: Diese Coroutine wird 256 mal in diesem einen Frame gestartet. Sie würde dir dann auch nach der Sekunde Verzögerung 256 mal etwas ausgeben, wenn du hinter dem Yield etwas hättest, was ausgegeben würde. Da ist aber nichts! Das was du da machst, passiert innerhalb eines Frames. Aus diesem Grund wirkt es so, als würde der Button sofort den neuen Zustand annehmen.
  13. Hallo nochmal, ich habe das Problem bereits selber gelöst: Die Buttons können jetzt transparent dargestellt werden, statt komplett deaktiviert zu werden. Es lag eingentlich nur daran, dass ich im Programmkopf die "using UnityEngine.UI;" vergaß. Leider schaffe ich es nicht, die Button-Transparenz mithilfe einer for-Schleife von 255 auf 0 zu bekommen. Anders gesagt: Es funktioniert zwar, aber es wirkt wieder wie An und Aus. Meine eingebaute Verzögerung, die zwischen jedem Durchlauf ausgeführt werden soll, scheint nicht zu funktionieren. Das ist der aktuelle Programmcode, der zwar funktioniert, aber genau wie der erste läuft: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // Notwendig, damit z.B. auf die Image-Componente zugegriffen werden kann public class PanelToggle : MonoBehaviour { private bool buttonStatus = true; // Mit wahr initialisieren private GameObject[] buttonArray; // Array aller Buttons void Start() // Buttons beim Start einmal suchen und im Array cachen. { buttonArray = GameObject.FindGameObjectsWithTag("Button"); // Array aus allen GameObjects generieren, die Buttons sind } public void ToggleButtons() // Alle Buttons ein- bzw. ausblenden { buttonStatus = !buttonStatus; // buttonStatus togglen foreach (GameObject button in buttonArray) // Für alle Buttons: { Transparenz(buttonStatus, button); // Transparenz für aktuellen Button verändern Debug.Log("Buttons sind: " + buttonStatus); // OK } } public void Transparenz(bool buttonStatus, GameObject button) // Übergebenen Button entweder ein- oder ausblenden { byte alpha = 255; ; // Alphawert mit 255 initialisieren (keine Transparenz zu Beginn) if (buttonStatus) // Wenn Button eingeblendet werden soll: { button.GetComponent<Image>().color = new Color32(255, 255, 255, 255); // Voller Alphawert (keine Transparenz) } else // Ansonsten, ausblenden: { for (int x = 0; x < 255; x++) // 255 Durchgänge { alpha--; // Alphawert in jedem Durchgang dekrementieren button.GetComponent<Image>().color = new Color32(255, 255, 255, alpha); // Neuer Alphawert für den Button StartCoroutine(Verzögerung()); // Verzögerungsfunktion ausführen - FUNKTIONIERT LEIDER NICHT WIE GEWÜNSCHT! } } } IEnumerator Verzögerung() // Fügt eine Verzögerung von 1000 Millisekunden hinzu { yield return new WaitForSeconds(1); // 1 Sekunde Verzögerung } }
  14. Wir haben da mal ne Weile rumprobiert, aber das Plugin hat sich mega quergestellt... ich benutze einfach C, ist ähnlich genug Coroutines laufen auf MonoBehaviours, also deinen Script-Komponenten. Wenn die Komponente zerstört wird, sei es direkt, durch Zerstörung des GameObjects oder durch das Entladen der Szene, dann läuft sie natürlich nicht mehr weiter. Wenn eine Coroutine nach Laden einer neuen Szene noch läuft, dann liegt das daran, dass die MB-Komponente, auf der sie läuft, noch existiert, also durch DontDestroyOnLoad am Leben gehalten wird. Ich weiß ehrlich gesagt nicht, wo dein Fehler liegt. Ich sehe da einen Screenshot mit nem Hintergrundbild, nen Haufen Karten und etwas IMGUI drüber. Da ich nicht weiß, was du eigentlich haben willst, weiß ich nicht, wo der "abartige Effekt" ist
  15. Hallihallo. Ich stehe mal wieder vor einem völlig unverständlichen Unity-Problem. Mein Code (warum gibts eigentlich kein C#? 😞 StopAllCoroutines(); Global.instance.StopAllCoroutines(); Global.MovingCards = 0; SceneManager.LoadScene(SceneManager.GetActiveScene().name); throw new Exception(); Sieht richtig aus oder? Nein. Sieht sogar viel zu umfangreich aus, da ich gelesen habe, dass Unity Coroutinen automatisch beenden sollte beim laden einer Szene. Nun erkläre man mir bitte diesen abaritgen Effekt: Zum Kontext: Ich lade eine Szene indem ich mir ein Deck generiere, von diesem Deck die Hände und das Spielfeld austeile und das alles passiert in Coroutinen. Und nur falls eventuell die Instanzen dabei eine rolle spielen hab ich auch einen globalen Singleton die Funktion aufrufen lassen. die MovingCards ist eine Zahl die mehr oder weniger die Anzahl der aktuellen Animationen angibt. Und nur um sicher zu gehen dass nicht eventuell doch noch irgendwo irgendwas ausgeführt wird nachdem die Szene geladen wird schmeiße ich danach eine Exception raus. Natürlich habe ich es zu allererst mit dem Einzeiler probiert, der Rest code soll nur zeigen was ich schon alles versucht habe. Ich hab auch mal explizit den Single Parameter in der Lade-Funktion angegeben - ohne Erfolg. Ich weiß nichtmal wo ich anfangen soll zu raten wo dieser Fehler überhaupt herkommt also hoffe ich von euch die Erleuchtung zu erhalten. Edit: Ich sollte eventuell erwähnen dass ich diese Funktion mehrfach als Test aufrufe. Die Szene wird etwa 10mal hintereinander neugeladen. Das läuft so ab: Szene lädt -> Deck generiert -> Karten ausgeteilt -> Szene neuladen -> ... Ein zufälliges event hält diese Schleife aktuell aus. Vielleicht macht das ja irgendwas kaputt... keine ahnung...
  16. Hi Community, ich bin noch recht neu in unity und ich habe immer wieder Probleme mit dem positionieren. Ich habe folgendes getan: Ich habe ein Gameobject erstellt welches beim Start des Spiels angezeigt wird. Rufe ich dann zur Laufzeit folgende Funktion auf, würde ich erwarten, dass mein Gameobject in der Mitte des Viewports angezeigt wird: public void Move() { Vector3 centerpoint = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0)); Debug.Log(centerpoint); transform.position = centerpoint; } Allerdings positioniert er mein Gameobject nichtmal ansatzweise in der Mitte (siehe Bild, dass gemeinte Object ist das braune 3x3 Grid). Mir ist jetzt nicht klar, welche Faktoren noch dafür sorgen können, dass 0.5 und 0.5 nicht die Mitte ist. (In jedem mir bekanntem Beitrag ist es die Mitte und ich habe dort niemals weitere Probleme lesen können). Auch ist mir nicht klar, was für Informationen hier noch benötigt werden. Vermutlich ist die Antwort darauf auch die Antwort auf mein Fehler, da irgendetwas meinen Kontext noch beeinflusst. Ich muss dazu sagen, dass auch das initiale Positionieren der Spieleobjecte, der Camera Position, des HUD, ... alles mehr try-and-error war. Auch über Links zu vernünftigen Tutorials an der Stelle würde ich mich sehr freuen! Grüße Dennis
  17. Vielen Dank für deine Antwort, das funktioniert schon mal! Ich habe noch ein wenig nachgedacht und bin zum Entschluss gekommen, dass es evt. sinnvoller wäre, die Buttons transparent zu machen. Dadurch müssen sie anfangs nicht gecacht werden, da nie die Gefahr bestehen wird, dass sie deaktiviert sind. Außerdem wird es optisch auch einen besseren Eindruck machen, wenn diese aus- bzw. eingeblendet werden. Leider verzweifle ich mal wieder an den Basics. Das hier funktioniert schon mal nicht: public void ToggleButtons() // Alle Buttons ein- bzw. ausblenden { buttonStatus = !buttonStatus; // buttonStatus togglen foreach (GameObject button in buttonArray) // Für alle Buttons: { //button.SetActive(buttonStatus); // Aktuellen Button ein- bzw. ausblenden button.GetComponent<Renderer>().SetTransparency(1f); // WIE MÜSSTE ES KORREKT SEIN? Debug.Log("Buttons sind: " + buttonStatus); // OK } } Ich habe verschiedenes probiert, aber leider hat's nie geklappt. P.S. Dein anderer Gedanke mit dem Inspector ist interessant, aber noch bin ich nicht so weit Gruß
  18. Schöne klare Icons! Gefallen mir.
  19. Phu, so die Icons sind jetzt alle fertig gepixelt. Jetzt kann ich mit dem Code weitermachen.
  20. Wenn ich raten würde, würde ich als erstes vermuten, dass die UV-Map nicht mit exportiert wurde.
  21. Hallo liebe Unity Freunde, nach langer Zeit habe mich wieder mit Unity befasst. Von C# habe ich keine Ahnung, werde mich aber nun intensiv damit auseinandersetzen. Früher habe ich ein bisschen mit Javscript und PHP verbracht, daher ist mir das scripten nicht ganz unbekannt. Nun habe ich eine kleine Fabrik als 3D Modell importiert und begehbar gemacht. Zum Durchlaufen der Szene habe ich einen Character Controller mit "Bewegungs-" und "Umschau"-Script versehen. Die Scripte habe ich im Internet gefunden. Außerdem habe ich eine Leinwand zum Abspielen eines Films über einen Trigger erstellt. Das ganze läuft auf meinem aktuellen schnellen MacBook Pro gut. Auf einem langsamen PC auch, nur das Video wird nicht abgespielt und der PC stürzt ab. Auf einem schnellen PC rennt der Character beim Start sofort nach vorn los. Woran kann das liegen? LG Stefan
  22. Hallo, ich bin viel in Discord unterwegs und ja auch hier von Forum. Ich finde man kann aus dem Discordserver viel mehr machen. Für mich sieht der Discordserver eher nach einem Chatroom aus. Sehe da auch selten ein Admin oder so unterwegs. Wahrscheinlich sind sie aber nur unsichtbar ^^. Klar es gibt ein Channel für den Unity Support, aber der Server hat viel mehr potenzial, aber es wird nicht ausgenutzt. Z.B. Warum gibt es sowas wie #work-in-progress nicht? Manche zeigen gerne ihre aktuellen Arbeiten z.B. per Video oder Screenshots. Das sorgt für interessante Gespräche und für mehr Informationsaustausch. Oder #release, #completed-projects oder so, wenn es um fertige Projekte geht. Sowas wie #unitytips, wo man Tipps über jegliche Art zeigt (Twitterlink, Youtubelink, Bild oder einfach nur Snippet Code) Was ich auch cool finden würde wäre, wenn man Rollen zuweisen kann. Programmierer, Designer oder sowas. Weiß allerdings nicht, ob man dafür irgendwas scripten muss (z.B. wegen commands). Das war es erst mal.
  23. Vielleicht sind die Normalen nicht sauber importiert worden und wenn die nicht da sind, kann auch eine Normalmap wenig auswirken. Klick mal das importierte Objekt an und wähle im Inspector aus, dass du die Normalen berechnen willst, statt sie zu importieren. Sollte sich dann was ändern, dann kommt es vom Blender bzw. dem Austauschformat. Du nutzt scheinbar obj. Versuch mal fbx.
  24. Willkommen! Ich habe von Ubuntu zwar keine Ahnung, aber es sieht trotzdem so aus, als würde Unity oder Ubuntu auf irgendetwas vom Anderen warten. Möglicherweise blockiert Ubuntu das aber. Könnte ein Rechteproblem sein. Hast du denn bei Ubuntu irgendsowas wie ein Taskmanager, wo du genau sehen kannst welcher Task die ganze Leistung zieht?
  25. Moin, Du suchst die Buttons, wenn Du ToggleButtons() aufrufst. Das Problem hierbei ist, dass Unity keine GameObjects in der Scene findet, die inaktiv sind. Die einfachste und sauberste Lösung ohne zu viel zu ändern wäre die folgende Änderung, einmal beim Start die Buttons zu finden und dann nur noch das Array zu nutzen. using System.Collections; using System.Collections.Generic; using UnityEngine; public class PanelToggle : MonoBehaviour { private bool buttonStatus = true; // Mit wahr initialisieren private GameObject[] buttonArray; void Start() { //Buttons beim Start einmal suchen und im Array cachen. buttonArray = GameObject.FindGameObjectsWithTag("Button"); // Array aus allen GameObjects generieren, die Buttons sind } public void ToggleButtons() // Alle Buttons ein- bzw. ausblenden { buttonStatus = !buttonStatus; // buttonStatus togglen foreach (GameObject button in buttonArray) // Für alle Buttons: { button.SetActive(buttonStatus); // Aktuellen Button ein- bzw. ausblenden Debug.Log("Buttons sind: " + buttonStatus); // OK } } } Grundsätzlich würde ich aber von "FindGameObjectsWithTag" und anderen Suchfunktionen mit String-Namen abraten, weil das sehr fehleranfällig ist. Entweder direkt nach Components suchen, oder ein im Inspector zugängliches Feld machen, wo Du die Buttons einfach im Editor reinziehst. //Hierfür müsste die Komponente auf dem Panel liegen und dann alle Unterelemente durchsuchen GetComponentsInChildren<Button>() //oder so, mit dem SerializeField Attribut erlaubst Du Unity, ein privates Feld im Inspector sichtbar zu machen [SerializeField] private Button[] buttonArray;
  26. Hallo, ich habe ein Problem. Wenn ich versuche auf ein importiertes Objekt(aus Blender, obj) ein Material anzuwenden, dann wird zwar die Farbe des Materials übernommen, aber die Normal Map nicht. Was mache ich falsch?
  1. Load more activity

Announcements

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

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...