C# 淡出对象

C# 淡出对象,c#,unity3d,unityscript,C#,Unity3d,Unityscript,如何在与一个物体碰撞后立即淡出 我不能使用Destroy(游戏对象)因为该对象是一个带有efx声音的硬币游戏,如果我破坏了它,当玩家与硬币碰撞时,该对象的声音不会播放 如果我不破坏它,立即投币,你每次撞到这枚硬币都会获得点数 我使用音频混音器,所以真的需要硬币的声音来自音频源,可以设置我的设置音量 我的想法是: void OnCollisionEnter2D(Collision2D colisor) { if (colisor.gameObject.tag == "Bee") {

如何在与一个物体碰撞后立即淡出

我不能使用
Destroy(游戏对象)因为该对象是一个带有efx声音的硬币游戏,如果我破坏了它,当玩家与硬币碰撞时,该对象的声音不会播放

如果我不破坏它,立即投币,你每次撞到这枚硬币都会获得点数

我使用音频混音器,所以真的需要硬币的声音来自音频源,可以设置我的设置音量

我的想法是:

void OnCollisionEnter2D(Collision2D colisor)
{
    if (colisor.gameObject.tag == "Bee") {

        GetComponent<AudioSource> ().Play();

        // Here set Fade ou immediateley (idk how do)

        // Set Box Collider FALSE, no more extra points =]
        this.GetComponent<BoxCollider2D>().enabled = false;

        score.AddScore (point);

        // Destroy object after 1 sec, now can play efx sound
        Destroy (gameObject, 1f);
    }

    if (colisor.gameObject.tag == "floor") {
        Destroy (gameObject, 1.5f);

}
void oncollisioninter2d(Collision2D colisor)
{
如果(colisor.gameObject.tag==“Bee”){
GetComponent().Play();
//这里立即设置淡入淡出(idk how do)
//将长方体碰撞器设置为FALSE,不再有额外的点=]
this.GetComponent().enabled=false;
score.AddScore(分数);
//1秒后摧毁目标,现在可以播放efx声音
销毁(游戏对象,1f);
}
如果(colisor.gameObject.tag==“地板”){
销毁(游戏对象,1.5f);
}
当前代码:

    void OnCollisionEnter2D(Collision2D colisor)
{
    if (colisor.gameObject.tag == "Bee") {

        GetComponent<AudioSource> ().Play();
        score.AddScore (point);
        Destroy (gameObject);
    }

    if (colisor.gameObject.tag == "floor") {
        Destroy (gameObject, 1.5f);

}
void oncollisioninter2d(Collision2D colisor)
{
如果(colisor.gameObject.tag==“Bee”){
GetComponent().Play();
score.AddScore(分数);
摧毁(游戏对象);
}
如果(colisor.gameObject.tag==“地板”){
销毁(游戏对象,1.5f);
}

您不需要褪色任何东西。只需将音频源连接到未被破坏的Bee游戏对象,然后在开始功能中获取对它的引用。也可以使用
GameObject.CompareTag
而不是
if GameObject.tag

AudioSource coinCollectSound;

void Start()
{
    coinCollectSound = GameObject.Find("Bee").GetComponent<AudioSource>();
}

void OnCollisionEnter2D(Collision2D colisor)
    {
        if (colisor.gameObject.CompareTag ("Bee"))
        {

            coinCollectSound.Play();

            score.AddScore (point);
            Destroy(gameObject);
        }

        if (colisor.gameObject.CompareTag("floor"))
        {
            Destroy(gameObject, 1.5f);

        }
}
解决方案3

您也可以使用
coroutine
。启动coroutine,淡入图像,播放声音,等待声音播放完成,然后销毁。这只能在coroutine中完成。这看起来比我的其他解决方案更好。您不必使用下面的代码修改当前场景中的任何内容

SpriteRenderer coinSpriteRenderer;
AudioSource coinCollectSound;

void Start()
{
    coinCollectSound = gameObject.GetComponent<AudioSource>();
    coinSpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
}

void OnCollisionEnter2D(Collision2D colisor)
{
    if (colisor.gameObject.CompareTag("Bee"))
    {

        score.AddScore (point);
        StartCoroutine(fadeAndWaitForSound(1));
    }

    if (colisor.gameObject.CompareTag("floor"))
    {
        StartCoroutine(fadeAndWaitForSound(1));
    }

}

IEnumerator fadeAndWaitForSound(float fadeTimeInSeconds = 1)
{

    Color currentColor = coinSpriteRenderer.color;

    Color invisibleColor = coinSpriteRenderer.color;
    invisibleColor.a = 0; //Set Alpha to 0


    float counter = 0;

    //Play sound
    coinCollectSound.Play();

    //Wait till sound is done playing
    while (coinCollectSound.isPlaying)
    {
        yield return null; 
    }

    //Now Fade texture
    while (counter < fadeTimeInSeconds)
    {
        counter += Time.deltaTime;
        coinSpriteRenderer.color = Color.Lerp(currentColor, invisibleColor, counter / fadeTimeInSeconds);
        yield return null;
    }

    //Destroy after fading
    Destroy(gameObject);
}
spritender-coinspritenderer;
声源;
void Start()
{
coinCollectSound=gameObject.GetComponent();
coinspriterender=gameObject.GetComponent();
}
void oncollisionInter2D(碰撞2D colisor)
{
if(colisor.gameObject.CompareTag(“蜜蜂”))
{
score.AddScore(分数);
开始例行程序(fadeAndWaitForSound(1));
}
if(colisor.gameObject.CompareTag(“地板”))
{
开始例行程序(fadeAndWaitForSound(1));
}
}
IEnumerator fadeAndWaitForSound(浮点fadeTimeInSeconds=1)
{
Color currentColor=COINSPRINTERENDER.Color;
颜色不可见颜色=coinspitterender.Color;
invisibleColor.a=0;//将Alpha设置为0
浮点计数器=0;
//播放声音
播放声音;
//等待声音播放完毕
while(coincollectionsound.isplay)
{
收益返回空;
}
//现在淡出纹理
while(计数器
我会这样处理:

碰撞时,立即执行更新角色统计等操作

将对象设置为非活动(如果需要)

做清洁工作(播放声音等)

摧毁目标


本教程中的对象被销毁,但仍在播放声音。这可能会有所帮助:

效果很好,呵呵,但我有3个不同的硬币,就像我对其他2个硬币所做的一样?@AlanVieiraRezende将相同的脚本附加到你的3个不同硬币上。它仍将执行相同的操作。播放声音,然后得到销毁。我表达得不好,3个不同的硬币sfx声音@AlanVieiraRezende好的。你必须知道哪种声音是哪种声音,或者你只是想随机播放这三种声音中的一种吗?我做了一些小改动,以符合我的要求,非常完美!再次感谢!我尝试在电视中设置,但我不希望冻结在屏幕上的对象被破坏,我也尝试设置Kinemact False,但这不可能是令人满意的。所以你希望它仍然可见,只是不移动?我不确定我是否理解你想要实现的目标。SetActive=false不会破坏它,它只是禁用它,你可以通过执行SetActive=true来重新打开它
SpriteRenderer coinSpriteRenderer;
AudioSource coinCollectSound;

void Start()
{
    coinCollectSound = gameObject.GetComponent<AudioSource>();
    coinSpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
}

void OnCollisionEnter2D(Collision2D colisor)
{
    if (colisor.gameObject.CompareTag("Bee"))
    {

        score.AddScore (point);
        StartCoroutine(fadeAndWaitForSound(1));
    }

    if (colisor.gameObject.CompareTag("floor"))
    {
        StartCoroutine(fadeAndWaitForSound(1));
    }

}

IEnumerator fadeAndWaitForSound(float fadeTimeInSeconds = 1)
{

    Color currentColor = coinSpriteRenderer.color;

    Color invisibleColor = coinSpriteRenderer.color;
    invisibleColor.a = 0; //Set Alpha to 0


    float counter = 0;

    //Play sound
    coinCollectSound.Play();

    //Wait till sound is done playing
    while (coinCollectSound.isPlaying)
    {
        yield return null; 
    }

    //Now Fade texture
    while (counter < fadeTimeInSeconds)
    {
        counter += Time.deltaTime;
        coinSpriteRenderer.color = Color.Lerp(currentColor, invisibleColor, counter / fadeTimeInSeconds);
        yield return null;
    }

    //Destroy after fading
    Destroy(gameObject);
}