Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

1

27.05.2015, 02:50

Endless 2D TerrainGenerator

Hallo Leute

ich arbeite zurzeit an einem endlosen 2D TerrainGenerator in Unity. Ich erstelle zusätzliches Terrain zur Laufzeit über die Kameraposition, heißt ich frage ab ob von der aktuellen Kameraposition aus z.b. 50 Einheiten weiter links schon Terrain vorhanden ist wenn nicht erstelle ich welches. Das überprüfen ob Terrain vorhanden ist funktioniert mit Physics2D.OverlapCircle().

So das ganze funktioniert auch soweit jetzt folgendes Problem man kann die Kamera mit WASD bewegen solange ich mich nach Oben oder Rechts bewege ist alles im grünen Bereich das Script erstellt da wo kein Terrain ist neues Terrain und da wo welches ist pasiert nichts. Jetzt passiert aber was seltsames und ich verstehe einfach nicht warum wenn ich mich nach Unten oder Links bewege scheint er irgendwie bereits vorhandenes Terrain gekonnt zu ignorieren und erstellt einfach immer weiter an der gleichen Stelle das gleiche Terrain, die FPS sinken auf ca. 2. Jetzt kommt für mich noch mehr Verwirrung dazu wenn ich mich jetzt wieder nach Oben oder Rechts bewege ist alles wieder in Ordnung die FPS steigen und alles funktioniert wie gewollt.

Entweder ich stehe echt auf richtig übel auf 'nem Schlauch oder bei Unity läuft was schief, aber meistens ist es ja der Bediener der den Fehler macht. Ich hoffe echt mir kann da jemand von euch klugen Köpfen helfen.

2

27.05.2015, 05:39

Entweder ich stehe echt auf richtig übel auf 'nem Schlauch oder bei Unity läuft was schief, aber meistens ist es ja der Bediener der den Fehler macht. Ich hoffe echt mir kann da jemand von euch klugen Köpfen helfen.


Ich kenne mich zwar mit Unity nicht aus, aber ganz ohne Code wird es nur ein Wildes Gerate statt irgend einer Hilfe.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

3

27.05.2015, 06:24

Funktion zum finden des Objects:

C#-Quelltext

1
2
3
4
5
6
7
8
9
bool FindGameObjectAt(Vector2 pos)
    {

        if (Physics2D.OverlapCircle (pos, 1f) == null)
            return false;
        else
            return true;

    }


und hier prüfe ich ob ein Terrain generiert wurde oder nicht:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
        if (!FindGameObjectAt (new Vector2 (playerCam.transform.position.x + 50f, playerCam.transform.position.y))) {
            
            createPos.x = Mathf.RoundToInt((playerCam.transform.position.x + 50f)/10); //rundet auf 10,20,30,40 usw auf (Tileabstand)
            createPos.x = createPos.x * 10;
            
            createPos.y = Mathf.RoundToInt((playerCam.transform.position.y / 10));
            createPos.y = createPos.y * 10;
            
            GameObject sprite = (GameObject)Instantiate(Empty, new Vector3(createPos.x, createPos.y), Quaternion.identity); //Erstellt ein leeres sprite an der richtigen Position
            sprite.GetComponent<SpriteRenderer>().sprite = Sprite.Create(CalcNoise(xOrg*(createPos.x/10), yOrg*(createPos.y/10)), new Rect (0, 0, pixWidth, pixHeight), new Vector2 (0, 0)); //Gib dem Sprite den TerrainSprite der mit PerlinNoise generiert wurde
            
        }


Das ist alles, hab bei der ersten Funktion mal breakpoints gesetzt bei den returns, es gibt in dem oben beschrieben Fall einfach false zurück obwohl an der Stelle ein Gameobject vorhanden ist.

4

27.05.2015, 07:08

Ich bin auch nicht firm in C#, aber die +50 auf der x Achse verschiebet ja immer die zu überprüfende Position nach rechts und das ist natürlich ungünstig wenn du etwas links der Kamera prüfen willst.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (27.05.2015, 07:19)


Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

5

27.05.2015, 17:16

Ich hab mal folgendes Bild gemalt um das ganze zu verdeutlichen.

Die +50 liegen ausserhalb der Kamera weil der Spieler nicht sehen soll wie Terrain nachgeladen wird. Ich checke also von der Kameraposition aus 50 Einheiten in meinem Fall entspricht das 5 Tiles ob dort schon ein Terrain vorhanden ist, wenn nicht erstelle ich dort eins ich runde dann auf volle zehner weil das der Tileabstand ist jedes Sprite ist bei 0,0 0,10 20,30 und so weiter ich hoffe man verstehts.

Während ich überlegt hab ist mir ne Idee gekommen wie ich das ganze anders realisieren könnte ich könnte eine Dictionary<Vector2, GameObject> erstellen und darin alle Tiles speichern und dann einfach abfragen ob bei 0,0 0,10 usw. schon ein Tile vorhanden ist?
»Dreat« hat folgendes Bild angehängt:
  • sceneview.png

6

27.05.2015, 18:00

Ich hab mal folgendes Bild gemalt um das ganze zu verdeutlichen.

Die +50 liegen ausserhalb der Kamera weil der Spieler nicht sehen soll wie Terrain nachgeladen wird. Ich checke also von der Kameraposition aus 50 Einheiten in meinem Fall entspricht das 5 Tiles ob dort schon ein Terrain vorhanden ist, wenn nicht erstelle ich dort eins ich runde dann auf volle zehner weil das der Tileabstand ist jedes Sprite ist bei 0,0 0,10 20,30 und so weiter ich hoffe man verstehts.

Während ich überlegt hab ist mir ne Idee gekommen wie ich das ganze anders realisieren könnte ich könnte eine Dictionary<Vector2, GameObject> erstellen und darin alle Tiles speichern und dann einfach abfragen ob bei 0,0 0,10 usw. schon ein Tile vorhanden ist?


Ja genau so habe ich den Code Verstanden. Und was passiert jetzt wenn du dich nach links bewegst?
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

7

28.05.2015, 19:34

Wenn ich mich nach links bewege dann verringert sich die Kameraposition in der X-Achse z.b. von 100 auf 94.5633 und dann check ich ob bei 94.5633 + 50 Terrain vorhanden ist wenn ja soll nichts passieren wenn nein erstell neues.

8

28.05.2015, 19:37

Wenn ich mich nach links bewege dann verringert sich die Kameraposition in der X-Achse z.b. von 100 auf 94.5633 und dann check ich ob bei 94.5633 + 50 Terrain vorhanden ist wenn ja soll nichts passieren wenn nein erstell neues.

Genau! Und jetzt überlege dir an welcher Position du eigentlich dein Terrain neu genriert hättest!
Dann solltest du dein Problem gelöst haben :D
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

9

29.05.2015, 17:22

Ich komm nicht drauf ich erstelle doch dann Terrain wenn keins da ist und wenn ich mich nach rechts bewege müsste meine Überprüfung doch auf vorhandenes Terrain kommen und dieses auch zurückgeben da die Terrains einen Collider haben ist es ja egal an welcher Position des Terraintiles ich prüfe.

10

29.05.2015, 18:36

Puhhh harte Nuss!

So jetzt schau dir nochmal dein Bild an.

Dein Problem war nach Links und Rückwärts bewegen generiert dir kein neues Terrain.

Jetzt gehe mal im Kopf auf deinem Bild 4 Felder nach links und über lege dir bei jedem Schritt wo überprüft wird ob Terrain existiert.

Also entweder stehst du sowas von auf dem Schlauch, oder ich Verstehe etwas Total falsch.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige