【问题标题】:How do i fix my spawning script from randomly stopping the spawning of enemies?如何修复我的生成脚本随机停止生成敌人?
【发布时间】:2017-06-06 18:04:15
【问题描述】:

我有一个简单的脚本,它可以生成具有可输入时间延迟的僵尸。该脚本似乎工作正常,但是,在我移动我的角色一段时间后,运行脚本的游戏对象停止产生僵尸。如果我的角色静止不动,僵尸将继续产生。红色箭头指向生成僵尸的游戏对象。

using UnityEngine;
using System.Collections;

public class spawn : MonoBehaviour
{
    public GameObject zombie;
    public float delayTime = 4f;

    IEnumerator Start()
    {
        var obj = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
        yield return new WaitForSeconds(delayTime);
        StartCoroutine(Start());
    }
}

场景设置如下:

【问题讨论】:

  • 可以控制播放器冻结应用程序吗?你说它只发生在玩家移动时。

标签: c# unity3d


【解决方案1】:

首先将生成函数与开始函数分开以避免混淆。

void Start()
{
    StartCoroutine(SpawningRoutine());
}

那么你希望你的协程永远继续生成吗?您需要在协程内有一个循环。在下面的示例中,我创建了一个无限循环,但您可以使用计数器来计算您想要的僵尸数量。

IEnumerator SpawningRoutine()
{
    while(true)
    {
        var obj = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
        yield return new WaitForSeconds(delayTime);
    }
}

最后记得把这个生成脚本放在一个不是僵尸的对象上。有一个单独的 spawn 对象,上面只有这个脚本。您可能已经这样做了。

编辑以响应日志记录:

像这样将日志脚本添加到您的僵尸预制件中:

private static int zombieCounter = 0;
void Start()
{
    Debug.Log("Number of zombies spawned so far: " + zombieCounter++);
}

【讨论】:

  • 我好像还是有问题
  • 你能贴一张你的僵尸预制件和播放器的屏幕截图,并且所有脚本都可见吗?场景中一定有其他东西干扰了您的生成器,
  • 非常感谢。您的 PlayerMove 脚本是否引用了 Spawner?或者您是否有任何可能影响生成器的键盘处理代码?
  • 我认为它实际上可能与我的拍摄脚本有关。因为当我射击时它会在不久后停止产卵
  • 很酷,这是一个很好的线索。可以在问题中发布你的拍摄脚本吗?
【解决方案2】:

你真的不需要为此使用协程,InvokeRepeating 应该足够好。还要确保你的僵尸预制件是私有的,这样它就不会被其他脚本替换

[SerializeField] private GameObject zombie;
float waitBeforeFirstSpawn = 0f;
float delayTime = 4f;

void Start()
{
    InvokeRepeating("SpawnZombie", waitBeforeFirstSpawn, delayTime);
}

void SpawnZombie()
{
    GameObject zombieGO = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
}

【讨论】:

  • 僵尸预制件是公开的,所以他可以在检查器中访问它
  • @DávidFlorek [SerializeField] 将使私有字段可以通过编辑器访问。
  • @DávidFlorek 是的,但从他所说的看来,他似乎在生成脚本之外的某个地方用 null 覆盖了他的僵尸预制件,因此它会为他修复它。此外 - 正如 Reasurria 所说 - 他可以设置 [SerializeField] 以从检查员访问它
  • 我认为他放了一个僵尸实例而不是预制件。因此,当他射击并杀死实例时,它会被销毁并从生成脚本中删除。
  • 可能也是这样。
猜你喜欢
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2020-12-30
  • 2011-10-26
相关资源
最近更新 更多