跳到主要內容

精選

遊戲伺服器2025年初架設與研究part14收送封包的Json格式與Unity內建JsonUtility相關的問題(支援性)

 上次針對如何在Unity的新版TMP Text中使用中文字 而這次則是來分享一下先前有提過的 Json文字轉換 的問題 首先我們知道Unity內建的Json轉換是 JsonUtility JsonUtility 在使用上有一些限制在 算是有優點也有缺點 優點是畢竟是寫在Unity底層的, 效能 比較好 如果功能沒有問題的情況下,可以比額外安裝的Json轉換插件效能要好上不少 甚至有些插件能差兩倍以上的執行效能 不過自然也是有缺點 就是它有不少 不支援 的型別 很多時候常常讓伺服器與遊戲端的人打架的其中一個原因,伺服器表示資料明明就有送,遊戲端則是表示我沒收到(伺服器傳的Json格式轉不出來的種種問題或是可能性) 詳細可以參考Unity的官方文件 https://docs.unity3d.com/6000.1/Documentation/Manual/json-serialization.html 那我這邊也把一些重點特別拿出來講 首先我們先前在聊天訊息回傳的時候,就已經有用到基本的功能 可以先看到我們伺服器端的程式碼(Python) 如以上這語法 這是我們先前使用的方式 那這邊因為是跟先前相同的 相同的部分我就用截圖來顯示(詳細程式碼在Part11有可以複製) 可以看到我們主要回傳的結構 json.dumps({"type": "chat", "message": msg}) 這段就是把後面的內容透過Json轉換成Json字串後傳給使用者(遊戲端) 而我們Unity接收的位置是這樣寫的 ServerPacket packet = JsonUtility.FromJson<ServerPacket>(json); 這行就是我們今天 主要 想討論的地方 並且假設大家想要使用額外安裝的Json套件,也幾乎就是替換這行就能達到想要的效果 接下來我們看到ServerPacket這個class 這邊可以看到關鍵是我們的class要 可序列化 也就是說要加上 [Serializable] 那雖然說是只要加上可序列化,就能轉換 但是也是因為這樣,有很多不能被Unity內建支援的型別,則會轉換不出來 而...

遊戲伺服器2025年初架設與研究part13在Unity中創建TMP(TextMeshPro)中文字型且顯示中文字

 首先回顧一下上次分享的文章

主要是把我們聊天室的內容顯示在遊戲畫面

那當然大家也可以根據自己的喜好進行調整

或是增加傳送給伺服器的資料,那就可以對聊天室進行更詳細且複雜的操作

例如多數遊戲可能都會有的頻道分類

像是世界頻道,區域頻道,公會頻道等等,都是可以延伸去處理的部分

不過這次的話先來分享另一個

也就是我們先前在使用Unity新版的TMP Text的時候

還是有些人對於如何顯示中文有些疑惑

那這邊就是在進行更詳細的講解


首先在比較新版的Unity中
我們在場景中點擊滑鼠右鍵,創建一個Text元件的時候,應該看到如上圖
可以看到Text - TextMeshPro
這個就是新板的TMP文字元件
當然這邊如果怕麻煩,或是不想要使用新版
其實還是可以找到舊版的
就繼續往下看


可以找到Legacy
一般來說現在Unity內部也有不少保留舊版系統的機制,都會放在Leagcy裡面
那如果使用舊版,預設是可以顯示中文的
至少單純使用上不會有什麼問題的
那這邊可能就會牽扯到一個問題
就是該不該使用新版
其實這邊還沒有絕對需要使用新版的理由
但是現在多半製作遊戲的時候都會使用到各種插件
隨著時間,越來越多插件都會內建新版的語法
雖然現在舊版還可以使用,但是也很難說最後Unity不會有捨棄的想法
所以多學新版的用法也沒什麼壞處
除非自己的專案已經用了舊版的,而且還用到了一大堆地方
那確實,就保持用舊版就好,不必刻意為難自己

而以下就是簡單的說明一下新版的Text該如何使用
首先創建好第一個Text TMP版本的時候
應該會跳一個視窗


因為目前專案內還沒有任何給TMP使用的文字檔,他會要你Import
直接按也沒關係,雖然按了也不會讓中文字出現
中文依然是顯示不出來的
包然把TMP範例匯入後也是看不到中文
那些都沒有包含中文的字型,顯示不出來也是正常
那這邊也為了方便測試,簡單提供常見的字型檔下載點
當然Unity可以支援.ttf跟.otf
如果自己已經有字型檔,可以先匯入專案,等等會用到
那這邊就直接提供google的字型下載的載點

這兩個都是google就可以下載到的免費字體,都有支援中文
可以隨意下載其中一個來用

那我這邊也是準備了一個A_Font資料夾來放我們的字體檔案NotoSerifTC-VariableFont_wght.ttf
例如我丟進來的這樣
那接下來我們直接使用較快的方式創建出所需的文字檔

我們點擊專案內的字體檔案右鍵
然後選到Create/TextMeshPro/Font Asset/SDF
這樣Unity就會替我們用內建的方式直接創建出一個可以使用的字形檔

這樣就可以創建出一個SDF檔案
也就是給我們TMP可以使用的字形檔了

那我們回到場景中看先前的TMP Text
我們看到Font Asset的地方,這就是我們可以替換字型檔的位置
點選旁邊的小白點,又或是直接把場景中的中文字型檔拖曳過來也可以
那這邊我們就可以看到
先前準備的NotoSerifTC-VariableFont_wght SDF已經放到Font Asset上了
接下來在內容的部分打上大家想顯示的中文字

那這樣我們就可以在Game視窗看到文字顯示的內容
已經有中文字出現了
那基本上到這個步驟,就已經算是可以使用中文字型
以下是額外一點點補充
如果想要進階一點的操作

可以開啟Font Asset Creator可以看到很多進階一點的選項
那我這邊也只是簡單帶過,例如以下操作
把我們先前讓Unity預設創建的SDF拖曳進來,可以看到他預設添加了那些字進來
我們也可以根據喜好調整
並且這邊也提醒Unity預設會是動態字體,加載等等的有可能延遲等等的原因
但是因為中文字實在太多了,如果遊戲中又有大量文字需求
那這個Atlas基本上怎樣都不夠大的
畢竟隨便把6千個以上的中文字塞進來,肯定是容量爆炸的
所以多半需要顯示大量中文的情況,還是用動態比較保險(避免有字無法顯示出來)
而這邊自然也就表示,假設遊戲需要的中文沒有很多,且都能預知的情況(有文字表)
那直接透過自訂來把用到的字都添加進來
生成靜態的文字檔,就可以大幅提升效能
還可以避免動態字體有機率把字體弄爆炸的風險
(爆炸簡單來說就是可能會有不可預期的畫面錯亂產生)

那這次就簡單的介紹一下如何在Unity之中使用TMP並且添加中文字進來
畢竟舊版的Text是預設就能顯示中文,還是有不小差距的
這次就分享到這邊,如有疑問可以再提出來~


















留言