この記事でのバージョン
Unity 2019.4.1f1
はじめに
Unityで位置や大きさなどのアニメーション、
いわゆるTweenを実装するアセットとしてお馴染みのDOTween。
DOTween Pro | Visual Scripting | Unity Asset Store |
以前、そのDOTweenでテキストの文字送りが出来るDoTextという物を紹介しましたが、
今回はそのDoTextで文字送りをする際にSE(効果音)を付けてみようという感じの記事です。
イメージとしては以下のような感じ。
DoTweenのDoTextでテキストをSE付きで文字送り#Unity pic.twitter.com/lSz7fTaUvx
— カン@ゲームクリエイター(Unity/VR/Switch/Steam) (@Kan_Kikuchi) 2020年6月26日
なお、記事中では以下のアセットを使っています。
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のチェックは外しておきましょう。
あとはDoTextを実行すれば最初のイメージのような感じになります。
DoTweenのDoTextでテキストをSE付きで文字送り#Unity pic.twitter.com/lSz7fTaUvx
— カン@ゲームクリエイター(Unity/VR/Switch/Steam) (@Kan_Kikuchi) 2020年6月26日
一応、簡単にコードを解説していくと、
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等を使うともっと楽に実装出来るかと思います。