imog

主にUnityとかの事を書いています

UniRXでuGUIのテキストをアニメーションさせる

UniRXの勉強も兼ねて小ネタ的なやつ。

いわゆるノベルゲーのこういうやつ

これをuGUIのTextがついてるオブジェクトにペタっと貼ると動きます。

UniRXをインポートしていることが前提です

using UnityEngine;
using System.Collections;
using UniRx;


[RequireComponent(typeof(UnityEngine.UI.Text))]
public class TextAnimation : MonoBehaviour {
    [SerializeField]
    private float speed;

    void Start()
    {
        var current = GetComponent<UnityEngine.UI.Text>();
        string rawText = current.text;
        current.text = "";

        Observable.Interval(System.TimeSpan.FromSeconds(speed)).              // speed秒置きに
            Take(rawText.Length).                                             // 元の文字列の長さ分実行され
            Select(_ => 1).                                                   // 実行ごとに都度1を取り出し
            Scan((acc, currentLength) => acc + currentLength).                // 現在の実行回数を計算する
            SubscribeToText(current, length => rawText.Substring(0, length)); // rawから0~length文字取り出してcurrentに投げる
    }
}

実際使うときはボタンとかキーとか外部のアクションで文章を途中で止めたいとかありそう。 購読を一回止めて、再度実行というのがまだわかってないので次にでも書きます。