破坏粒子系统

3
在我的游戏中,球碰到硬币后,硬币会消失并初始化一个粒子系统。
我的问题是如何销毁这个粒子系统。我尝试编写以下代码:
Destroy(effect.gameObject)

但我收到了一个错误消息,告诉我没有gameObject的定义。

我的Unity版本是4.6.3

非常感谢您的帮助。

这是我的代码

public class CoinDestroyer : MonoBehaviour {
   public Transform coinEffect;
   void OnTriggerEnter (Collider other){
       if (other.tag == "Player"){
           var effect = Instantiate(coinEffect, transform.position, transform.rotation);
           Destroy(effect.gameObject, 3);
           Destroy(gameObject);
       }
   }
}
2个回答

2

Instantiate会返回一个Object类型的对象,它是Unity中最顶层的类(而不是.NET类型)。由于您使用了var effect,编译器认为effect是一个Object类型。但是,您需要一个GameObject类型,因为Object没有gameObject成员。

var effect = (GameObject)Instantiate(coinEffect, transform.position, transform.rotation);

使用 var 而不是强类型变量的危险之一是这样的。最好的方式是:

GameObject effect = (GameObject)Instantiate(coinEffect, transform.position, transform.rotation);

在这种情况下,如果缺少强制类型转换,编译器会抛出错误并抱怨Object不能成为GameObject,您需要进行强制类型转换。
我只在确切知道类型并且类型很长(例如KeyValuePair<string,List<GameObject>>)的情况下使用var,否则始终使用正确的类型。

这里有一个有趣的问题:http://stackoverflow.com/questions/35254388/ui-text-multiline-uneven-alignment/35258191#35258191,你有什么想法或知道一个能解决的包吗?祝超级碗日快乐 :) - Fattie
@fafase 感谢您的回复。我已经编辑了我的代码。但是我遇到了一个错误,告诉我无法从源类型转换为目标类型。 - Mahmoud Anwer
创建一个GameObject类型的硬币效果。 - Everts
@fafase 我已经修改了我的代码,变成了:
GameObject effect = (GameObject)Instantiate(coinEffect, transform.position, transform.rotation);
但是我遇到了强制转换的错误。
我还修改了coinEffect的声明为:
public GameObject coinEffect
但是我仍然得到了相同的错误。
- Mahmoud Anwer
我是指这个错误“无法从源类型转换为目标类型”。我的代码在不编辑任何内容的情况下运行良好,除了将“var”替换为“GameObject”之外。我之前编辑过我的代码并尝试运行游戏,但出现了我告诉你的错误。我不知道它现在是如何工作的 :) 。无论如何,非常感谢你。 - Mahmoud Anwer

0
你遇到的错误是因为包含 effect 的对象已被销毁,我建议你在粒子系统内使用脚本,在脚本中设置生命周期,可以使用以下脚本:
lifeTime = 1.0f
void Start() {
    Invoke ("SelfDestruct", lifeTime);
}

谢谢您的回复,我的问题已经解决了。但是您引起了我对一个重要部分的关注,不过我认为粒子系统本身并没有被销毁,因为我将其存储到一个名为effect的新变量中,所以任何时候当我想要销毁这个粒子时,我都可以这样做。 - Mahmoud Anwer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接