Jump to content
Unity Insider Forum

markusk

Members
  • Posts

    18
  • Joined

  • Last visited

  • Days Won

    1

markusk last won the day on July 25

markusk had the most liked content!

markusk's Achievements

Member

Member (2/3)

1

Reputation

  1. Hallo, weiß mittlerweile wo der Fehler lag, ich hatte das Prefab auf das Skript gezogen und nicht auf das GameObject. lg, Markus
  2. Hallo, nun will ich gegnerische Raumschiffe erzeugen welche sich von rechts nach links auf mein eigenes zubewegen. Ok, für die Gegner hab ich mir wieder ein Prefab gemacht weil ich ja beliebig viele erzeugen will. Für den Anfang wollte ich mal folgendes machen: Wenn man auf G drückt soll ein Gegner auf 2, 2, 0 erzeugt werden. Nur mal um einen sichtbar zu machen. public class Spieler : MonoBehaviour { private readonly float eingabeFaktor = 10.0f; public GameObject geschossRotPrefab; public GameObject geschossGruenPrefab; public GameObject gegnerPrefab; private void Start() { } void Update() { // hier war der bisherige code if (Input.GetKeyDown(KeyCode.G)) { Instantiate(gegnerPrefab, new Vector3(2, 2, 0), Quaternion.identity); } } } Ich hab hier einen public Slot für das Gegner-Prefab ergänzt und im Editor das Prefab auf diesen Slot gezogen. Wenn ich das Spiel nun starte und auf G drücke dann krieg ich die Fehlermeldung: UnassignedReferenceException: The variable gegnerPrefab of Spieler has not been assigned. You probably need to assign the gegnerPrefab variable of the Spieler script in the inspector. Was mach ich hier falsch? Denn ich hab ja eigentlich genau das gemacht - im Editor das Prefab assigned. lg, Markus
  3. Hallo, danke für die vielen Verbesserungsvorschläge Hätte jedoch einige Fragen dazu. Fangen wir mit dem Player an: Du hast geschrieben daß ich die beiden Geschoss-Prefabs im Editor direkt in die zwei public Slots ziehen kann und sie nicht extra nachladen brauche. Genau so hab ich's gemacht, ich hab die beiden Geschoss-Prefabs in die zwei public Slots vom Skript Spieler.cs gezogen. Und je nachdem ob die rechte oder linke Strg-Taste gedrückt wird instanziere ich mit Instantiate ein grünes oder ein rotes Geschoss. Also das Spieler-Skript sollte eigentlich soweit passen oder? Deine Anmerkungen zum Geschoss-Skript kann ich verstehen und ich hab es folgendermaßen geändert: public class GeschossScript : MonoBehaviour { public GameObject explosionPrefab; void Start() { Debug.Log("neues geschoss"); } void Update() { float xNeu = transform.position.x + 0.5f * 20.0f * Time.deltaTime; if (xNeu > 9) { Destroy(this.gameObject); } else { transform.position = new Vector3(xNeu, transform.position.y, 0); } } public void OnTriggerEnter2D(Collider2D trigger) { GameObject triggerObject = trigger.gameObject; if (triggerObject.CompareTag("IstWand")) { Instantiate(explosionPrefab, gameObject.transform.position, Quaternion.identity); Destroy(gameObject); } } } In den Geschoss-Prefabs hab ich über den public slot das jeweilige Explosions-Prefab reingezogen. Sieht schon viel besser aus finde ich und funktionieren tut's auch lg, Markus
  4. Hallo, also ich hab das alles mal so umgebaut daß im Spieler-Skript nur mehr auf den Tastendruck für's Feuern abgefragt wird und wenn die Taste gedrückt wird erzeuge ich ein Geschoß aus dem Prefab und platziere es vor dem Raumschiff. Die Bewegung und das Zerstören übernimmt das Geschoß selbst. Konkret sieht das bei mir dann so aus daß mit der linken Strg-Taste ein rotes und mit der rechten Strg-Taste ein grünes Geschoß erzeugt wird. Hab in meine Szene eine einfache weiße senkrechte Wand eingebaut und wenn ein Geschoß auf die Wand trifft wird ein Partikeleffekt in der Farbe des Geschosses erzeugt der die Exlosion anzeigen soll und das Geschoß zerstört sich selbst. Scheint gut zu funktionieren, man sieht das auch ganz deutlich in der Hierarchy-View wie die Instanzen erzeugt und dann wieder zerstört werden. lg, Markus public class Spieler : MonoBehaviour { private readonly float eingabeFaktor = 10.0f; public GameObject geschossRotPrefab; public GameObject geschossGruenPrefab; void Start() { } void Update() { float xEingabe = Input.GetAxis("Horizontal"); float yEingabe = Input.GetAxis("Vertical"); if (xEingabe != 0) { float xNeu = transform.position.x + xEingabe * eingabeFaktor * Time.deltaTime; if (xNeu > 3.0f) { xNeu = 3.0f; } else if (xNeu < -7.7f) { xNeu = -7.7f; } transform.position = new Vector3(xNeu, transform.position.y, 0); } if (yEingabe != 0) { float yNeu = transform.position.y + yEingabe * eingabeFaktor * Time.deltaTime; if (yNeu > 4.5f) { yNeu = 4.5f; } else if (yNeu < -4.5f) { yNeu = -4.5f; } transform.position = new Vector3(transform.position.x, yNeu, 0); } if (Input.GetKeyDown(KeyCode.LeftControl)) { Instantiate(geschossRotPrefab, new Vector3(transform.position.x + 1.7f, transform.position.y, 0), Quaternion.identity); } if (Input.GetKeyDown(KeyCode.RightControl)) { Instantiate(geschossGruenPrefab, new Vector3(transform.position.x + 1.7f, transform.position.y, 0), Quaternion.identity); } } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class GeschossScript : MonoBehaviour { private static GameObject explosionRotPrefab; private static GameObject explosionGruenPrefab; void Start() { Debug.Log("neues geschoss"); if (explosionRotPrefab == null) { explosionRotPrefab = Resources.Load<GameObject>("prefabs/ExplosionRot"); } if (explosionGruenPrefab == null) { explosionGruenPrefab = Resources.Load<GameObject>("prefabs/ExplosionGruen"); } } void Update() { float xNeu = transform.position.x + 0.5f * 20.0f * Time.deltaTime; if (xNeu > 9) { Destroy(this.gameObject); } else { transform.position = new Vector3(xNeu, transform.position.y, 0); } } public void OnTriggerEnter2D(Collider2D collision) { GameObject gameObject = collision.gameObject; if (gameObject.CompareTag("IstWand")) { if (this.gameObject.CompareTag("IstGeschossRot")) { Debug.Log("rotes geschoss hat wand getroffen"); Instantiate(explosionRotPrefab, this.gameObject.transform.position, Quaternion.identity); } else if (this.gameObject.CompareTag("IstGeschossGruen")) { Debug.Log("grünes geschoss hat wand getroffen"); Instantiate(explosionGruenPrefab, this.gameObject.transform.position, Quaternion.identity); } Destroy(this.gameObject); } } }
  5. Hallo, ich programmier gerade einen 2D Shooter und zwar hab ich da ein Raumschiff daß ich in alle Richtungen bewegen bzw. mit der linken Strg-Taste feuern lassen kann. Für die Geschosse hab ich ein Prefab gemacht und jedesmal wenn Strg gedrückt wird erzeuge ich eine Instanz desselbigen und merke es mir gleichzeitig in einer List<GameObject>. Dannach geh ich diese Liste immer durch und erhöhe die x-Position des aktuellen Geschosses um einen bestimmten Wert. Dadurch bewegen sie sich nach rechts und wenn sie über den rechten Rand hinaus sind will ich sie erstens aus der erwähnten List<GameObject> löschen und zweitens soll es auch aus Unity-Sicht mit Destroy destroyed werden. Im Moment mach ich es so daß ich mir die Objekte die über den Rand raus sind in einer separaten Liste merke und die dann durchlaufe bzw. die Objekte lösche. Und zwar hab ich im Spieler-Skript folgendes programmiert, sollte das so passen aus eurer Sicht? if (Input.GetButtonDown("Fire1")) { float xSpieler = transform.position.x; float ySpieler = transform.position.y; float xGeschossStart = xSpieler + 1.5f; float yGeschossStart = ySpieler; GameObject geschosss = Instantiate(prefabGeschossGruen, new Vector3(xGeschossStart, yGeschossStart, 0), Quaternion.identity); geschosse.Add(geschosss); } foreach(GameObject geschoss in geschosse) { if (geschoss != null) { float x = geschoss.transform.position.x; x += 1.7f * eingabeFaktor * Time.deltaTime; if (x > 9.05f) { geschosseToDestroy.Add(geschoss); } else { geschoss.transform.position = new Vector3(x, geschoss.transform.position.y, 0); } } } for (int i = geschosseToDestroy.Count-1; i >= 0; i--) { Destroy(geschosseToDestroy[i]); } geschosseToDestroy.Clear(); lg, Markus
  6. Hallo! Ok, danke für eure Antworten Werd da manche Ideen im Hinterkopf behalten was die Organisation der Projekte betrifft. lg, Markus
  7. Hallo, wenn ihr bei eurem Projekt zusätzliche separate Klassen anlegt, also z.B. diverse Helper-Klassen oder was auch immer - wo legt ihr die immer ab? Im selben Folder wie die ganzen Scripts zu den Gameobjects oder baut ihr euch da immer eine separate Folder-Struktur? lg, Markus
  8. Hallo, ich arbeite mich gerade mit einem Buch in Unity ein und da kommt es immer wieder vor daß in einem Skript public-Members angelegt werden welche dann in Unity als Slots beim Skript angezeigt werden. Auf diese Slots kann man dann per Drag and Drop Objekte raufziehen, aber was passiert da genau wenn ich ein Objekt raufziehe? Wird da beim Starten des Spiels der jeweilige public Member mit einer neuen Instanz des Objektes das man da raufgezogen hat befüllt? lg,Markus
  9. Hallo Sascha, danke für Deine Antwort, aber sind diese Sorting Layers nun was komplett anderes oder fügt sich das in Deine Layer-Beschreibung ein? Gehören die Sorting-Layers also zu den Layers so wie Du sie beschrieben hast? Mir ist das deswegen nicht ganz klar, weil ich mir drei Sorting Layers definiert hab (Hintergrund, MyLayer2 und MyLayer1), diese aber nicht drunter in der Liste der Layers (0-31) aufscheinen. lg, Markus
  10. Hallo, das Prinzip mit diesen Sorting Layers ist mir grundsätzlich klar, man kann Ebenen erstellen, Objekte dort drin platzieren und durch die Order in Layer - Eigenschaft ist es auch möglich die Reihenfolge der Objekte zu bestimmen (also wie die Objekte in derselben Ebene übereinanderliegen). Aber wo ist da jetzt der Unterschied zu den Layern die separat zu den Sorting Layers da sind? Da gibt's builtin Layers von Unity die man nicht ändern kann und die User Layers. lg, Markus
  11. Hallo, danke für eure Antworten, jetzt ist's mir schon um einiges klarer lg, Markus
  12. Hallo, irgendwie hab ich noch nicht so ganz verstanden was Input.GetAxis macht. Hab so einiges über Google gefunden, aber keine Ahnung, irgendwie hat sich das 100%ige Verständnis noch nicht eingestellt. Kann mir das jemand erklären? Was ich bisher rausgefiltert hab ist daß die Methode float-Werte zwischen -1 und +1 liefert. Und daß -1 bei vertikaler Achse (Input.GetAxis("vertical")) bedeutet daß "runter" gedrückt wurde bzw. umgekehrt +1 daß "rauf" gedrückt wurde, aber was bedeutet 0 bzw. die Werte dazwischen? lg, Markus
  13. Hallo Sascha, Hallo Jog, danke für eure ausführlichen Anworten Jetzt kann ich mir das schon etwas besser vorstellen. Mit einigen Begriffen fang ich im Moment klarerweise nocht net viel an, aber das wird schon nach und nach wenn man sich mit der Materie beschäftigt und rumexperimentiert. lg, Markus
  14. Hallo, ich habe bisher noch nie mit Unity gearbeitet, mich würden aber einige Dinge in Bezug auf die Realisierung von 3D Spielen interessieren. Mir ist natürlich klar daß das keine Sache ist die man so nebenher am Wochenende erledigt sondern daß da ein sehr hoher Aufwand an Programmierung und Erstellung der 3D Modelle dahintersteckt (bin selbst Software-Entwickler). Aber angenommen ich möchte mit Unity eine Eisenbahn-Simulation in der Art von Railroad Tycoon erstellen falls das noch jemand kennt. Man müsste da ja eine relativ weitläufige Landschaft erstellen in der man dann Schienen verlegt, Bahnhöfe platziert und natürlich sollen sich auch Züge zwischen den Bahnhöfen bewegen. Aber wie ist das hier mit Positionsangaben von diesen dreidimensionalen Objekten? Ein solches Objekt wie beispielsweise ein Gebäude besteht ja aus einer Unzahl von Punkten die letztendlich seine Form bestimmen, aber auf welchen Punkt bezieht sich die Positionsangabe dann? Und wie kriegt man das Ganze einigermaßen maßstabsgetreu hin? Ein Zug ist ja viel kleiner als eine Stadt und die Stationen in der Realität kilometerweit voneinander entfernt. Wenn man das verkleinert nach Unity übertägt, dann müsste der Zug ja eigentlich kaum mehr zu sehen sein oder? Mir geht's jetzt nicht um eine detaillierte Erklärung wie man das in Unity nun im Detail macht, eher um eine Erklärung wie das von der Geometrie her funktioniert sodaß es auch von den Distanzen und der Größe der Objekte realistisch wirkt. lg, Markus
  15. Hallo, steh gerade vor der Entscheidung welche Version von Unity ich runterladen soll. An kostenlosen Versionen gibt's da ja die Student- und die Personal Version. Bei letzterer steht irgendwas davon daß in den letzten 12 Monaten Einnahmen von nicht mehr als 100.000 US Dollar vorhanden sein dürfen oder so. Was steckt da dahinter bzw. wie will das jemand verifizieren? lg, Markus
×
×
  • Create New...