Fix Outline Instance Missing Issue

This commit is contained in:
wsycarlos 2026-01-15 18:38:05 +08:00
parent 239e0a9516
commit 309ea13aff
3 changed files with 54 additions and 14 deletions

View File

@ -9,6 +9,27 @@ namespace Byway.TMP
public bool m_OutlineUnderlayChanged;
public Material BackupOriginal()
{
Material mat = new Material(fontSharedMaterial);
mat.shaderKeywords = fontSharedMaterial.shaderKeywords;
mat.name += " (Backup)";
return mat;
}
public void AssignInstance(Material mat)
{
m_fontMaterial = mat;
m_sharedMaterial = m_fontMaterial;
m_padding = GetPaddingForMaterial();
m_ShouldRecalculateStencil = true;
SetVerticesDirty();
SetMaterialDirty();
}
public void NotifyHelper()
{

View File

@ -7,14 +7,32 @@ namespace Byway.TMP
public class TextMeshProBywayUIRuntimeHelper : MonoBehaviour
{
private TextMeshProBywayUI m_TextComponent;
private Material m_TextMaterialOriginal;
private Material m_TextMaterialInstance;
private Material CreateInstance(Material source)
{
// Get Shader PropertyIDs if they haven't been cached already.
ShaderUtilities.GetShaderPropertyIDs();
Material mat = new Material(source);
mat.shaderKeywords = source.shaderKeywords;
mat.name += " (Instance)";
return mat;
}
private void CheckMaterialInstance()
{
DestroyMaterialInstanceIfNeeded();
if (m_TextComponent != null && (m_TextComponent.outline || m_TextComponent.underlay))
{
m_TextMaterialInstance = m_TextComponent.fontMaterial;
if (m_TextMaterialOriginal == null)
{
m_TextMaterialOriginal = m_TextComponent.BackupOriginal();
}
if (m_TextMaterialInstance == null)
{
m_TextMaterialInstance = CreateInstance(m_TextMaterialOriginal);
m_TextComponent.AssignInstance(m_TextMaterialInstance);
}
}
}
@ -33,7 +51,6 @@ namespace Byway.TMP
m_TextMaterialInstance.DisableKeyword(ShaderUtilities.Keyword_Outline);
}
if (m_TextComponent.underlay)
{
m_TextMaterialInstance.EnableKeyword(ShaderUtilities.Keyword_Underlay);
@ -50,31 +67,33 @@ namespace Byway.TMP
}
}
private void DestroyMaterialInstanceIfNeeded()
{
if(m_TextComponent == null || (!m_TextComponent.outline && !m_TextComponent.underlay))
{
DestroyMaterialInstance();
}
}
private void DestroyMaterialInstance()
private void DestroyAllMaterialInstances()
{
if (m_TextMaterialInstance != null)
{
Destroy(m_TextMaterialInstance);
}
if (m_TextMaterialOriginal != null)
{
Destroy(m_TextMaterialOriginal);
}
}
private void Awake()
{
m_TextComponent = GetComponent<TextMeshProBywayUI>();
CheckMaterialInstance();
Notify();
}
private void OnEnable()
{
Notify();
}
private void OnDestroy()
{
DestroyMaterialInstance();
DestroyAllMaterialInstances();
}
public void Notify()

View File

@ -1,7 +1,7 @@
{
"name": "com.bywaystudios.textmeshpro.ext",
"displayName": "TextmeshPro Extension",
"version": "0.1.3",
"version": "0.1.5",
"dependencies": {
"com.unity.textmeshpro": "3.0.9"
},