2016-04-27 3 views
2

Как я могу вытереть один объект сразу после столкновения с ним?Fade out object

Я не могу использовать Destroy (gameObject);, потому что этот объект является монетами с звуком efx, если я уничтожу его, как только звук объекта не будет воспроизводиться, когда игрок столкнется с монетой.

И если я не уничтожить то, монета сразу, вы зарабатываете очки каждый раз, когда вы ударный этой монету

Я использую Audio Mixer, так что на самом деле нужен звук монеты происходит от аудио источника к банке установите громкость в моих настройках.

Моя идея:

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 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); 

} 

ответ

1

Вам не нужно исчезать ничего. Просто присоедините AudioSource к Bee GameObject, который не будет уничтожен, а затем получите ссылку на него в функции Start. Кроме того, использование 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); 

     } 
} 

EDIT:

Не упоминается в вашем вопросе, что у вас есть 3 звуков.

Создать GameObjects именованного COINSOUNDS затем создать - дополнительного GameObjects под ним. Переименуйте их в COINSOUND1, COINSOUND2, COINSOUND3 и приложите AudioSource до каждый из них. Не присоединяйте AudioSource к COINSOUNDS (родительский объект GameOBject).

COINSOUND1, COINSOUND2, COINSOUND3 должен быть ребенок COINSOUNDS геймобжекты.

AudioSource[] coinCollectSound; 

void Start() 
{  
    coinCollectSound = new AudioSource[3]; 
    coinCollectSound[0] = GameObject.Find("COINSOUNDS/COINSOUND1").GetComponent<AudioSource>(); 
    coinCollectSound[1] = GameObject.Find("COINSOUNDS/COINSOUND2").GetComponent<AudioSource>(); 
    coinCollectSound[2] = GameObject.Find("COINSOUNDS/COINSOUND3").GetComponent<AudioSource>(); 
} 


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

     coinCollectSound[0].Play();//Play COINSOUND1 
     coinCollectSound[1].Play();//Play COINSOUND2 
     coinCollectSound[2].Play();//Play COINSOUND3 

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

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

    } 
} 

РЕШЕНИЕ 3

Вы можете также использовать 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); 
} 
+0

отлично работает хе-хе, но у меня есть 3 разных монеты, как и у других 2? –

+0

@AlanVieiraRezende Прикрепите тот же скрипт к вашим 3-мя различным монетам. Он все равно сделает то же самое. воспроизводить звук, а затем уничтожаться. – Programmer

+0

Я выразил плохо, 3 разных монеты звуков sfx. –

0

Я хотел бы подойти к нему так:

О столкновении, делать непосредственные вещи, как обновление статистики символов/и т.д.

Установите объект неактивен (если нужно)

Do (воспроизведение звука и т. д.)

Уничтожить объект

В этом учебнике есть объекты, которые уничтожаются, но все еще играют звуки.Может быть полезно: http://unity3d.com/learn/tutorials/projects/space-shooter/audio?playlist=17147

+0

Я пытаюсь установить Inactve, но я не хочу, чтобы объект, замороженный на экране, был уничтожен, я тоже пытаюсь установить Kinemact False, но никак не это было удовлетворительно. –

+0

Итак, вы хотите, чтобы он все еще был видимым, просто не двигался? Я не уверен, что понимаю, чего вы пытаетесь достичь. SetActive = false не уничтожает его, он просто отключает его, вы можете включить его, выполнив SetActive = true –