C# 如何在每一帧阻止游戏对象重生?
我遇到了一个小问题,我似乎无法完全理解如何解决,我尝试过无数次更改代码,但都没有成功:( 我以编程方式创建游戏对象,效果很好,但问题是游戏每帧创建一次对象(这并不完全是我想要的)!因此我设置了10秒的时间延迟,但它似乎无法正常工作C# 如何在每一帧阻止游戏对象重生?,c#,unity3d,coroutine,C#,Unity3d,Coroutine,我遇到了一个小问题,我似乎无法完全理解如何解决,我尝试过无数次更改代码,但都没有成功:( 我以编程方式创建游戏对象,效果很好,但问题是游戏每帧创建一次对象(这并不完全是我想要的)!因此我设置了10秒的时间延迟,但它似乎无法正常工作 public Vector3 spawnLocation; public GameObject myCube; // Use this for initialization void Start () { if (myCube.renderer.enabl
public Vector3 spawnLocation;
public GameObject myCube;
// Use this for initialization
void Start () {
if (myCube.renderer.enabled == false) {
Debug.Log("myCube not rendered");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
if (myCube == null) {
Debug.Log("myCube not set");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
// Update is called once per frame
void Update () {
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
}
void CreateCube() {
spawnLocation = new Vector3(24, 17, -28);
StartCoroutine(Delay());
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
IEnumerator Delay(){
yield return new WaitForSeconds(10);
}
对象在每一帧都会无限地出现-_-
谁能帮我指一下我要去的方向吗。
有没有更好的方法来实现这一点
我加了10秒的延时,但似乎不起作用
对
public Vector3 spawnLocation;
public GameObject myCube;
// Use this for initialization
void Start () {
if (myCube.renderer.enabled == false) {
Debug.Log("myCube not rendered");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
if (myCube == null) {
Debug.Log("myCube not set");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
// Update is called once per frame
void Update () {
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
}
void CreateCube() {
spawnLocation = new Vector3(24, 17, -28);
StartCoroutine(Delay());
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
IEnumerator Delay(){
yield return new WaitForSeconds(10);
}
延迟起作用,但您仍在更新中实例化多维数据集。
如果要每10秒实例化一个多维数据集,可以执行以下操作:
IEnumerator DelayCreateCube(float delay){
while(true)
{
yield return new WaitForSeconds(10);
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
}
public void Start()
{
StartCoroutine(DelayCreateCube());
}
通常(至少在您的情况下)在调用所有GameObjects
的所有Update
方法之后,引擎会在每一帧执行协同程序(这取决于协同程序)
当您使用startcroutine
时,它只是计划稍后执行协同程序,因此不会阻止执行Update
方法:
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
在上面的代码中,Delay
将仅在Update方法返回后执行,因此您实际上没有延迟执行Destroy
和CreateCube
方法
有关协同路由的更详细的描述,请参见此
编辑 还有一个需要考虑的问题。我不知道你到底想做什么,但似乎你想在同一个位置创建和销毁一个原语。如果你没有很好的理由这样做,你可以简单地启用/禁用对象,而不是创建一个新的对象并再次销毁它(为了性能) 我加了10秒的延时,但似乎不起作用 对
public Vector3 spawnLocation;
public GameObject myCube;
// Use this for initialization
void Start () {
if (myCube.renderer.enabled == false) {
Debug.Log("myCube not rendered");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
if (myCube == null) {
Debug.Log("myCube not set");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
// Update is called once per frame
void Update () {
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
}
void CreateCube() {
spawnLocation = new Vector3(24, 17, -28);
StartCoroutine(Delay());
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
IEnumerator Delay(){
yield return new WaitForSeconds(10);
}
延迟起作用,但您仍在更新中实例化多维数据集。
如果要每10秒实例化一个多维数据集,可以执行以下操作:
IEnumerator DelayCreateCube(float delay){
while(true)
{
yield return new WaitForSeconds(10);
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
}
public void Start()
{
StartCoroutine(DelayCreateCube());
}
通常(至少在您的情况下)在调用所有GameObjects
的所有Update
方法之后,引擎会在每一帧执行协同程序(这取决于协同程序)
当您使用startcroutine
时,它只是计划稍后执行协同程序,因此不会阻止执行Update
方法:
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
在上面的代码中,Delay
将仅在Update方法返回后执行,因此您实际上没有延迟执行Destroy
和CreateCube
方法
有关协同路由的更详细的描述,请参见此
编辑
还有一个需要考虑的问题。我不知道你到底想做什么,但似乎你想在同一个位置创建和销毁一个原语。如果你没有很好的理由这样做,你可以简单地启用/禁用对象,而不是创建一个新的对象并再次销毁它(为了性能).显然,其他人已经指出,每次更新()时,您都在创建一个多维数据集调用,它是一个游戏循环。假设你只想在一个偶数的时间间隔内创建对象,例如每X秒一次,你就应该考虑使用一个协同程序或一个调用程序。协同程序解决方案已经被解决了,下面给出:
void Start()
{
InvokeRepeating("CreateCube", 1.0f, 1.0f);
}
void CreateCube()
{
// create your cube here
}
显然,其他人已经指出了这样一个事实:每次更新()时,您都在创建一个多维数据集调用,它是一个游戏循环。假设你只想在一个偶数的时间间隔内创建对象,例如每X秒一次,你就应该考虑使用一个协同程序或一个调用程序。协同程序解决方案已经被解决了,下面给出:
void Start()
{
InvokeRepeating("CreateCube", 1.0f, 1.0f);
}
void CreateCube()
{
// create your cube here
}
每次游戏循环时,你都在调用
CreateCube()
。将其插入Start()
@David我试过了,但是如果我将CreateCube()
放入Start()
中,它只会创建一次游戏对象!我想无休止地创建myCube
,但有一个时间间隔。//更新()每帧调用一次。如果您是新手,请避免使用它,直到您学会如何实现事件模式,否则您将陷入噩梦。每次游戏循环时,您都会调用CreateCube()
。将其插入Start()
@David我尝试过,但如果我将CreateCube()
放入Start()
它只创建一次游戏对象!我想无休止地创建myCube
但有一个时间间隔//每帧调用一次Update()。如果你是新手,请避免使用它,直到你学会如何实现事件模式,否则你会陷入噩梦。你是想在Start()中调用DelayCreateCube(delay)
?@Kap:是的,我的错:)。我修复了它。我正在尝试创建一个原语,然后在几秒钟后销毁它,并重复相同的操作。经过一定时间后,我希望能够以3-5秒的间隔同时创建2个或更多的基本体。感谢您的帮助,myCube
游戏对象现在在我选择的指定延迟后出现。但是,它不会出现在相同的位置…我尝试过调整SpawnLocation()
,但仍然存在相同的问题。是否有我缺少的东西或有额外的代码行导致此问题?:(你是想调用Start()
中的DelayCreateCube(delay)
?@Kap:yes我的错:)。我修复了它。我正在尝试创建一个原语,然后在几秒钟后销毁它,并重复相同的操作。经过一定时间后,我希望能够以3-5秒的间隔同时创建2个或更多的基本体。感谢您的帮助,myCube
游戏对象现在在我的ch指定延迟后出现