如何在音频剪辑的长度上实例化对象

时间:2018-08-10 14:08:21

标签: c# unity3d audio vector instantiation

我的总体目标是拥有一个脚本,该脚本不断沿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是设置的公共速度。

我意识到这是一个很大的问题,可以解决,因此即使有人意识到解决问题的简便方法,我也将非常感谢您提供任何建议。

编辑

我的实际问题是,繁星产生的星星太多了。因此,当音频结束时,仍然还有很多星星。

1 个答案:

答案 0 :(得分: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
    }

}