2016-04-27 1 views
2

オブジェクトと衝突した直後にオブジェクトをフェードアウトする方法はありますか?フェードアウトオブジェクト

Destroy (gameObject);このオブジェクトは、プレイヤーがコインに衝突したときにオブジェクトサウンドが再生されないと、このオブジェクトを破壊すると、そのオブジェクトが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); 

} 

現在CODE:

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関数で参照してください。また、代わりに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); 

     } 
} 

EDITgameObject.CompareTagを使用します。

は、あなたが3つの音を持っているあなたの質問に記載されていません。

その下余分なゲームオブジェクトを作成し、その後COINSOUNDSという名前ゲームオブジェクトを作成します。それらの名前をCOINSOUND1,COINSOUND2,COINSOUND3に変更し、それぞれのAudioSourceを添付します。 COINSOUNDS(親GameObject)にAudioSourceを添付しないでください。

COINSOUND1COINSOUND2COINSOUND3COINSOUNDSゲームオブジェクトの子でなければなりません。

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

    } 
} 

SOLUTION 3

また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

はうまく動作しますが、他の2と同じように3種類のコインがありますか? –

+0

@ AlanVieiraRezende 3つの異なるコインに同じスクリプトを添付します。それでも同じことが起こります。音を鳴らして破壊する – Programmer

+0

3つの硬貨sfx音がひどく聞こえる。 –

0

私はこのようにそれに近づくでしょう:

衝突では、更新文字の統計のような即時のことを行うの/ etc(必要であれば)、非アクティブにオブジェクトを設定し

ドゥクリーンアップ物(演奏音など)

オブジェクトを破棄する

このチュートリアルでは、オブジェクトは破棄されていますが、サウンドは再生されています。役に立つかもしれません:http://unity3d.com/learn/tutorials/projects/space-shooter/audio?playlist=17147

+0

私はSet Inactveを試してみますが、私はそのオブジェクトを画面上で凍らせて欲しいとは思っていません。私はあまりにもsetKinemact Falseを試していますが、これは満足できるものではありません。 –

+0

あなたはそれがまだ見えるようにしたいだけで、動かないのですか?私は、あなたが達成しようとしていることを理解しているかどうかはわかりません。 SetActive = falseはそれを破壊せず、ただそれを無効にします。SetActive = trueを実行することでそれを元に戻すことができます –