Unity UGUI의 Textα값으로 문자 표시

개시하다


어쩌면 이것은 당연한 방법일지도 모르지만, 자신이 생각한 방법은 오히려 교묘하게 운용할 수 있다
나는 문장의 쓰기 연습도 보도로 삼고 싶다.

개요



유니티로 이런 느낌을 실현해 봤다는 메시지 표시.

방법


BaseMeshEffect의 반을 계승하여 ModifyMesh를 다시 쓸 준비를 합니다
그 방법 안에서 정점의 알파를 고쳐 쓰다.
소스는 이렇게.
using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections;
using System.Collections.Generic;

public class TextAlphaSending : BaseMeshEffect
{
    private const int OneSpriteVertex = 6;
    private bool _isEnd = false;
    private float _alpha = 0f;
    private int _charaCount = 0;
    private Text _text;
    public Text Text
    {
        get{return _text ?? (_text = GetComponent<Text>()); }
    }

    /// <summary>
    /// 文字表示終了判定
    /// </summary>
    /// <returns></returns>
    public bool IsEnd()
    {
        return _isEnd;
    }

    /// <summary>
    /// 文字数カウント初期化
    /// </summary>
    public void Initialize()
    {
        _charaCount = 0;
        _isEnd = false;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="vh"></param>
    public override void ModifyMesh(VertexHelper vh)
    {
        var input = new List<UIVertex>();
        var output = new List<UIVertex>();
        var text = Text;

        vh.GetUIVertexStream(input);
        var vertexTop = _charaCount * OneSpriteVertex;

        if (vertexTop >= input.Count) {
            _isEnd = true;
            return;
        }

        for (int i=0; i<vertexTop; ++i) {
            output.Add(input[i]);
        }

        for (int i=vertexTop; i<vertexTop + OneSpriteVertex; ++i) {
            var uiVertex = input[i];
            uiVertex.color.a = (byte)(255f * _alpha);
            output.Add(uiVertex);
        }

        _alpha += 0.1f;
        if (_alpha >= 1f) {
            _charaCount++;
            _alpha = 0f;
        }        

        vh.Clear();
        vh.AddUIVertexTriangleStream(output);
    }
}

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

public class TextSenging : MonoBehaviour
{
    private Text _text;
    public Text Text
    {
        get
        {
            return _text ?? (_text = GetComponent<Text>());
        }
    }
    private TextAlphaSending _textAlphaSending;
    public TextAlphaSending TextAlphaSending
    {
        get
        {
            return _textAlphaSending ?? (_textAlphaSending = GetComponent<TextAlphaSending>());
        }
    }

    // Use this for initialization
    void Start ()
    {
        TextAlphaSending.Initialize();
        Text.text = "【王様】\nおお勇者よ,よくぞ参った";
    }

    // Update is called once per frame
    void Update ()
    {
        if (!TextAlphaSending.IsEnd()) {
            Text.SetAllDirty();
        }
    }
}
TextSenging Update로 표시된 텍스트가 남아 있는 경우
Text.SetAllDirty에서 ModifyMesh가 호출됩니다.
이렇게 한 글자 한 글자.α값을 변경하여 문자를 표시할 수 있습니다.
문제점으로 삼다α값을 업데이트해야 하므로 프레임당 SetAllDirty
교점을 업데이트해야 합니다.
실제 처리 부하가 검증되지는 않았지만, 컴퓨터 환경에서만 잠깐 대화를 나눴다면 문제가 없었겠죠
만약 이동 환경이라면 매우 심각할 수 있다
UGUI의 정점을 의외로 간단하게 편집한 예로 고려해 주십시오

좋은 웹페이지 즐겨찾기