Unity Text長度計算的延遲性問題

    前言:大家在Unity裏做文字的自動換行與圖片文字適配是怎麼做的?

    今天在遊戲項目中有個需求,想讓任務的每個子任務框都隨着任務描述的文字來動態修改。對於這種需求,我有兩個解決方案:
    1、使用Unity的佈局組件 Vertical Layout Group 與 ContentSizeFitter 一起控制,這種方式輕鬆省力,但對於某些特殊需求不好拓展。
    2、自己根據內容算大小,根據每一行多少字得到總共多少行。然後設置文本框的 sizeDelta 和對應的背景框的 sizeDelta 。這種可拓展性好很多,但是需要自己解析以及控制長寬,比較麻煩。

    我今天碰到的這個我就是用第一種辦法來做的,但是第一種方法不適合在滿足適配的情況下做一些其他操作,因爲我們通常做操作是在賦值之後立馬去做的,而我們給 Text 的 text 賦值時,並不會立馬得到真實的 text 大小(猜測 text 的值是這一幀就賦好了,但是 preferredWidth 沒有立即計算改變,可能是在下一幀才計算的,而此時佈局組件也就沒有針對真正的大小來佈局,所以當前這一幀的大小有可能是不對的)。而在這裏賦值後我還需要得到這個 Element 的大小,所以拿到的也不對。

    我開始冒出的想法就是使用協程,在下一幀拿到正確的 Element 大小時再做操作,一幀玩家應該看不太出。但協程也有幾個問題:
    1、協程每次運行都開了一個線程,很費。
    2、你沒辦法完美控制好在一幀後的執行,時間設置久了太明顯,短了受限於機器可能拿到的數據還是錯誤數據,不是很穩妥。(那個 Text 大小也不一定是一幀後就正確了)。
    3、代碼很難理解日後不好維護。

    在我和同事的思考下,決定從那個控制大小的佈局組件入手。我們發現 ContentSizeFitter 當改變大小的時候有一個回調函數,有了這個,我們可以寫一個類去繼承這個 ContentSizeFitter 類,並重寫父類的方法,同時在子類中添加一個委託,當我們在改變 Element 大小的時候還需要 Element 正確的大小去做其他事情時,可以自己給這個委託賦值讓其執行。這樣這個佈局組件的拓展性就好很多了,玩家可以自由訂製。實際驗證了一下,還是比較好用。

ContentSizeFitter 改變大小的回調函數

在這裏插入圖片描述

複寫的子類CustomContentSizeFitter

在這裏插入圖片描述

遊戲的實際效果 右邊爲改變文字後的效果(額外的操作也順利完成)

在這裏插入圖片描述在這裏插入圖片描述

Element 的設置界面

在這裏插入圖片描述

Element 子物體文字設置

在這裏插入圖片描述

題外話

    以前我做聊天的適配時,需要根據每個發言玩家的稱號適配稱號背景,並根據發的文字適配聊天框帶大小。當時我是用的第2種方法,自己去實時計算大小再手動改變圖片和文本框的 sizeDelta ,但是那個大小同樣是有問題的,而爲了趕進度圖方便直接用了協程,所以玩家在發言後的短暫空隙內,可以看到自己的稱號背景圖被動態改變,體驗不是很好但也勉強滿足策劃的需求。辦法總是人想出來的,現在想想,還是不能圖方便放過自己啊,放過自己就錯過了一次學習的機會!

發佈了54 篇原創文章 · 獲贊 22 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章