С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 30.07.2024
Сообщений: 2
1

Анимация Текста в TextMesh Pro

30.07.2024, 21:18. Показов 378. Ответов 2

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Я давно искал на просторах интернета анимацию текста в Unity и, спустя долгое время, сам решил разобраться в этом вопросе. Я написал этот небольшой код, который включает в себя две анимации: тряску текста и анимацию волны текста. Все подробности описаны в коде. Я решил поделиться этим с вами, чтобы вы могли ознакомиться с такой возможностью.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System.Collections; // Подключаем библиотеку для работы с коллекциями
using System.Collections.Generic; // Подключаем библиотеку для работы с обобщёнными коллекциями
using UnityEngine; // Подключаем библиотеку UnityEngine для работы с Unity
using TMPro; // Подключаем библиотеку TextMesh Pro для работы с текстом
 
public class TextAnimation : MonoBehaviour // Определяем класс TextAnimation, который наследует MonoBehaviour
{
    public TMP_Text textMesh; // Объявляем публичную переменную textMesh типа TMP_Text для работы с текстом
    public float shakeAmount = 1.0f; // Объявляем публичную переменную shakeAmount для настройки интенсивности тряски
    public float waveFrequency = 1.0f; // Объявляем публичную переменную waveFrequency для настройки частоты волны
    public float waveAmplitude = 1.0f; // Объявляем публичную переменную waveAmplitude для настройки амплитуды волны
    public float waveSpeed = 5.0f; // Объявляем публичную переменную waveSpeed для настройки скорости волны
    public bool enableShake = true; // Объявляем публичную переменную enableShake для включения/выключения эффекта тряски
    public bool enableWave = true; // Объявляем публичную переменную enableWave для включения/выключения эффекта волны
    private bool hasTextChanged; // Объявляем приватную переменную hasTextChanged для отслеживания изменения текста
 
    void Start() // Метод Start вызывается при инициализации скрипта
    {
        StartCoroutine(AnimateText()); // Запускаем корутину AnimateText для анимации текста
    }
 
    private void UpdateVertexData(Vector3[][] copyOfVertices) // Метод для обновления данных вершин
    {
        TMP_TextInfo textInfo = textMesh.textInfo; // Получаем информацию о тексте
        for (int i = 0; i < textMesh.textInfo.meshInfo.Length; i++) // Проходим по всем meshInfo в тексте
        {
            textMesh.textInfo.meshInfo[i].mesh.vertices = copyOfVertices[i]; // Обновляем вершины mesh
            textMesh.UpdateGeometry(textInfo.meshInfo[i].mesh, i); // Обновляем геометрию текста
        }
    }
 
    private void ApplyShakeEffect(Vector3[] sourceVertices, Vector3[] copyOfVertices, int vertexIndex) // Метод для применения эффекта тряски
    {
        float modX = Random.Range(-shakeAmount, shakeAmount); // Генерируем случайное смещение по X
        float modY = Random.Range(-shakeAmount, shakeAmount); // Генерируем случайное смещение по Y
        Vector3 modifier = new Vector3(modX, modY, 0f); // Создаем вектор модификатора для тряски
 
        copyOfVertices[vertexIndex + 0] = sourceVertices[vertexIndex + 0] + modifier; // Применяем модификатор к первой вершине
        copyOfVertices[vertexIndex + 1] = sourceVertices[vertexIndex + 1] + modifier; // Применяем модификатор ко второй вершине
        copyOfVertices[vertexIndex + 2] = sourceVertices[vertexIndex + 2] + modifier; // Применяем модификатор к третьей вершине
        copyOfVertices[vertexIndex + 3] = sourceVertices[vertexIndex + 3] + modifier; // Применяем модификатор к четвертой вершине
    }
 
    private void ApplyWaveEffect(Vector3[] sourceVertices, Vector3[] copyOfVertices, int vertexIndex, float g, int i) // Метод для применения эффекта волны
    {
        float wave = Mathf.Sin(g * waveSpeed + i * waveFrequency) * waveAmplitude; // Вычисляем значение волны на основе синуса
        Vector3 waveModifier = new Vector3(0, wave, 0); // Создаем вектор модификатора для волны
 
        copyOfVertices[vertexIndex + 0] = sourceVertices[vertexIndex + 0] + waveModifier; // Применяем модификатор к первой вершине
        copyOfVertices[vertexIndex + 1] = sourceVertices[vertexIndex + 1] + waveModifier; // Применяем модификатор ко второй вершине
        copyOfVertices[vertexIndex + 2] = sourceVertices[vertexIndex + 2] + waveModifier; // Применяем модификатор к третьей вершине
        copyOfVertices[vertexIndex + 3] = sourceVertices[vertexIndex + 3] + waveModifier; // Применяем модификатор к четвертой вершине
    }
 
    public IEnumerator AnimateText() // Метод-корутина для анимации текста
    {
        textMesh.ForceMeshUpdate(); // Принудительно обновляем mesh текста
 
        TMP_TextInfo textInfo = textMesh.textInfo; // Получаем информацию о тексте
        Vector3[][] copyOfVertices = new Vector3[0][]; // Инициализируем массив для копий вершин
        hasTextChanged = true; // Устанавливаем флаг изменения текста
 
        TMP_MeshInfo[] cachedMeshInfo = textInfo.CopyMeshInfoVertexData(); // Кэшируем данные о mesh
        float g = 0f; // Переменная для синусоидальной волны
 
        while (true) // Бесконечный цикл
        {
            if (hasTextChanged) // Проверяем, изменился ли текст
            {
                if (copyOfVertices.Length < textInfo.meshInfo.Length) // Если массив копий вершин меньше количества mesh
                    copyOfVertices = new Vector3[textInfo.meshInfo.Length][]; // Инициализируем массив копий вершин
 
                for (int i = 0; i < textInfo.meshInfo.Length; i++) // Проходим по всем mesh
                {
                    int length = textInfo.meshInfo[i].vertices.Length; // Получаем длину массива вершин
                    copyOfVertices[i] = new Vector3[length]; // Инициализируем массив копий вершин для каждого mesh
                }
 
                hasTextChanged = false; // Сбрасываем флаг изменения текста
            }
 
            for (int i = 0; i < textInfo.characterCount; i++) // Проходим по каждому символу текста
            {
                if (!textMesh.textInfo.characterInfo[i].isVisible) // Если символ не видим
                {
                    continue; // Пропускаем его
                }
 
                int materialIndex = textMesh.textInfo.characterInfo[i].materialReferenceIndex; // Получаем индекс материала символа
                Vector3[] sourceVertices = cachedMeshInfo[materialIndex].vertices; // Получаем вершины из кэша
                int vertexIndex = textInfo.characterInfo[i].vertexIndex; // Получаем индекс вершины символа
 
                Vector3[] destinationVertices = copyOfVertices[materialIndex]; // Получаем копии вершин для данного материала
 
                if (enableShake) // Если эффект тряски включен
                {
                    ApplyShakeEffect(sourceVertices, destinationVertices, vertexIndex); // Применяем эффект тряски
                }
 
                if (enableWave) // Если эффект волны включен
                {
                    ApplyWaveEffect(sourceVertices, destinationVertices, vertexIndex, g, i); // Применяем эффект волны
                }
            }
 
            UpdateVertexData(copyOfVertices); // Обновляем данные вершин
            g += Time.deltaTime; // Увеличиваем переменную для волны
            yield return new WaitForSeconds(0.1f); // Ждём 0.1 секунды перед следующим циклом
        }
    }
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2024, 21:18
Ответы с готовыми решениями:

Многоязычный шрифт для textmesh pro
Всем привет! Застрял тут на одном месте на могу найти инфу как сделать многоязычный шрифт для...

Преобразование GameObject в TextMesh
Доброго дня! Скрипт небольшой, просто не пойму логики преобразования.. Скрипт висит на персонаже,...

Как сделать ссылку для переменной TextMesh?
Делаю всё тот же магазин, и теперь проблема с TextMesh. Сделал в скрипте вот такую перменную: ...

Как сделать текст в TextMesh более четким?
Текст в TextMesh расплывчатый жутко. Пробовала уменьшать Character size и увеличивать Font Size. Но...

Анимация текста
Привет всем. Помогите, нужен я так понимаю скрипт js что он будет делать: при открытии странички в...

2
1045 / 258 / 143
Регистрация: 30.07.2022
Сообщений: 1,655
Записей в блоге: 4
30.07.2024, 22:57 2
Artem_Atcitci, Спасибо!
процессы, которые вы описали уже автоматизировали.
DOTween (HOTween v2)
Документация
ознакомьтесь.

добавлю если кому интересно
1
1 / 1 / 0
Регистрация: 30.07.2024
Сообщений: 2
31.07.2024, 15:55  [ТС] 3
ieretsumi, Спасибо!
Я написал код для тех, кто хочет сам написать анимацию, не используя ассеты)
0
31.07.2024, 15:55
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2024, 15:55
Помогаю со студенческими работами здесь

Анимация текста
private async void Cleaner_Load(object sender, EventArgs e) { CenterLabels(); ...

Анимация текста
Особо не вдавался в подробности анимации, поэту прошу у вас. Нужно сделать так, чтобы буква при...

Анимация текста
1. Сабж. Кто желает помочь, повторите пожалуйста эту анимашку. Честно пытался разобраться, но...

Анимация текста
Всем привет Как сделать подобную анимацию текста как на сайте mcchill.in ? Возможно в Joomla есть...

Анимация текста
Всем хей :-) как сделать flying текст чтобы можно было прописать в консоле например game.popup...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru