キャラクターごとにテキストの色を指定したい

352 views
Skip to first unread message

ゆりしか

unread,
Jan 25, 2024, 12:10:45 AM1/25/24
to 宴ユーザーグループ
宴のバージョン:v4.0.1
Unity のバージョンとOS:Unity2023.2.3f1 Mac
Unity の習熟度:初心者

2点実装方法についての質問です。

・キャラクターごとにテキストの色を指定したい
Text列のテキストをカラータグで囲うことで、文字色が指定できるのを確認できています。
これをArg1列に記載するキャラクターごとにCharacterシート等でカラーコードを設定しておき、
Text列に書くカラータグの記述を省略したいです。

上記参考にいたしましたが、既読テキストに関わらず全てのテキストの文字色をキャラクターごとに変えたい旨となります。
どのような実現方法がありますでしょうか。

・あるボタンをクリックすることによって、メッセージウィンドウに表示中のテキスト全文と再生された位置までの文字数を取得したい
以下のようなイメージになります。
①画面上にボタンが現れる
②メッセージウィンドウにテキストが再生される
③再生中に①のボタンをクリックする
④スクリプトでテキストの全文字数、クリック時に再生された位置までの文字数を取得する
⑤画面上に「再生された位置までの文字数/全文字数」を表示する

上記のようなことは可能でしょうか。可能であれば、どのような実現方法がありますでしょうか。


以上です。よろしくお願いいたします。

マッドネスラボ

unread,
Jan 25, 2024, 12:51:18 AM1/25/24
to 宴ユーザーグループ
質問が二つあるので、二個にわけてお答えします。

>キャラクターごとにテキストの色を指定したい
まず、ReadColorModeに「None」にすると既読かどうかによってテキストの色は変わらなくなります。

キャラクターごとに本文テキストの色を変えるのは
にあるのと同じ要領で、 OnPostChangeTextのイベントを使って
名前によってテキスト色を変えるプログラムを書く形になります。

具体的にサンプルプログラムを書くと以下のような形になります。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utage;
using UtageExtensions;

public class SampleChangeTextColorByName : MonoBehaviour
{
    AdvUguiMessageWindowTMP MessageWindow => this.GetComponentCache(ref messageWindow);
    AdvUguiMessageWindowTMP messageWindow;
   
    [Serializable]
    class CharacterTextColor
    {
        public string characterLabel;
        public Color color = Color.white;
    }
    [SerializeField] List<CharacterTextColor> characterTextColors = new List<CharacterTextColor>();
    public Color defaultColor = Color.white;

    void Awake()
    {
        MessageWindow.OnPostChangeText.AddListener(OnPostChangeText);
    }

    void OnDestroy()
    {
        MessageWindow.OnPostChangeText.RemoveListener(OnPostChangeText);
    }

    void OnPostChangeText(AdvMessageWindow message)
    {
        var text = MessageWindow.TextPro;
        //キャラクターラベルによって、テキストの色を変える
        var characterTextColor = characterTextColors.Find(x => x.characterLabel == message.CharacterLabel);
        if (characterTextColor != null)
        {
            text.Color = characterTextColor.color;
        }
        else
        {
            //キャラクターラベルがない場合は、デフォルトの色に戻す
            text.Color = defaultColor;
        }
    }
}

このサンプルのコンポーネントは、AdvUguiMessageWindowTMPと同じオブジェクトにAddComponentして使う形になります。
CharacterTextColors に、キャラクターラベルと対応する色のペアを設定して使います。
ss_2205.png




2024年1月25日木曜日 14:10:45 UTC+9 ゆりしか:

マッドネスラボ

unread,
Jan 25, 2024, 1:06:47 AM1/25/24
to 宴ユーザーグループ
>あるボタンをクリックすることによって、メッセージウィンドウに表示中のテキスト全文と再生された位置までの文字数を取得したい

ボタンを表示したり、押したときの挙動などのUI操作などはUnityの一般的な開発手法で実装してください。
宴以外のプロジェクト個別の実装方法は、ここでは答えられません。

>④スクリプトでテキストの全文字数、クリック時に再生された位置までの文字数を取得する
テキストの文字数と、現在表示中の文字数を取得するには、以下のようなプログラムを書きます。

    public AdvUguiMessageWindowTMP window;
    void Sample()
    {
        //メッセージウィンドウのテキストオブジェクトを取得
        var text = window.TextPro.TextMeshPro;

        //テキスト全文の文字数
        int count = text.textInfo.characterCount;

        //現在表示している文字数
        int visibleCount =  text.maxVisibleCharacters;
    }

2024年1月25日木曜日 14:51:18 UTC+9 マッドネスラボ:

ゆりしか

unread,
Jan 27, 2024, 3:21:29 AM1/27/24
to 宴ユーザーグループ
ご回答ありがとうございます。
2点目について、追加で質問させてください。
2の応用として、ボタンを押した途中から、メッセージが書き換わるということを実装したいと考えています。
public AdvUguiMessageWindowTMP window;
var text = window.TextPro.TextMeshPro;
で取得したtext.textに書き換えたいテキストを代入すると、変更後テキストが元の文字数を超えた場合に、途中までしかメッセージを表示することができません。
全文表示する、または改ページをして変更後テキストを全表示するにはどのような実装方法がありますでしょうか。

2024年1月25日木曜日 15:06:47 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jan 27, 2024, 5:15:15 AM1/27/24
to 宴ユーザーグループ
        text.maxVisibleCharacters;
が表示する最大文字数なので、そこを制御すればいいです。
        text.maxVisibleCharacters = 1000;

maxVisibleCharacters は、TextMeshProというUnityの標準UIコンポーネントなので、詳しくはインターネット検索等をしてみてください。

ただ、基本的に表示文字や文字数は、宴側で制御しているので、プログラムで書き換えても宴側で再び書き換えて巻き戻ってしまう可能性もあります。
宴側の処理を変えるには、メッセージウィンドウのテキストを制御してるAdvUguiMessageWindowTMPというコンポーネントれをoverrodeするなりしてプログラムを書きかえる必要があります。

それよりも宴のテキストとは別に自分で制御したいテキストをオブジェクトを別に作って
それらの表示・非表示を切り替えるほうが楽かもしれません。

2024年1月27日土曜日 17:21:29 UTC+9 ゆりしか:
Reply all
Reply to author
Forward
0 new messages