基於NGUI的富文本實現--終成正果

第一次,連續做了這麼多天的功能,第一次把我想要的結果完整無誤的呈現出來,又有幾人能明白這種付出後看到成果展現在眼前的那種心情。

今天服務器維護,很早就趕到公司去上班了!一天都沒睡幾個鐘頭,實在是很疲、很困。
代碼是寫完了,可是還有很多bug,甚至還很黃很暴力。
特別有幾個地方實在是用了不是辦法的辦法。

    // 第一個讓人覺得恐怖而且不可靠的地方 RichCompSortHelper.CalculatePrintedSize
    private static Vector2 CalculatePrintedSize(UILabel label, string text)
    {
        var old_text = label.text;
        label.text = text;
        var size = label.localSize;
        label.text = old_text;

        Debug.Log(text + "   size : " + size.ToString());

        return size;
    }
    // 不知道你們看出了什麼沒有。那個大小的計算方法,是不是有點不可理喻
    // 本來以爲調用NGUIText的CalculatePrintedSize方法,就能夠計算出大小,結果不知道是什麼地方出現了問題,一直沒有辦法拿到正確的值。
    // 雖然說Unity底層會採用數據緩衝池類似的技術,去實現延遲渲染。這個text根本不會被渲染出來,但是這種做法也是挺取巧的。
    // 實在是還沒有研究透NGUI那個方法出現了什麼問題,所以才採用這種方式。

    // 也不是沒有什麼補償,就是在調用這段代碼的方法裏的順序遍歷方法,改善成了二分查找法,算是儘可能提高效率吧
    // 第二個地方 就是RichLabel的換行切割方法   自己調用自己生成對象
    // 本來是想做一個克隆方法的,所有的處理都在外面調用層去處理,結果寫着寫着,就成爲內部處理,外部處理,一起上了。
    public RichLabel[] SubComponent(string[] lines)
    {
        if (lines != null && lines.Length > 1)
        {
            var list = new List<RichLabel>();
            for (int i = 0; i < lines.Length; ++i)
            {
                if (i == 0)
                {
                    this.m_label.text = lines[i];
                    this.m_text = lines[i];
                    this.m_rich_event.Init();
                }
                else
                {
                    var temp_rich_comp = new RichLabel(this.m_ctrl.GameObj.transform, this.m_ctrl, this.m_font, this.m_fontsize, this.m_fontstyle, lines[i], this.m_rich_event);
                    if (temp_rich_comp != null) list.Add(temp_rich_comp);
                }
            }
            return list.ToArray();
        }
        return null;
    }

最後附上一張整體效果圖和調用數據

    private string rich_txt = @"
    <label id = '111',can_click = 'true',font = 'SciFi/SciFi Font - Header', fontsize = '20',fontstyle = 'Normal',text = 'First LabelFirstLabelsdfsdfadfasdfaewoooooooooooooooppppppppppppppsssssssssssssssscccccccccccccc222222222222' />
    <sprite atlas_name = 'SciFi/SciFi Atlas',sprite_name = 'NGUI',width = '30',height = '18'/>
    <spamin atlas_name = 'Wooden Atlas',sprite_name = 'Button',prefix_sprite_name = 'Button',loop = 'true'/>
    <texture texture_name = 'Wooden Atlas',width = '25',height = '18'/>
    <label font = 'SciFi/SciFi Font - Normal', fontsize = '22',fontstyle = 'Normal',text = 'S
n
e
n
c
o
nnd Label' />
    <texture texture_name = 'Wooden Atlas',width = '65',height = '108'/>
    ";
    void OnGUI()
    {
        if(GUILayout.Button("TestRich"))
        {
            RichLabelMgr.CreateNewRichLab(rich_txt, this.transform, new Vector2(200, 200), NGUIText.Alignment.Left, (string id) =>
            {
                Debug.Log("richevent  " + id);
            });
        }
    }

成果圖

ps:工程已經全部上傳到了GIT,感興趣的可以下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章