Unity

【ツール不要】ノベル風にテキストを1文字ずつ表示させる方法【音も付けられる】

本記事内には、アフィリエイトリンクを含む場合があります

テキストをぱっと出すのと、
文字送りにして出すのとでは、
そのテキストの読ませやすさ、注意の惹きつけやすさが全然違います。

テキストを1文字ずつ表示させる最も知られた方法は、
アセットDOTween (HOTween v2)を使った方法です。

DOTWeenは確かに便利で、
使えるようになっておくことは必須だと思いますが、
文字送りで表示させることは、そのようなツールを使うまでもありません。

そして、その1文字1文字に効果音をつける場合は、
DOTweenを使うより、ツールなしのほうがシンプルに実装できます

DOTweenは、DOTween (HOTween v2)(無料版)とDOTween Pro(有料版)があり、
1文字1文字にアニメーションや効果音をつけられるのは、
DOTween Pro(有料版)です。

それでも効果音をつける手法は、Kanのメモ帳様で紹介されていますが、
やや面倒…^^;

【引用】Kanのメモ帳---DOTweenのDoTextにSE(効果音)を付ける

そこで、本記事ではツールなしでの実装方法を紹介します(完成形↓)

1.テスト用にUIを配置

TextもしくはTextMeshProのいずれかを使えますので、適当に配置します。
ここでは単なるTextの場合で説明します。

また、複数の文章に対して、文字送りするので、
次の文章を呼び出すための「次へボタン」も配置します。

そして、1文字ごとに鳴らす効果音ファイルをシーン配置します。
(効果音ラボのカーソル移動4を拝借)

Play On Awakeは解除しましょう。

準備はこれでOK ^^

2.ノベル風の文字送り用スクリプト

早速、NovelTextManager.csというスクリプトを以下のコード内容で作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NovelTextManager : MonoBehaviour
{
    public Text novelText; //表示用テキスト
    public GameObject nextBtn; //次ボタン
    public AudioSource charSE; //1文字ずつの効果音
    public string[] sentences; //表示したい文章の配列
    public int i;
    
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(DisplaySentence()); //文字送り開始
    }

    // Update is called once per frame
    void Update()
    {
        if(novelText.text == sentences[i]) //文章が完成したら、ボタンを表示
        {
            nextBtn.SetActive(true);
            if(i == (sentences.Length - 1)) //さらに最後の文章ならボタン非表示
            {
                nextBtn.SetActive(false);
            }

        }
        else
        {
            nextBtn.SetActive(false);
        }
        
    }
    IEnumerator DisplaySentence()
    {
        foreach(char x in sentences[i].ToCharArray()) //~.ToCharArray()はテキスト1文字ずつの配列
        {
            novelText.text += x; //1文字追加
            charSE.Play(); //効果音再生
            yield return new WaitForSeconds(0.1f); //0.1秒間隔
        }
    }
    public void OnClickNext()
    {
        if(i < sentences.Length - 1) //最後の文章でないなら
        {
            i++;
            novelText.text = ""; //現在の文章を白紙に
            StartCoroutine(DisplaySentence()); //次の文字送り開始
        }
    }
}

 

内容はスクリプトのコメントに書いた通りです。
ポイントは、ToChararray()によって、
1つの文章を、その1文字ずつを要素にもつ配列にしている点です。

その配列を、for文で1文字ずつに対して処理しています。

また、Update関数やOnClickNext関数で、
その文章が何番目の文章なのか(最後かどうか)を
i == sentences.Length または i < sentences.Length で判定して
次へボタンの扱いを変えています。

 

3.Inspectorでの設定

このスクリプトをシーンのオブジェクト、とりあえずはMainCameraにアタッチします。

Inspectorにて、図のように紐付け、文章を準備します。

次へボタンのOnclickも設定します。

作業は以上です!
ゲームを実行すると、ノベル風の文字送りを楽しむことができます。

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA