Unity3D - 实例化的游戏对象丢失方法?

Unity3D - Instantiated gameobject loses method?

大家好,感谢您抽出宝贵时间。

我目前正在 Unity 中处理 2D 内容,遇到以下问题:

我们有一个定期创建 'thing':

的生成器
public float spawnTime = 3;
public Object thing; //public GameObject thing;

// Use this for initialization
void Start () {
    InvokeRepeating("spawn", spawnTime, spawnTime);
}

void spawn ()
{
    Vector3 pos = new Vector3(-14, 0, 0);
    Quaternion ori = new Quaternion(0, 0, 0, 0);
    Instantiate(thing, pos, ori);

}

它做得很好。见面 'thing':

void Start () {
    InvokeRepeating("move", 0.1f, 0.1f);
}

void move()
{
    transform.Translate(0.2f, 0, 0);
    if (this.transform.position.x > 14)
    {
        Destroy(this); //Destroy(GameObject);

所以基本上创建了一个 'thing',将自身从 -14 拉到 14,然后窒息。

问题:一旦第一个 'thing' 被删除,新创建的(不是已经移动的)就不会从 -14 移动。

我想我没有正确指定要定期调用的方法,但无法在 unity3d top-down-shooter 或类似示例中找到合适的解决方案。

再次感谢。

€:应用提议的更改后,生成器在 3 个创建周期后停止创建 'thing's。

€:我的错误是没有使用 'thing' 作为预制件(如漂亮的答案中所述将其拖入 "assets")所以我引用了一个即将删除的实例 'thing'。把它拖下地狱(资产),从此过得很幸福。

我只用这些脚本重新创建了您的设置,我得到的是对象没有被破坏,但新生成的对象正确移动到 14 点。

它们没有被销毁的原因是,您调用 Destroy(this); 会销毁脚本组件,而不是游戏对象。所以这应该是 Destroy(gameObject); 。有了这个修复,它对我来说运行得很好。

另外,如果没有特殊原因需要使用object,你的public Object thing;最好是public GameObject thing;.

编辑:

我是如何设置的:

  • 创建了 Empty(将其重命名为 Spawner
  • 创建了一个 Sphere(作为我的 thing,将其重命名为 Ball
  • 通过将预制件拖到资产文件夹中来制作 Ball 预制件
  • 从场景中删除了球
  • 创建了一个 Spawner 脚本并将生成代码放入其中
  • 创建了一个 Ball 脚本并将您的移动代码放入其中
  • 对脚本进行了两项更改
  • Spawner 脚本放在生成器游戏对象上
  • Ball 预制件拖到 Spawner
  • public GameObject thing
  • Ball脚本放在球预制件上

完成。