Unity3D-クロスフェード、サウンドの操作の基礎(レッスン)



注目を集める画像:

ドングリは私たちが取り組んでいるゲームです、

このレッスンのスクリプトを使用します。



レッスンでは、約3つのタスクをすばやく簡単に実装します。





クロスフェードとは...
...私が「素人I」を理解しているように?



たとえば、Adobe Auditionのスクリーンショット。



画像



トラック(0)を取り、最初に音量を上げ(1) 、最後に減衰をかけます(2)

結果を開始点(3)と終了点(4)に複製し、減衰の十字線へのシフト(5)で、余分な部分を切り捨てます(6)

7-結果を保存します。



始めと終わりに少しの材料を失い、切断されます、うーん...始まりと終わりはお互いの混合物によって「汚染」されます。

もちろん、このようなことは別の方法で行うことができます。

たとえば、最初または最後で完全に「カット」し、um ...反対側の最初または最後に減衰の十字線を残します。

しかし、さらに多くの素材を「食べる」ことになります。



なぜこれをプログラムで行うのですか?



  • 1.怠だから。 AudacityAdobe Auditionを忘れるスクリプトを一度書くだけで十分でした
  • 2.ソースコードは元の形式で保存されます-最初を「食い尽くす」ことなく(最後まで)、

    最初と最後に歪みなし。
  • 3.トラックの任意のセグメントでトランジションを作成できます。スクリプトを終了したら、複数のトラックをミックスします-

    これはすべて、オーディオエディターでオーディオ素材をof笑することなく、時間を無駄にすることもありません。
  • 4.従来の方法では、フォーマットの選択が制限されます-* mp3からのループは、移行時に「ガタガタ」します。

    私の方法にはこの欠点がありません。
  • 5. Audacityのようなプログラム、申し訳ありませんが、ひどく不便です。 Adobe Auditionなどのプログラムには費用がかかります。


ネタバレの下のいくつかのオプション情報。



AudioMixerを介したUnity 5.0でのミキシングはおそらく素晴らしいでしょう。

ただし、ここで独自のソリューションが必要でした(レッスン作成時-バージョン4.5.2f1)。

それでは、順番に始めましょう。



0.準備作業







1.次のレベルへの移行時に、前のレベルの環境音のスムーズな減衰。

指定した時間が経過した後の削除



新しいjsスクリプトを作成します。愚かな名前が大好きです-FadeOutAndDestrTimerWhenNextLvlLoadと呼びます



最初に必要なことは、次のレベルに移動するときに「サウンド」オブジェクトが破壊されないようにすることです。

なんで? 次に、フェードアウトしてから削除します。



ドキュメントを読むために登ります。



ええ、次の行が必要です。

DontDestroyOnLoad (transform.gameObject);
      
      



それで十分です



要件に基づいて、3つの「変数」変数を検討します。





思考を線に変換する:



  var fadeTime = 0; var levelToExecute = 0; var DestroyTime = 0;
      
      





そう、スクリプトは2つの機能で構成されます-「タイマーの削除」と「減衰メカニズム」。



「タイマーの削除」から始めましょう。

ここではすべてが基本です:



  function OnLevelWasLoaded (level : int) { if (level == (levelToExecute)) { Destroy (gameObject, DestroyTime); //Destroy (gameObject, 20); //-   , . } }
      
      





ロードされたレベルの番号がウィンドウで指定されたlevelToExecuteと一致する場合、「削除タイマー」が開始されます-レベルがロードされた瞬間から、DestroyTimeウィンドウで指定された時間まで。



うーん、なぜ(まだ記述されていない)関数「減衰メカニズム」の起動をここにすぐに追加しないのですか? できます。



  function OnLevelWasLoaded (level : int) { if (level == (levelToExecute)) { FadeAudio(fadeTime, Fade.Out); // ,   - (  ) Destroy (gameObject, DestroyTime); } }
      
      





ここで、「減衰メカニズム」という関数を記述する必要があります。このメソッドは次のようになります。



  function FadeAudio (timer : float, fadeType : Fade) { var start = fadeType == Fade.In? 0.0 : 1.0; //  (  )     0  1 var end = fadeType == Fade.In? 1.0 : 0.0; //     1  0 var i = 0.0; //  () var step = 1.0/timer; // (""  )    /  while (i <= 1.0) { //   ,  "0" ()    "1"  ↓ , //    "0" i += step * Time.deltaTime; audio.volume = Mathf.Lerp(start, end, i); // Mathf.Lerp -       start, end,   "i" //     yield; } }
      
      





取得したものは次のとおりです。







2.3アンビエントとそれ自体の「ソフトウェア」ループ、レベルのロード時のアンビエントのスムーズな増幅



この部分に必要なほとんどすべてをすでに知っています。

少し追加します。



新しいjsスクリプトを作成し、StartFadeIn_CloneTimer_FadeOut_DestrTimerと呼びます

注意してください-名前はただの愚かではなく、関数の実行の順序を示し、私にとってとても便利です。

ところで、最初は1つのスクリプトで段落1と段落2-3を書きましたが、必要に応じて「ピース」を無効にする方が便利であることがわかりました。

それらをわずかに修正して結合できます。



記事の冒頭を振り返ってみましょう-将来のスクリプトの要件は何ですか?

音楽は、最終段階の約N秒前に、スムーズにフェードアウトし始め、自身の始まりへと増幅されます。



これを実装する方法について考えてみましょう。





思考を線に変換し、ここでも減衰と増幅があることをリストし、4つの変数を作成します。



  enum Fade {In, Out} //    -  ""  "" var prefab : Transform; //  "" var DestroyTime: float = 1; // ()   var CloneTime: float = 1; // ()   var fadeTime: float = 1; // /
      
      





「開始」機能を追加します。



  function Start(){ Spawn(); //↑  "" () FadeAudio(fadeTime, Fade.In ); //↑  "",         -  Destroy ((prefab as Transform).gameObject, DestroyTime); //↑      ,   DestroyTime }
      
      





次に、順番に、上記の関数を追加します。 クローニング:



  function Spawn(){ while( true ){ yield WaitForSeconds(CloneTime); //  ,    CloneTime for (var i : int = 0;i < 1; i++) { Instantiate (prefab, Vector3(i * 2.0, 0, 0), Quaternion.identity); } //   "" FadeAudio(fadeTime, Fade.Out); // ,    } }
      
      





すでに「フェード」機能があります-記事の最初の部分からコピーしてください:



  function FadeAudio (timer : float, fadeType : Fade) { var start = fadeType == Fade.In? 0.0 : 1.0; var end = fadeType == Fade.In? 1.0 : 0.0; var i = 0.0; var step = 1.0/timer; while (i <= 1.0) { i += step * Time.deltaTime; audio.volume = Mathf.Lerp(start, end, i); yield; Debug.Log (audio.volume); //      -  / } }
      
      





取得したものは次のとおりです。







トラックの長さを見て、秒に変換します= DestroyTime

計算が面倒な場合は、オンラインの分単位のコンバーター(Googleがサポート)を使用し、残りの秒を追加できます。

フェード時間の減算= CloneTime

取得した値をウィンドウに入力します。

目的のトラックをperfabに追加します。

味にフェード。



クローン/フェード期間/削除時間の前に遅延を確認する必要があります

記事の最初の部分のスクリプトの一時的なパラメーターと競合しませんでした-

そうしないと、次のレベルに移動するときに、トラックに自己削除する時間がなく、そのコピーの多くを作成し始めます。

...



そして最後に、なぜこれが行われるのかに興味があるなら:



steamcommunity.com/sharedfiles/filedetails/?id=252305314






All Articles