Jump to content
Unity Insider Forum

All Activity

This stream auto-updates     

  1. Today
  2. Snapping.....hmmm....ok, das kenne ich noch garnicht
  3. Gibt es ein Problem damit, einfach per Hand, evtl. mit Snapping, die Collider in der Szene zu platzieren?
  4. Hallo, für einen Tisch mit Löchern, welchen ich in Blender mittels Boolean-Funktion und Cylindern erstellt habe, möchte ich in Unity eine Treffererkennung machen. Es gibt eine Sphere, also eine Kugel in Unity, die der Spieler später auf dem Tisch stossen kann. Wie kann ich den jeweiligen Collider im entsprechenden Loch positionieren? Wie geht man da am einfachsten vor? Das Problem ist, dass die Löcher halt keine Objekte sind, da ich sie ja in Blender erstellt habe. Danke für die Hilfe!
  5. Haste RigiBody auf deinem Player?
  6. Ich springe auf eine sich dauerhaft bewegende Plattform, warum aber bewege ich mich nicht mit? Ich werde nur irgendwann von den Seitenwänden hin und her gedrückt ansonsten bleibe rutscht die Plattform nur unter mir hin und her
  7. Für solche Sachen sind Events ganz gut. Du kannst z.B. in dein Achievement-SO ein Event einbauen: public event Action onChangeUnlockStatus; Und dann dieses Event im richtigen Moment auslösen: public void Unlock() { unlocked = true; onChangeUnlockStatus?.Invoke(); } Objekte, die auf das Event reagieren sollen, tragen sich dort ein, sobald sie zum reagieren bereit sind: public void Initialize(Achievement achievement) { titleText.text = achievement.title; descriptionText.text = achievement.description; achievement.onChangeUnlockStatus += OnChangeUnlockStatus; } private void OnChangeUnlockStatus() { if (achievement.unlocked) { // change image or background color } } Und sie tragen sich wieder aus, wenn sie zerstört werden: achievement.onChangeUnlockStatus -= OnChangeUnlockStatus; Der Ablauf ist also: Anzeige-GO wird initialisiert (setzt Text und Beschreibung usw.) und trägt eine Reaktion (Methode "OnChangeUnlockStatus") beim Event ein. Achievement wird freigeschaltet Alle im Event eingetragenen Reaktionen werden ausgelöst Anzeige-GO verändert sich
  8. Hab leider dennoch ein Problem mit Scriptable Objects ^^" "Ich bekomm es nicht hin während der Laufzeit den Bool zu ändern und das in der Liste von LoadAchievement nur das jeweilige Freigeschalten wird." Bzw. wenn man ein Achievement freischaltet soll das jeweilige Gameobject seine Color ändern das klappt aber nicht während der Laufzeit nur wenn man die Szene neustartet. Ich bin mir nicht sicher ob das wirklich der richtige Ansatz bei den Scriptable Objects ist bin für jegliche Verbesserungsvorschläge offen auch bei den for-Schleifen ob da nicht foreach besser wäre? AchievementObject welches für ScriptableObjects using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; [CreateAssetMenu(fileName = "NewAchievement", menuName = "Achievement/Create Achievement", order = 1)] public class AchievementObject : ScriptableObject { [SerializeField] private Sprite icon; [SerializeField] private string title; [SerializeField] private string description; [SerializeField] private int progValue; [SerializeField] private bool unlocked; [SerializeField] private Image unlockedImage; public Sprite Icon { get { return icon; } } public string Title { get { return title; } } public string Description { get { return description; } } public bool Unlocked { get { return unlocked; } set { unlocked = value; } } public void SaveAchievement(bool value) { unlocked = value; } } AchievementManager using TMPro; using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; public class AchievementManager : MonoBehaviour { [SerializeField] private AchievementObject[] achievementObject; [SerializeField] private GameObject prefabAchievement; [SerializeField] private GameObject prefabAchievementUnlocked; [SerializeField] private GameObject visualAchievement; [SerializeField] private GameObject parentPanel; [SerializeField] private GameObject parentVisual; private static AchievementManager instance; public static AchievementManager Instance { get { if (instance == null) { instance = GameObject.FindObjectOfType<AchievementManager>(); } return AchievementManager.instance; } } void Start() { LoadAchievement(); } void Update() { if (Input.GetKeyDown(KeyCode.Y)) { EarnAchievement("AAA"); } if (Input.GetKeyDown(KeyCode.X)) { EarnAchievement("BBB"); } } public void LoadAchievement() { for (int x = 0; x < achievementObject.Length; x++) { GameObject achievement = Instantiate(prefabAchievement, new Vector3(0, 0, 0), Quaternion.identity); if (achievementObject[x].Unlocked) { achievement.GetComponent<Image>().color = prefabAchievementUnlocked.GetComponent<Image>().color; } achievement.transform.SetParent(parentPanel.transform); achievement.transform.GetChild(0).GetComponent<Image>().sprite = achievementObject[x].Icon; achievement.transform.GetChild(1).GetComponent<TMP_Text>().text = achievementObject[x].Title; } } public void EarnAchievement(string title) { for (int x = 0; x < achievementObject.Length; x++) { if (title == achievementObject[x].Title && !achievementObject[x].Unlocked) { achievementObject[x].SaveAchievement(true); GameObject achievement = Instantiate(visualAchievement); Sprite icon = achievementObject[x].Icon; SetVisualInfo(parentVisual, achievement, icon, title); StartCoroutine(FadeAchievement(achievement)); } } } public void SetVisualInfo(GameObject parent, GameObject achievement, Sprite icon, string title) { achievement.transform.SetParent(parent.transform); achievement.transform.GetChild(0).GetComponent<Image>().sprite = icon; achievement.transform.GetChild(1).GetComponent<TMP_Text>().text = title; } private IEnumerator FadeAchievement(GameObject achievement) { CanvasGroup canvasGroup = achievement.GetComponent<CanvasGroup>(); float rate = 1.0f / 2; int startAlpha = 0; int endAlpha = 1; for (int i = 0; i < 2; i++) { float progress = 0.0f; while (progress < 1.0) { canvasGroup.alpha = Mathf.MoveTowards(startAlpha, endAlpha, progress); progress += rate * Time.deltaTime; yield return null; } yield return new WaitForSeconds(2); startAlpha = 1; endAlpha = 0; } Destroy(achievement); } } Ich hoffe mir kann jemand weiterhelfen, das hinzubekommen mit Unlock x.x und den Freischalten der Farbe für das jeweilge Achievement, welches den Bool auf True hat. Ist die vorgehensweiße auch gut für später wenn man die Daten in eine Binäre Datei schreiben möchte? Anbei auch das Projekt: https://we.tl/t-0KKyg2Ugsy
  9. Yesterday
  10. Ah ja, genau so macht man das. Nach dem Instantiate die Instanz initialisieren. Siehe auch hier.
  11. Hallo Kompetenz. Das wäre was. Im Ernst: Ich befinde mich am Anfang einer hoffentlich langen Reise. Ich stehe allerdings deutlich mehr auf das fantasy setting und habe mir deswegen da ein paar assets gegönnt. Deine Nachfrage ist wirklich nett. Christoph
  12. Last week
  13. Das versteh ich, dass man eine Referenz benötigt. Nur sagen wir ich hab 3 Scriptable Objects und 1 Prefab, das Prefab wird in einer Schleife 3x wiederholt und in einem Scrollview angezeigt. Dann seh ich ja theroethisch immer nur die Daten des 1 Scriptable Objects auf dem Prefab 3 mal? Wie kann ich das Problem am besten lösen :/? EDIT: Ich hab es jetzt so hinbekommen: 1x Gameobject mit einen Skript, welches durch das Skript eine Referenz auf ScriptableObjects hat als Beispiel 3x ScriptableObjects 1x Gameobject - Viewport/Content als Parent um Gameobjects darin zu erzeugen. Im Skript benütze ich eine for-Schleife. for(int x=0;x<testObjects.Length;x++) { Gameobject xyz = In... xyz.GetComponentInChildren<TMP_Text>().text = testObjects[x].Title; }
  14. @chrische5 was könntest du denn gebrauchen? Vielleicht könnte ich da ein neues Asset draus machen?
  15. brilliant exakt danach habe ich gesucht. Den oberen Teil aufs Prefab legen und den unteren kann ich dann von einem anderen Script aufrufen und direkt ein wert mitgeben. Ich weiss nicht warum ich darauf nicht gekommen bin,denke da fehlt mir die Erfahrung. Vielen dank fuer die ausfuehrliche Erklaerung. Ich werde heute Abend mal meine alte Variante hier reinschreiben nur um mal zu hoeren was du davon haelst.
  16. Nö, das ist auch in Ordnung. Es bietet sich dann aber an, die Initialisierung der Prefab-Instanzen auf eine möglichst kleine Schnittstelle zu reduzieren. Anstatt also im onClick-Event des Buttons Dinge einzutragen, bei denen nur der Wert unterschiedlich ist, lieber die für die Prefabs geschriebene Komponente benutzen: private int moneyAmount; public Text label; public void Initialize(int moneyAmount) { this.moneyAmount = moneyAmount; } private void Start() { label.text = "Du hast " + moneyAmount + " gewonnen!"; } public void Collect() { Debug.Log(moneyAmount + " eingesammelt"); } und dann: var instance = Instantiate(moneyWinningPrefab); instance.Initialize(someAmountOfMoney);
  17. Ahhh okay das ergibt Sinn. Jetzt verstehe ich auch deinen Gedankengang ,danke schoen. Ich vermute das wird bei mir etwas kompliziert weil ich in meiner Version zu viele Prefabs haben muesste.Aber es ist gut zu wissen wie es sonst auch noch geht. Ich mache das jetzt gerade so das ich aus einer Liste einen Text random herauslese und je nach Text ,wird hinter dem Text unterschiedliche animierte Emojis angezeigt oder halt der Button. Das mit dem Button muss ich halt noch ausprobieren(mit dem addlistener),hatte heute leider keine Zeit.Aber falls es nicht klappt komme ich dann vermutlich auf deine idee zurueck mit den unterschiedlichen Prefabs. Gibt es da irgendeinen Vorteil den ich gerade nicht sehe. Ich finde das eigentlich ganz angenehm ein Prefab zu haben und das einfach dann zu veraendern. Hat das extreme Nachteile?
  18. Update 1.2 ist jetzt live im Unity Asset Store. 🙂 Mit Update 1.2 werden nun alle 3 Render Pipelines unterstützt.
  19. Heeyy, hier bin ich wieder. War die letzten Monate viel mit unterschiedlichsten Tutorials beschäftigt, und hatte nicht so den Kopf hierfür, aber jetzt stell ich mal wie versprochen weitere Projekte von mir vor~ Heute dreht es sich um "Random Kingdom", auch wenn ich es hier jetzt zusammenfassen werde mit dem Prototyp-Projekt "Legends of Bliss", was daran liegt dass ich die Basics von genanntem Prototyp später für Random Kingdom nutzen werde und Random Kingdom selbst bislang noch nicht in Unity existiert (unter anderem auch weil ich noch nicht genug Sprites für die Landschaft habe). Wie sich sicherlich schon einige denken können wird es ein Spiel vergleichbar mit klassischen Zelda-Titeln sein. Auf den Titel "Random Kingdom" kam ich da das Setting "halt noch irgend so ein x-beliebiges Königreich" ist. Doch inzwischen ist der Name Programm! Abgesehen von der allgemein parodischen Bedeutung, die immer wieder in's Spiel mit einfließt, ist es nun auch der Plan dass sich die Bereiche bei jedem Bildschirmwechsel verändern und Dungeons daraus resultierend sogar richtig Labyrinth-artig werden. Aber keine Sorge, ich mache mir auch bereits Gedanken darum wie es trotz alldem noch eine gewisse Übersichtlichkeit und Fairness behält, aber darauf werde ich zu einem anderen Zeitpunkt noch näher eingehen. Ein weiteres Feature wird sein das man diverse Copy & Paste Fähigkeiten erlangt, wie das Übernehmen eines Elements (z.B. das des Gegners) oder das duplizieren von Objekten in der Spielwelt. Ich bin auch am überlegen dass man vielleicht gegen Ende des Spiels die Fähigkeit erlangt den Zufall selbst zu kontrollieren, sodass man nicht mehr abhängig davon ist beim Finden seines Weges und leichter an die verschiedenen Schätze herankommt die hier und da versteckt sind. Es gibt noch ein paar weitere Features die ich erwäge zu integrieren, die für mich zunächst aber zweitrangig sind und bei denen ich mir auch noch nicht wirklich sicher bin ob sie dort wirklich rein gehören. Zum Beispiel wäre da die freie Schwertführung, d.h. dass man mit dem Analogstick die Ausrichtung des Schwertes verändern kann um z.B. diagonal anzugreifen oder das Schwert in die andere Richtung zu schwingen. Ich denke dass ich es so oder so einfach mal ausprobieren werde, und dann sehe ich ja ob es denn auch so funktioniert wie ich es mir vorstelle; aber wie gesagt, Priorität hat es für dieses Projekt jetzt nicht. Ich hab hier für euch eine kleine Auswahl an Grafiken zusammengestellt, die ich für das Projekt angefertigt habe. Die ersten beiden Bilder sollen In-Game-Screens darstellen, in dem Format eines DS-Bildschirms, einfach um mal zu überlegen wie das ganze so aussehen könnte. Inzwischen hab ich nochmal etwas andere Vorstellungen dazu, und auch was die Charakter-Grafiken angeht hab ich mir bereits was neues überlegt. Wie man in den unteren beiden Zeilen des dritten Bildes schon sehen kann, hab ich begonnen die Konturen der Figuren zu entfernen, wodurch es - wie ich finde - etwas frischer und lebendiger wirkt. Allerdings gefällt mir der alte Stil auch nachwievor noch sehr, weshalb ich erwäge diesen als optionalen Stil im Spiel mit einzubauen. Aber das seh ich dann.. 😅 Im vierten Bild sind die Landschaftsteile die ich vor einigen Jahren gemacht hatte, aber ich werd das ganze demnächst nochmal von vorn angehen, da diese Teile zu grell, zu kleinteilig und generell einfach nicht gelungen sind. Ganz zu Beginn hab ich außerdem eine Art Karte erstellt, zur groben Orientierung, mithilfe der ich mir den Spielablauf und die Ortschaften überlege. An dieser Stelle mach ich erst einmal Schluss mit Random Kingdom und gehe über zu Legends of Bliss, da jenes das Projekt ist dass ich aktuell tatsächlich produziere (und zu welchem ich gegebenenfalls auch Fragen hier im Forum stellen werde 😉). Dieses Projekt basiert übrigens auf einem Tutorial von Mister Taft Creates auf YouTube~ Das ist mein aktuelles Splash-Image - ja ich weiß, der Schriftzug ist nicht ganz optimal, aber für's erste reicht mir das.. 😄 Und hier noch ein paar Screenshots: Ich hab auch eine kleine sentimental-düstere Story dazu im Kopf, aber aktuell bin ich noch nicht soweit um es hier zu posten; ihr müsst euch also noch ein klein wenig gedulden~ 😉 Das wär's dann für's erste - sobald es etwas neues gibt werd ich es natürlich hier posten. Bis dahin gibt es aber auch noch ein paar weitere Projekte die ich euch vorstellen möchte! Also, bis dahin~
  20. Musst halt eins bauen! So als Beispiel: public int moneyAmount; public void Collect() { Debug.Log(moneyAmount + " eingesammelt"); } Das packst du auf deinen Prefab, bzw irgendwo da rein (auf den Button z.B.) und dann löst du einfach Collect() mit dem Button aus. Jetzt kannst du mehrere Prefabs machen die verschiedene Dinge tun. Wenn du da mehr machen willst, oder evtl nur ein Prefab haben willst, ist es besser, dieses Script auf dem Prefab zu erweitern, als andere Scripts in den Prefabs rumpfuschen zu lassen. private int moneyAmount; public Text label; private void Start() { moneyAmount = Random.Range(10, 100); label.text = "Du hast " + moneyAmount + " gewonnen!"; } public void Collect() { Debug.Log(moneyAmount + " eingesammelt"); } Wenn du das auf dein Prefab tust, den Text reinziehst und den Button Collect() auslösen lässt, dann bist du fertig! Du kannst das Prefab sogar ohne dein Spawn-Script benutzen. Einfach mal zum Testen in die laufende Szene reinziehen.
  21. Danke wiedereinmal für deine schnelle Antwort. Ich denke ich muss mir das noch ein paar mal durchlesen ,denn bis jetzt verstehe ich nur Bahnhof. Ich habe zurzeit eine Scene wo durch Instantiate alle paar Sekunden ein weiterer Text, mit einem Button dahinter, an einem zufälligen Ort aufm Bildschirm erscheint.Klickt man auf den Button hinterm Text bekommt man das Geld gut geschrieben welches in dem Text angegebn wurde.Danach verschwindet das Objekt. Ich hab überhaupt keine Ahnung wie das mit deinen Wegen funktionieren soll die du mir zuletzt geschickt hast.Ich habe kein Script auf meinem Prefab. Ich habe ein Script welches mir die Buttons alle paar Sekunden erzeugt.Das Prefab ist einfach ein leeres Textfeld mit einem leeren Button dahinter.Nachdem Instantiate fülle ich den Text des Textfeldes("Hier 100 Euro"),mehr habe ich noch nicht. Ich möchte halt jetzt das der Button bei einem klick den Wert 100 auf das Konto addiert. Jedoch glaube ich das es sehr gut mit dem manuellen Weg(button.onClick.AddListener) funktioniert,da ich dort ja einen Variablenwert übergeben kann(wie bei deinem Beispiel "TuZeug(100)"). Das werde ich morgen ausprobieren. Es wäre spitze wenn du mir deine neuen Ideen nochmal anhand meiner Scene genauer erklären könntest.Ich verstehe aber auch das das vielleicht zu aufwändig ist und zu viel Zeit kostet.Vielen Dank nochmal für deine Hilfe
  22. Da gibt es zwei Wege. Zum einen kannst du im Script, welches ja an dein Prefab gebunden ist, Werte angeben. Hier wäre z.B. ein Script zum Laden einer anderen Szene: public string sceneName; public void LoadScene() { SceneManager.LoadScene(sceneName); } Jetzt kann man die Komponente in die Nähe des Buttons (oder halt direkt drauf) ziehen und den Namen der zu ladenden Szene eingeben. Das funktioniert, weil du ja nicht die Methode der Klasse aufrufst, sondern der Instanz. Wenn du zwei Buttons hast, der eine zeigt auf das eine GameObject mit diesem Script drauf und der zweite zeigt auf ein anderes GO mit diesem Script, dann wird auch wirklich nur von der Komponenten-Instanz die Methode aufgerufen, auf die da gezeigt wird. Die beiden Komponenten-Instanzen können daher unterschiedliche Werte haben (z.B. für sceneName), und diese Werte werden dann bei der Ausführung berücksichtigt. Alternativ kann man der Methode einen Parameter geben: public void LoadScene(string sceneName) und dann den Wert dieses Parameters beim Button einstellen. Die erste Variante ist vielseitiger, da der Button nur einen Parameter übergeben kann, man aber beliebig viele Felder in das Script packen kann. Die erste Variante erlaubt dir, dass du eine Methode in einem Script ausführen kannst, das eben nicht schon vorher weiß, welchen Wert es haben muss. Man denke z.B. an eine Light-Komponente. Die hat ja auch kein Feld "Farbe, die ich annehme, wenn ein Button gedrückt wird". Für solche Fälle kann man dann sagen Light.color und eine Farbe direkt im Inspektor des Buttons einstellen.
  23. Hi Sascha danke schön für deine Antwort.Die zweite Idee mit der Methode klingt gut .Aber ich möchte ja das jeder Button einen anderen Wert hinzufügt. Wie mache ich das denn wenn jeder Button die selbe Methode aufruft?
  24. Du setzt halt die Variable auf 0?
  25. Du kannst entweder selber Reaktionen in UnityEvents (wie onClick) einfügen oder eine Methode auf einem Script innerhalb des Prefabs verlinken. Selber hinzufügen: var button = Instantiate(buttonPrefab); button.onClick.AddListener(() => { TuZeug(100); }); Und beim fest Verlinken, was meistens die bessere Variante ist, baust du halt ein Script mit einer Methode, das landet irgendwo auf dem Prefab, der Button löst die MEthode auf und was dann in der Methode passiert, kannst du dann da implementieren.
  26. Ok. Und wie mache ich, dass die Punktzahl nach jedem Gameover auf 0 zurückgesetzt wird?
  27. Du könntest z.B. Sprite Mask verwenden, welche dann dein Nebel-Sprite an der bereits erkundeten Stellen ausschneidet?
  28. Hallo Leute, nach langer Zeit muss ich euch mal wieder mit einer Frage belästigen. Ich erzeuge mit Instantiate, Textobjekte,dessen Text zum Beispiel "Du hast 100 Euro gewonnen" lautet.Ich möchte jetzt hinter dem Text einen Button haben,der wenn ich auf ihn klicke das Geld aus dem Text meinem Konto hinzufügt. Am ehesten ist das was ich machen möchte glaube ich mit dem Spiel Moorhuhn zu vergleichen.Wo jedes Huhn ein Wert hat und wenn man es anklickt bekommt man unterschiedliche Punkte. Ich würde das sehr gerne mit Instantiate lösen,hat da jemand eine Idee wie das funktionieren kann? Die unterschiedlichen Werte für jeden Button( onKlick event )ist das was mich wahnsinnig macht.Ich weiss nicht wie das funktionieren soll.Oder vielleicht denke ich auch einfach falsch. Ich bin für jede Hilfe dankbar.
  1. Load more activity

Announcements

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

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...