うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】カーブする Text

AnimationCurveに合わせてテキストをカーブさせるスクリプト

f:id:hacchi_man:20200423052258p:plain

コード

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

[RequireComponent(typeof(Text))]
public class TextCurve : BaseMeshEffect
{
    [SerializeField]
    private AnimationCurve _animationCurve = new AnimationCurve();
    [SerializeField]
    private float _power = 10f;
    [SerializeField]
    private bool _isEachText;
    
    private List<UIVertex> _vertexList = new List<UIVertex>();
    
    public override void ModifyMesh(VertexHelper helper)
    {
        _vertexList.Clear();
        helper.GetUIVertexStream(_vertexList);
        
        var minMaxX = new Vector2(_vertexList[0].position.x, _vertexList[0].position.x);
        foreach (var vertex in _vertexList)
        {
            if (minMaxX[0] > vertex.position.x)
                minMaxX[0] = vertex.position.x;
            if (minMaxX[1] < vertex.position.x)
                minMaxX[1] = vertex.position.x;
        }
        
        for (var i = 0; i < _vertexList.Count; i += 6)
        {
            if (_isEachText)
            {
                var center = 0f;
                for (var j = 0; j < 6; j++)
                {
                    center += _vertexList[i + j].position.x;
                }

                center /= 6;

                var t = Mathf.InverseLerp(minMaxX[0], minMaxX[1], center);

                var value = _animationCurve.Evaluate(t);
                for (var j = 0; j < 6; j++)
                {
                    var vertex = _vertexList[i + j];
                    var pos = vertex.position;
                    pos.y += value * _power;
                    vertex.position = pos;
                    _vertexList[i + j] = vertex;
                }
            }
            else
            {
                for (var j = 0; j < 6; j++)
                {
                    var vertex = _vertexList[i + j];
                    var pos = vertex.position;
                    var t = Mathf.InverseLerp(minMaxX[0], minMaxX[1], pos.x);
                    var value = _animationCurve.Evaluate(t);
                    pos.y += value * _power;
                    vertex.position = pos;
                    _vertexList[i + j] = vertex;
                }
            }
        }
        
        helper.Clear();
        helper.AddUIVertexTriangleStream(_vertexList);
    }
}