Как создать объекты на всю длину аудиоклипа

Моя общая цель - создать сценарий, который постоянно генерирует объект по оси Y, пока не перестанет воспроизводиться фрагмент звука. Речь идет о «звездных полях», которые представляют собой группы звезд, создающие эффект космического пространства. Это можно сделать легко, и я уже знаю, как это сделать, используя постоянную скорость. Самое сложное для меня - создать эти объекты с помощью объекта, который становится все быстрее и быстрее.

Чтобы уточнить это, есть ракета, которая летит все быстрее и быстрее, используя приведенные ниже скрипты, она умножает постоянную скорость, которую я установил (10), на движение от Vector3. Как видно из кода, он имеет ускорение 0,25. Идея состоит в том, что ракета продолжает лететь, пока не закончится звук, не перестанут появляться звезды и игра не закончится. Ракета постепенно становится все быстрее и быстрее, поэтому я не могу просто ее закодировать.

Ниже мой код для ракеты и скрипта появления звезды.

Это всего лишь один способ обойти проблему, я довольно долго пробовал разные вещи, но, похоже, ничего не работает. У меня есть чувство, что есть более простой способ обойти эту проблему.

Код появления звезды:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StarSpawn : MonoBehaviour {

    // Use this for initialization
    public Transform Object;
    AudioSource Music;
    float MusicClipLength;
    float distance;
    void Start()
    {
        Music = GetComponent<AudioSource>();
        AudioClip MusicClip;
        MusicClip = Music.clip;
        MusicClipLength = Music.clip.length;   //time


        distance = ((((0.5f * 0.25f) * (MusicClipLength * MusicClipLength))));   //distance
        float RoundedDistance = (float)Mathf.Floor(distance);   //rounding
        for (int i = 0; i <= RoundedDistance; i++)   //generation loop
        {
            Instantiate(Object, new Vector3(0, i * 1750.0f, 500), 
Quaternion.Euler(-90, 0, 90));
        }
    }
 }

Код ракеты (кое-что из этого не имеет значения)

using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;

public class PlayerController : MonoBehaviour
{

    public bool Launch = false;
    private Rigidbody rb;
    public int Speed;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    public void LaunchStart()
    {
        Launch = true;
    }


    void FixedUpdate()
    {
        float altitude = (rb.position.y);
        if (Launch == true)
        {
            float moveHorizontal = CrossPlatformInputManager.GetAxis("Horizontal");
            Vector3 movement = new Vector3(moveHorizontal, 0.25f, 0.0f);
            if (altitude > 0)
            { 
                rb.AddForce(movement * Speed);
            }
        }
    }
}

0,25 - это ускорение для всего, а 10 - это, например, установленная общедоступная скорость.

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

Редактировать

Моя настоящая проблема в том, что звезд слишком много. Итак, когда звук закончился, осталось еще много звезд.

в чем именно проблема? звезды не появляются? ракета не разгоняется?

ryeMoss 10.08.2018 17:27

Да извини, забыл об этом упомянуть. Проблема в том, что звезд слишком много.

William Edwards 10.08.2018 19:14
0
2
43
1

Ответы 1

Здесь, вероятно, было бы хорошим выбором использовать сопрограммы. После этого вы можете использовать скорость ракеты для определения временной задержки между появлением звезд:

float totaltime;

void Start()
{
    Music = GetComponent<AudioSource>();
    AudioClip MusicClip;
    MusicClip = Music.clip;
    MusicClipLength = Music.clip.length;   //time

    distance = ((((0.5f * 0.25f) * (MusicClipLength * MusicClipLength))));   //distance
    float RoundedDistance = (float)Mathf.Floor(distance);   //rounding
    StartCoroutine(Spawner());
}

void IEnumerator Spawner()
{
    totaltime += Time.deltaTime;
    while (totaltime < MusicClipLength)
    {
        Instantiate(Object, new Vector3(0, i * 1750.0f, 500), Quaternion.Euler(-90, 0, 90));
        yield return new WaitForSeconds(rocketspeedFactor); // you should mess around with this value to get the spawning frequency correct. 
        // would be good to retrieve the speed from the rocket and multiple by some factor
    }

}

Другие вопросы по теме