yyl
2025-05-19 b118ece3db250a5a257b60713da92234d8d5a57a
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
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
#if  UNITY_EDITOR
using UnityEditor;
 
#endif
 
[System.Serializable]
[RequireComponent(typeof(Image))]
public class ImageFitterText : MonoBehaviour
{
    [SerializeField] Text m_Target;
    [SerializeField] Vector3 delta = Vector3.zero;
    [SerializeField] Vector2 sizeDelta = Vector2.zero;
    [SerializeField] bool LockWidth = false;
    [SerializeField] bool LockHeight = false;
    [SerializeField] bool fiterRealTxtWidth = false;
    [SerializeField] bool minSizeDeltaHeight = false;
    [SerializeField] float minHeightValue = 0f;
    RectTransform m_RectTransform;
    RectTransform m_Rt {
        get {
            if (m_RectTransform == null) {
                m_RectTransform = this.transform as RectTransform;
            }
            return m_RectTransform;
        }
    }
 
    public bool FiterRealTxtWidth
    {
        set
        {
            fiterRealTxtWidth = value;
        }
    }
    Vector3 targetLocalPositon = Vector3.zero;
    Vector2 targetSizeDelta = Vector2.zero;
    private void OnEnable()
    {
        if (m_Target == null) {
            enabled = false;
        }
        //m_Rt = this.transform as RectTransform;
    }
    private void LateUpdate()
    {
        Refresh();
    }
    public void Refresh()
    {
        if (m_Target == null) {
            return;
        }
        Vector2 _sizeDelta = m_Target.rectTransform.sizeDelta + sizeDelta;
        if (LockWidth) {
            _sizeDelta.x = m_Rt.sizeDelta.x;
        }
        if (LockHeight) {
            _sizeDelta.y = m_Rt.sizeDelta.y;
        }
        if (fiterRealTxtWidth) {
            var _width = Mathf.Min(m_Target.rectTransform.rect.width, m_Target.preferredWidth);
            _sizeDelta = m_Target.rectTransform.sizeDelta.SetX(_width) + sizeDelta;
        }
        targetSizeDelta = _sizeDelta;
        targetLocalPositon = m_Target.transform.localPosition + delta;
        if (minSizeDeltaHeight && targetSizeDelta.y < minHeightValue)
        {
            targetSizeDelta.y = minHeightValue;
        }
        if (targetSizeDelta != m_Rt.sizeDelta || targetLocalPositon != m_Rt.localPosition) {
            m_Rt.sizeDelta = targetSizeDelta;
            m_Rt.localPosition = targetLocalPositon;
        }
    }
}
#if UNITY_EDITOR
[CustomEditor(typeof(ImageFitterText))]
[CanEditMultipleObjects]
public class ImageFitterTextEditor : Editor
{
    public ImageFitterText obj;
    public override void OnInspectorGUI()
    {
        obj = target as ImageFitterText;
        base.OnInspectorGUI();
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Execute")) {
            obj.Refresh();
        }
        EditorGUILayout.EndHorizontal();
    }
}
#endif