Страница 1 из 1

Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 14:01
50VAJJ
Привет. Пишу скрипт для генерации платформ для endless runner. Игрок стоит на месте, а платформы двигаются. Вот так я генерирую платформы:
Синтаксис:
Используется csharp
    public Transform spawnPoint;

    public GameObject[] tilePrefabs;

    public float reloadTime;

    public float tileSpeed;

    public bool inSpawn;

    IEnumerator SpawnCo;
    private void Start()
    {
        SpawnCo = SpawnCoroutine();
        StartCoroutine(SpawnCoroutine());
    }

    private void Update()
    {
        if (!inSpawn )
        {
            StartCoroutine(SpawnCoroutine());
        }
    }

    IEnumerator SpawnCoroutine()
    {
        inSpawn = true;
        SpawnTile();
        tileSpeed += 0.3F;
        yield return new WaitForSeconds(30/tileSpeed);//30 - это длина платформы, tileSpeed - это скорость движения платформы
        inSpawn = false;
    }

    private void SpawnTile()
    {
        tile = Instantiate(tilePrefabs[0], spawnPoint.transform.position, Quaternion.identity);
        tile.transform.SetParent(transform);
    }
 


Проблема в том, что между платформами есть просвет длиной где то в 0,5 единицы. Конечно, можно дописать, что-то типа WaitForSeconds(30/tileSpeed-0.5F), чтобы убрать просвет, но что-то мне подсказывает, что это неправильное решение. Может мой метод вообще не правильный?

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 15:19
Friend123
Не бывает правильных или неправильных решений. Есть просто решение, чем больше опыта, тем оптимальнее оно становится.
Ваш код работает как вам надо? Если да, то больше ничего и не требуется.

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 15:34
50VAJJ
Friend123 писал(а):Не бывает правильных или неправильных решений. Есть просто решение, чем больше опыта, тем оптимальнее оно становится.
Ваш код работает как вам надо? Если да, то больше ничего и не требуется.

К сожалению не так как надо, так как есть просвет. А убирать просвет подстановкой константы - это крайне не оптимальное решение.

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 16:11
1max1
Когда спавнишь платформу смещай ее позицию так, чтобы не было просвета.

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 19:01
Friend123
50VAJJ писал(а):К сожалению не так как надо, так как есть просвет. А убирать просвет подстановкой константы - это крайне не оптимальное решение.

Чтобы не затачиваться на временную переменную, запоминаем в переменной последнюю созданную платформу и когда создаем новую берем координаты предыдущей и + длина платформы, она должна как раз встать как надо, перед предыдущей.

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 19:39
50VAJJ
Friend123 писал(а):
50VAJJ писал(а):К сожалению не так как надо, так как есть просвет. А убирать просвет подстановкой константы - это крайне не оптимальное решение.

Чтобы не затачиваться на временную переменную, запоминаем в переменной последнюю созданную платформу и когда создаем новую берем координаты предыдущей и + длина платформы, она должна как раз встать как надо, перед предыдущей.


Синтаксис:
Используется csharp
    private void SpawnTile()
    {
        if(tile == null)
        {
            tile = Instantiate(tilePrefabs[0], spawnPoint.transform.position, Quaternion.identity);
        }
        else
        {
            tile = Instantiate(tilePrefabs[0], new Vector3(spawnPoint.transform.position.x, spawnPoint.transform.position.y , tile.transform.position.z + tile.transform.localScale.z) , Quaternion.identity);
        }
       
        tile.transform.SetParent(transform);
    }


Все равно есть просвет.

Re: Скрипт для генерации платформ для endless runner.

СообщениеДобавлено: 20 ноя 2018, 20:25
1max1
Ну и при чем тут скейл? Бери беспросветную дистанцию (та при которой нет просвета) между платформами за константу.
Вычисляешь спавн точку так - prev.position + direction * distConst;
prev - последняя платформа, direction - нормаль направления, ну и distConst дистанция офсета.
Это псевдокод, параметры думаю сам подберешь.