(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



DoTweenのDoTextにSE(効果音)を付ける【Unity】【DOTween】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2019.4.1f1


はじめに

Unityで位置や大きさなどのアニメーション、

いわゆるTweenを実装するアセットとしてお馴染みのDOTween

DOTween Pro | Visual Scripting | Unity Asset Store


以前、そのDOTweenでテキストの文字送りが出来るDoTextという物を紹介しましたが、

f:id:kan_kikuchi:20200626070703g:plain


今回はそのDoTextで文字送りをする際にSE(効果音)を付けてみようという感じの記事です。

イメージとしては以下のような感じ。



なお、記事中では以下のアセットを使っています。

GameMusicSound - Menu Sounds Pack | Audio Sound FX | Unity Asset Store



DoTextにSE(効果音)を付ける

今回は先にDoTextにSE(効果音)を付けるコードを載せます。

//文字送りする用のテキスト
[SerializeField]
private Text _text = default;

//SEを鳴らすためのやつ
[SerializeField]
private AudioSource _audioSource = default;
  
//SEを鳴らさない文字
private static readonly string[] INVALID_CHARS = {
  " ", " ", "!", "?", "!", "?", "\"", "\'", "\\",
  ".", ",", "、", "。", "…", "・"
};
    
/// <summary>
/// DOText(文字送り)を実行
/// </summary>
public void DOText() {

  //変化前のテキスト
  var beforeText = _text.text;
    
  //文字送り実行
  _text.DOText("これは  ダミーテキスト。\n何を入力しようか悩んだ結果……\nそれをそのまま入力する事にした!", 7)
    .SetEase(Ease.Linear)
    .OnUpdate(() => {//更新される度に実行される(※テキストが変更された時ではない)
      //現在のテキストを取得、変化していなければ処理しない
      var currentText = _text.text;
      if (beforeText == currentText) {
        return;
      }
      
      //新たに追加された文字を取得
      var newChar = currentText[currentText.Length - 1].ToString();
      
      //SEを鳴らさないやつでなければ鳴らす
      if (!INVALID_CHARS.Contains(newChar)) {
        _audioSource.Play();
      }
      
      //次のチェック用にテキスト更新
      beforeText = currentText;
    });

}


上記のコードを作成した後、

文字送りするTextとAudio Clipを設定したAudio SourceをInspectorで設定すれば準備完了。

なおAudio SourceのPlay On Awakeのチェックは外しておきましょう。

f:id:kan_kikuchi:20200628055231j:plain


あとはDoTextを実行すれば最初のイメージのような感じになります。



一応、簡単にコードを解説していくと、

DoTweenはOnUpdateでTweenの更新時に処理が出来るので、そこでテキストが変更されたかをチェック

//変化前のテキスト
var beforeText = _text.text;
    
//文字送り実行
_text.DOText("これは  ダミーテキスト。\n何を入力しようか悩んだ結果……\nそれをそのまま入力する事にした!", 7)
  .SetEase(Ease.Linear)
  .OnUpdate(() => {//更新される度に実行される(※テキストが変更された時ではない)
      //現在のテキストを取得、変化していなければ処理しない
      var currentText = _text.text;
      if (beforeText == currentText) {
        return;
      }


変更があれば追加された文字を取得し、

その文字がSEを鳴らさない文字(INVALID_CHARS)に該当しなければSEを鳴らすという流れです。

//SEを鳴らさない文字
private static readonly string[] INVALID_CHARS = {
  " ", " ", "!", "?", "!", "?", "\"", "\'", "\\",
  ".", ",", "、", "。", "…", "・"
};
//新たに追加された文字を取得
var newChar = currentText[currentText.Length - 1].ToString();
      
//SEを鳴らさないやつでなければ鳴らす
if (!INVALID_CHARS.Contains(newChar)) {
  _audioSource.Play();
}


なお今回はAudioSourceを直で再生してますが、

以前紹介したAudioManager等を使うともっと楽に実装出来るかと思います。