我的总体目标是拥有一个脚本,该脚本不断沿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是设置的公共速度。
我意识到这是一个很大的问题,可以解决,因此即使有人意识到解决问题的简便方法,我也将非常感谢您提供任何建议。
我的实际问题是,繁星产生的星星太多了。因此,当音频结束时,仍然还有很多星星。
答案 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
}
}