【Unity】表示されているテキストと表情のアニメーションを連携させる方法
下の「腹話術Unityちゃん」のように、表示されるテキストと話すアニメーションを連携させるため、「テキストの母音を取得し、それに合わせて表情のアニメーションを変える」ということをしたかったのですが、「テキストの母音を取得する」のが意外とデフォルトのメソッドではうまくできなかったのでメモ。
→後で見返してみたら別にデフォルトのメソッドでも処理できたので追記。ページの一番下にデフォルトメソッド版のスクリプトも追記しました。

環境
- Unity 5.6.0f3
このページの構成
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Linq; public class GetVowel : MonoBehaviour { public Text uiText; //適当な文字を入れたTextを用意し、inspectorで指定しておいてください string text; //テキストの母音を判断するための配列たち string[] aLine = {"あ","か","さ","た","な","は","ま","や","ら","わ","が","ざ","だ","ば","ぁ","ゃ","ゎ"}; string[] iLine = {"い","き","し","ち","に","ひ","み","り","ぎ","じ","ぢ","び","ぃ"}; string[] uLine = {"う","く","す","つ","ぬ","ふ","む","ゆ","る","ぐ","ず","づ","ぶ","ぅ","っ","ゅ"}; string[] eLine = {"え","け","せ","て","ね","へ","め","れ","げ","ぜ","で","べ","ぇ"}; string[] oLine = {"お","こ","そ","と","の","ほ","も","よ","ろ","を","ご","ぞ","ど","ぼ","ぉ","ょ"}; string[] nLine = {"ん","、","。"}; void Start () { text = uiText.text; StartCoroutine(ShowVowel (text)); } IEnumerator ShowVowel(string text){ for (int i = 0; i < text.Length; i++) { string vowel = GetTextVowel (text [i].ToString ());// uiText.text += vowel; uiText.text += " "; //表示調整用のスペース yield return new WaitForSeconds (0.2f); } } string GetTextVowel(string text){ if(text.IncludeAny(aLine)) return "a"; if(text.IncludeAny(iLine)) return "i"; if(text.IncludeAny(uLine)) return "u"; if(text.IncludeAny(eLine)) return "e"; if(text.IncludeAny(oLine)) return "o"; if(text.IncludeAny(nLine)) return "n"; return ""; } } //ある文字列が、listで指定した文字列に含まれる場合、trueを返す拡張メソッド //以下のリンク先のものをそのまま使わせていただいています //→ http://baba-s.hatenablog.com/entry/2014/11/18/104153 public static class StringExtensions { public static bool IncludeAny( this string self, params string[] list ) { return list.Any( c => self.Contains( c ) ); } } |
実行イメージ

とても簡単な解説
処理としては単純で、以下のことを行っています。
- テキストを取得する。
- テキストの文字を一文字ずつ取り出し、拡張メソッドを通して母音を取得する。
- 母音を表示する。
ややこしいのは拡張メソッドの部分だけかと思います。
上記のスクリプトでいうと、text[ i ]の中身が「”あかさたなはまやらわ”の中に含まれるならば”あ行”」というような判断をしたかったのですが、これがデフォルトのメソッドではうまく処理できなかったため、拡張メソッド includeAny() を作成しています。
拡張メソッドについては、以下の「参考リンク」をご覧ください。
ここで取得した母音に応じて表情を変えるようにすると、テキストと表情をリンクさせた表現もできるようになります。
参考リンク
追記:デフォルトメソッド版スクリプト
拡張メソッドを使用しなくても母音の取得ができたので追記。変わっているのは GetTextVowel() のところだけです。Containsを使って処理を行っています。
公式スクリプトリファレンス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Linq; public class GetVowel : MonoBehaviour { public Text uiText; //適当な文字を入れたTextを用意し、inspectorで指定しておいてください string text; //テキストの母音を判断するための配列たち string[] aLine = {"あ","か","さ","た","な","は","ま","や","ら","わ","が","ざ","だ","ば","ぁ","ゃ","ゎ"}; string[] iLine = {"い","き","し","ち","に","ひ","み","り","ぎ","じ","ぢ","び","ぃ"}; string[] uLine = {"う","く","す","つ","ぬ","ふ","む","ゆ","る","ぐ","ず","づ","ぶ","ぅ","っ","ゅ"}; string[] eLine = {"え","け","せ","て","ね","へ","め","れ","げ","ぜ","で","べ","ぇ"}; string[] oLine = {"お","こ","そ","と","の","ほ","も","よ","ろ","を","ご","ぞ","ど","ぼ","ぉ","ょ"}; string[] nLine = {"ん","、","。"}; void Start () { text = uiText.text; StartCoroutine(ShowVowel (text)); } IEnumerator ShowVowel(string text){ for (int i = 0; i < text.Length; i++) { string vowel = GetTextVowel (text [i].ToString ()); uiText.text += vowel; uiText.text += " "; //表示調整用のスペース yield return new WaitForSeconds (0.2f); } } string GetTextVowel(string text){ if(aLine.Contains(text)) return "a"; if(iLine.Contains(text)) return "i"; if(uLine.Contains(text)) return "u"; if(eLine.Contains(text)) return "e"; if(oLine.Contains(text)) return "o"; if(nLine.Contains(text)) return "n"; return "x"; } } |