夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityでアニメ世界のUI演出を行う。 コード解説

本日はUntiy枠です。

昨日アニメ世界の表現の一環として文字が一文字ずつ大文字に変換されていくコードを書きました。

本日はコードの中身を軽くお話しします。

〇UI演出

redhologerbera.hatenablog.com

f:id:Holomoto-Sumire:20210524190447g:plain

昨日は上画像のような演出をUnityを用いて行うために次のようなコードを書きました。

〇コード

using System;
using System.Collections;
using System.Collections.Generic;
using JetBrains.Annotations;
using UnityEngine;
using UnityEngine.Events;
using TMPro;


    public class TextSclloler : MonoBehaviour
    {
        [SerializeField] TextMeshPro _OriginalText;
        [SerializeField,Header("OutPut")] private TextMeshPro _OutputText;

        
        [SerializeField] private bool _TextChanged;
        [SerializeField] private UnityEvent _pocessingEvent; 
        [SerializeField] private UnityEvent _endEvent;
        public  string st;
       public string _ChangedText;
        [SerializeField,Range(0.01f,1)] float _speed; 
        public  string subText;

        public string output;
        
        private void Start()
        {
            StartCoroutine("SentText");

        }

        IEnumerator SentText()
        {
            _TextChanged = true;
            int _textsize = _OriginalText.text.ToString().Length;
            subText = _OriginalText.text.ToString();
            int i = 0;
            while (i<_textsize)
            {
                _ChangedText += subText.Substring(i,  1).ToUpper(); //ToDoFixError
                st =subText.Remove(0, i+1);
                
                output = _ChangedText + st;
                _OutputText.text = output;
                _pocessingEvent.Invoke();
                yield return new WaitForSeconds(_speed);
               
                i++;
            }
            
            _TextChanged = false;
            _endEvent.Invoke();
        }

        public void SetColor()
        {
            Color col = new Color(1, 0, 0);
            Material mat = _OutputText.GetComponent<Renderer>().material;
            mat.SetColor("_FaceColor", col);
        }
    }    

この中で重要となる処理がコルーチン内部です。

     IEnumerator SentText()
        {
            _TextChanged = true;
            int _textsize = _OriginalText.text.ToString().Length;
            subText = _OriginalText.text.ToString();
            int i = 0;
            while (i<_textsize)
            {
                _ChangedText += subText.Substring(i,  1).ToUpper(); 
                st =subText.Remove(0, i+1);
                
                output = _ChangedText + st;
                _OutputText.text = output;
                _pocessingEvent.Invoke();
                yield return new WaitForSeconds(_speed);
               
                i++;
            }
            
            _TextChanged = false;
            _endEvent.Invoke();
        }

ここではwhile文で変換元のテキストの長さだけループ処理を行います。

_ChangedTextという型に 基となるテキストから一文字ずつ大文字にして挿入しています。

 この1文字ずつという処理はString.Substring()を使用しています。

 これはString型の文字列から指定した部分を抜き出す処理で、i番目から1文字を抜き出す(実質i番目の文字)という処理を行います。   redhologerbera.hatenablog.com

 抜き出した文字はString.ToUpper()によって大文字に変換し _ChangedTextに挿入します。

 この処理によって毎フレーム1文字ずつ大文字に抜き取られて変換されていきます。

 stは元のテキストから毎フレームずつ一文字ずつ頭の文字を抜いていく処理を行っています。

 これによって_ChangedTextに変換された大文字が追加されていく半面stは冒頭から文字が減っていき大文字化処理されていない部分となり、それらを合算することで一文字ずつ大文字に変換されていく実装を行っています。