コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】TextMesh Pro の SetText 関数で文字列を設定する場合、文字列が変化しない場合でも UI のリビルドが走る

検証環境

  • Unity 2019.3.10f1
  • TextMesh Pro 2.0.1

概要

TMP_Text.cs を見てみると

public string text
{
    get { return m_text; }
    set

    {
        if (m_text == value) return; 
        m_text = old_text = value; 
        m_inputSource = TextInputSources.String; 
        m_havePropertiesChanged = true;
        m_isCalculateSizeRequired = true; 
        m_isInputParsingRequired = true; 
        SetVerticesDirty(); 
        SetLayoutDirty();
    }
}

text プロパティの setter では、文字列が変わらない場合は return されるようになっているが

public void SetText(string text)
{
    SetText(text, true);
}

public void SetText(string text, bool syncTextInputBox)
{
    //if (text == old_text) return;

    //old_text = text;

    m_inputSource = TextInputSources.SetCharArray;

    StringToCharArray(text, ref m_TextParsingBuffer);

    #if UNITY_EDITOR
    // Set the text in the Text Input Box in the Unity Editor only.
    // TODO: Could revise to convert to string literal
    if (syncTextInputBox)
        m_text = text;
    #endif

    m_isInputParsingRequired = true;
    m_havePropertiesChanged = true;
    m_isCalculateSizeRequired = true;

    SetVerticesDirty();
    SetLayoutDirty();
}

SetText 関数では文字列が変わらない場合に return されないようになっている

そのため、TextMesh Pro のオブジェクトが存在する Canvas に
他にもたくさんの UI オブジェクトが存在する場合、
SetText するだけでリビルドが走り、処理に時間がかかることがある