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

1

16.05.2016, 17:14

[Unity3D] "Problem" beim Löschen von Tiles

Hallöchen, ich schon wieder :)

undzwar hab ich ein kleines Problem auf das ich einfach keine Lösung finde. Ich erstelle hier per Script eine Art "EndlessRunner". Hierbei sollen, wenn der Spieler über eine gewisse Schwelle geht 2 Tiles entstehen und die ersten beiden(also die, die Chronologisch zu erst erstellt wurden) gelöscht werden. Wenn ich das ganze mit nur einer "linie" mache, Funktioniert es einwandfrei. Sobald ich aber die 2.Linie hinzu füge, verhält es sich ganz eigenartig. Es löscht anfangs zu schnell und nach ner gewissen Zeit holt der Spieler wieder auf und ist auf der Linie, und wenn es wieder etwas Länger geht, dann ist der Spieler vor der Linie. Ich habe es schon versucht in 2 Lists zu Speichern. Also die Linke linie in eine List und die Rechte in eine, aber dann passiert mehr als Magie und es entsteht nurnoch eine Linie. Anbei der Code, vllt gibt es irgend einen anderen Lösungsansatz?

Vielen Dank :)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GenerationScript : MonoBehaviour {

    public GameObject[] blocks;

    private float spawnZ = 1.0f;
    private float blockLenght = 1.0f;
    private int showBlocksMax = 35;
    private Transform playerTransform;
    private float safeZone = 13.0f;

    private List<GameObject> activeTiles;



    void Start () {
        activeTiles = new List<GameObject>();
        playerTransform = GameObject.FindGameObjectWithTag ("Player").transform;

      for(int i = 0; i <showBlocksMax; i++)
        {
            SpawnBlock(1);
            
        }
    }
    
    // Update is called once per frame
    void Update () {
        if(playerTransform.position.z -safeZone > (spawnZ - showBlocksMax * blockLenght))
        {
            SelectBlock();
            DeleteTile();
        }

    }

    private void SpawnBlock(int prefabIndex = -1)
    {
        GameObject go;
        go = Instantiate(blocks[prefabIndex]) as GameObject;
        go.transform.SetParent(transform);
        go.transform.position = Vector3.forward * spawnZ;
        spawnZ += blockLenght;
        activeTiles.Add(go);
    }

    private void DeleteTile()
    {
        Destroy(activeTiles[0]);
        activeTiles.RemoveAt(0);
    }

    private int RandomPrefabIndex()
    {
        if (blocks.Length <= 1)
        {
            return 0;
        }
        else return 1;
    }

    public void SelectBlock()
    {
        GameObject go;
        GameObject go1;
        int select = Random.Range(0, 2);

        if(select == 0)
        {
            go = Instantiate(blocks[0]) as GameObject;
            go.transform.SetParent(transform);
            go.transform.position = Vector3.forward * spawnZ;
            activeTiles.Add(go);

            go1 = Instantiate(blocks[Random.Range(1, 6)]) as GameObject;
            go1.transform.SetParent(transform);
            go1.transform.position = new Vector3(1, 0, spawnZ);
            activeTiles.Add(go1);

            spawnZ += blockLenght;
        }

        else
        {
            go = Instantiate(blocks[Random.Range(1, 6)]) as GameObject;
            go.transform.SetParent(transform);
            go.transform.position = Vector3.forward * spawnZ;
            activeTiles.Add(go);

            int select2 = Random.Range(0, 2);
            if(select2 == 0)
            {
                go1 = Instantiate(blocks[0]) as GameObject;
                go1.transform.SetParent(transform);
                go1.transform.position = new Vector3(1, 0, spawnZ);
                activeTiles.Add(go1);
            }
            else
            {
                go1 = Instantiate(blocks[Random.Range(1, 6)]) as GameObject;
                go1.transform.SetParent(transform);
                go1.transform.position = new Vector3(1, 0, spawnZ);
                activeTiles.Add(go1);
            }
        }
    }
}

2

16.05.2016, 18:33

Problem gelöst, habe vergessen spawnZ zu erhöhen und es löscht jeweils nur eins aber erstellt zwei.

Thread kann gelöscht werden.