uGUI와 TextMeshPro 모두에서 사용가능한 Text 컴포넌트 애니메이터를 만드려고 uGUI 코드와 TMPro 코드를 읽어보던 중 BaseMeshEffect 컴포넌트를 이용한 효과 주입이 가능함을 발견했습니다.
uGUI 패키지에 포함되어있는 Outline, Shadow 컴포넌트인데요. BaseMeshEffect를 이용해 추가적인 효과를 더해주는 기능을 제공합니다. 이를 참고해서 Mesh 버텍스를 랜덤하게 이동시켜 글자가 꿈틀거리는 효과를 만들었습니다.
기능 구현을 확인했고, 다른 이펙트와 겹쳐 사용이 가능한지 확인도 했습니다. 단순히 생성된 메쉬의 버텍스 위치만 옮겨주는 거다보니 크게 문제는 없을거라 생각했습니다.
그림자(Shadow)와 외곽선(Outline)효과도 문제없이 함께 적용됩니다. 프로파일링 결과 성능은 조금 저하되었지만 신경쓸 정도는 아닙니다. uGUI와 TMPro 패키지 내에 직접 기능을 구현해 성능상의 이점을 볼 수 있게 작업예정입니다.
더보기
# TextDeformer.cs
using System.Collections.Generic;
namespace UnityEngine.UI
{
[AddComponentMenu("UI/Effects/Text Deformation", 18)]
[RequireComponent(typeof(Text))]
public sealed class TextDeformer : BaseMeshEffect
{
private TextDeformer() { }
[SerializeField] [Range(0, 5f)] private float m_power = 1f;
[SerializeField] [Range(0, 0.5f)] private float m_updateInterval = 0.1f;
private readonly List<UIVertex> vertexList = new List<UIVertex>();
private UIVertex targetVertex = default;
private Vector3 vertexOffset = default;
private float estimatedDeltaTime = default;
private void Update()
{
if (m_updateInterval <= 0f)
{
graphic.SetVerticesDirty();
return;
}
if (estimatedDeltaTime < m_updateInterval)
{
estimatedDeltaTime += Time.deltaTime;
return;
}
estimatedDeltaTime -= m_updateInterval;
graphic.SetVerticesDirty();
}
public override void ModifyMesh(VertexHelper vertex)
{
vertexList.Clear();
vertex.GetUIVertexStream(vertexList);
int count = vertexList.Count;
for (int i = 0; i < count; i += 6)
{
SetOffset();
SetPosition(i);
SetPosition(i + 5);
SetOffset();
SetPosition(i + 2);
SetPosition(i + 3);
SetOffset();
SetPosition(i + 1);
SetOffset();
SetPosition(i + 4);
}
vertex.Clear();
vertex.AddUIVertexTriangleStream(vertexList);
}
private void SetOffset()
{
vertexOffset.x = Random.Range(-m_power, m_power);
vertexOffset.y = Random.Range(-m_power, m_power);
}
private void SetPosition(int index)
{
targetVertex = vertexList[index];
targetVertex.position += vertexOffset;
vertexList[index] = targetVertex;
}
}
}
'Unity > 작업방식' 카테고리의 다른 글
Unity: Workflow. 코드 레벨에서 사용중인 렌더 파이프라인 특정하기 2 (0) | 2021.05.31 |
---|---|
Unity: Workflow. 유니티 에디터 종료 확인 문구 (0) | 2021.05.30 |
Unity: Workflow. ListPool<T> 리스트 풀 (0) | 2021.05.13 |
Unity: Workflow. 셰이더 그래프에서 단축키 사용하기 (2) (0) | 2021.05.03 |
Unity: Workflow. 셰이더 그래프에서 단축키 사용하기 (1) (2) | 2021.05.03 |