Последовательный спаун блоков пути и рандомный спаун видов препятствий внутри них

154
06 октября 2021, 19:50

Как это реализовать? Приложил скрипт, который сейчас рандомно генерирует блоки БЕЗ препятствий.

Задача:

  1. Последовательная генерация блоков дороги из массива. Т.е на что заменить Random.Range?
  2. Случайная генерация препятствий из массива на каждом блоке в определенных координатах. Если считать от центра каждого блока, то, допустим, будет z = -1, 0, 1.


public class RoadSpawner : MonoBehaviour
{
    public GameObject[] RoadBlockPrefabs; 
    float startBlockXPos; // позиция для старт блока 
    int blocksCount = 4; // сколько изначально блоков генерируется
    float blockLength = 0;
    public Transform PlayerTransf;
    List<GameObject> CurrentBlocks = new List<GameObject>();
    public Vector3 startPlayerPos;
    public void Start()
    {
        startBlockXPos = PlayerTransf.position.x + 20f;
        blockLength = 80; // длина
        StartGame();
    }
    public void StartGame()
    {
        PlayerTransf.GetComponent<MovePlayer>().ResetPosition(); // вызываем метод  старт позиции
        foreach (var go in CurrentBlocks) 
            Destroy(go);
        CurrentBlocks.Clear(); 
        for (int i = 0; i < blocksCount; i++) 
            SpawnBlock();
    }
    public void LateUpdate()
    {
        CheckForSpawn();
    }
    public void CheckForSpawn()
    {
        // если игрок находится дальше на...., чем текущий блок
        if (CurrentBlocks[0].transform.position.x - PlayerTransf.position.x < -60)  
        {
            SpawnBlock();
            DestroyBlock();
        }
    }
    public void SpawnBlock()
    {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        Vector3 blockPos;
        if (CurrentBlocks.Count > 0)   
            blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLength, 0, 0);
        else
            blockPos = new Vector3(startBlockXPos, 0, 0);
        block.transform.position = blockPos;
        CurrentBlocks.Add(block);
    }
    public void DestroyBlock()
    {
        Destroy(CurrentBlocks[0]);
        CurrentBlocks.RemoveAt(0);
    }
}

Иллюстрация как пример.

Answer 1

1 Последовательная генерация.

for (int i = 0; i < blocksCount; i++) { SpawnBlock(); }
...
public void SpawnBlock () {
    int bnum = CurrentBlocks.Count%RoadBlockPrefabs.Length;
    GameObject block = Instantiate(RoadBlockPrefabs[bnum], transform);
}

2 Тупо прикрепить препятствие к блоку.

barrier.transorm.parent = CurrentBlocks[n].transform;
barrier.transorm.localPosition = new Vector3(-1, blockHeight*0.5f, 1);
READ ALSO
Как сделать progress bar в EditorWindow с Threading в Unity?

Как сделать progress bar в EditorWindow с Threading в Unity?

Мне надо сделать progress bar в EditorWindowДля этого я выполняю функцию расчётов в потоках: Thread thread = new Thread(_worker

199
Расшифровка ID в Access

Расшифровка ID в Access

имеется БД в которой находятся таблицы "Сотрудники" и "Отделы", в таблице "Сотрудники" в поле "Отдел" имеется ID отдела тип данных(Числовой), а в таблице...

259
Как отправить файл в ASP.NET Core MVC через модель?

Как отправить файл в ASP.NET Core MVC через модель?

У меня появилась необходимость загружать файл вместе с дополнительными даннымиОбычно я отправлял данные в контроллер так:

145
WPF effect - проблемы с перерисовкой окна

WPF effect - проблемы с перерисовкой окна

В проекте использую C# и WPF, NetFramework 4

174