在Unity遊戲中使用Live2D

2021-08-08 19:38:51 字數 3836 閱讀 1087

什麼是live2d本文討論的是unity中使用live2d,對live2d的製作不做任何討論。

我們可以從live2d匯出的檔案中看到如下標準格式:

1、model.1024資料夾中放的是人物的模型貼圖,由於多貼圖導致drawcall公升高的,所以在遊戲中盡量只使用一張貼圖。

2、motions資料夾是所有的動作檔案.mtn

3、expressions資料夾是所有表情動作.mtn

4、model.moc是live2d的模型檔案

5、physics是物理演算檔案

6、pose.json 可以用於動態的切換部件以實現特定需求

live2d的model.json檔案

這裡主要講解下model.json這個檔案

],

"":},

"physics":"physics.json"

, "hit_areas":[ ,,

]}

事實上這個json檔案都可以不存在的,只要你手工呼叫方法載入上moc檔案和貼**件,live2d的基本就已經顯示出來了。

但是我這邊使用了model.json是因為方便資源的統一管理,方便可以看出來乙個l2d模型中有多少資源包含。

在**中雖然可以直接進行載入,但是我們更加希望有乙份json作為引導檔案告訴我們,現在需要載入哪些資源,然後引用哪些資源,以方便呼叫。

在遊戲中中我們參考了sdk其中包含的live2d的demo,載入框架作為基礎,然後修改,做出專案能用的框架。

unity中live2d的問題

在unity中使用live2d需要注意許多問題,我在使用中也踩到了很多坑,雖然現在是有給出了解決的方案,但是這些有可能都不是最終最好的解決方案,希望大家能幫我指出。

1.live2d的rendermode。

可能很多人一開始使用的時候都沒有注意到這個引數的設定,預設是l2d_render_draw_mesh_now。

這個引數有兩個變數l2d_render_draw_mesh_now和l2d_render_draw_mesh。

主要區分為l2d_render_draw_mesh_now是在onrenderobject時候呼叫draw()函式。

在onrenderobject中呼叫draw()會造成其live2d一直處於最後渲染,而不會被其他物體而覆蓋。

而l2d_render_draw_mesh是在update()中呼叫draw()函式,可以進行半透明物體的渲染。

2.live2d中圖形層級的問題

在unity中使用l2dsdk2.1時候,你會發現乙個很痛苦的問題,他沒辦法改變圖層。

本人在ugui與live2d結合中現在已經使用過這幾個方案:

採用unity的rt技術。

採用專門的乙個攝像機進行拍攝,然後渲染到ui上。

實際使用時候需要進行矩陣的換算。

而且比較吃效能和記憶體,沒有特別比必要就沒有使用。

採用sortorder進行層級控制。

調整其他非live2d的ui的sortorder。

ugui中可以使用sortorder來指定渲染層級。

但是由於專案一開始並沒有考慮到會有live2d,所以layer的定義都在同乙個deaflut中。

我猜測l2d在渲染時候是全部渲染到了order為0的層上了。

所以假設情況允許可以考慮將需要分層的下層物體的order分別設定為負數,需要在上層的物體的order設定為正數可以解決圖層分層的問題。

使用l2d_render_draw_mesh_now直接疊加。

如果兩個live2d模型需要疊加的話推薦使用l2d_render_draw_mesh_now。

那有人會說那這樣誰會渲染在誰上面?

經過測試這樣的情況下,誰後例項化誰會最後進行渲染。

所以如果採用此方案進行最好自己建立乙個live2d生成佇列進行管理。來維護渲染順序。

使用l2d_render_draw_mesh進行疊加。

假設遇到了情況是兩個live2d疊加而且需要使用l2d_render_draw_mesh作為渲染模式時候。

兩個live2d的疊加順序符合場景中的排序。

但是要注意的是在某些情況下會出現兩個live2d的部分部件相互穿透的問題。

這個問題的出現我猜測是在live2d製作中圖層的穿透問題。

但是在某些情況下並沒有復現,而且美術最近比較忙,沒有來得及詳細測試找出原因。

使用renderqueue。

如果你的方案是unity+ngui+live2d,可以考慮使用renderqueue來進行排序。

在live2d自帶的shader中為3000,你可以根據層級來設定你自己的ui的renderqueue,同樣他不支援設定live2d的renderqueue。

同時即使採用ugui也可以使用rnederqueue,比如疊加粒子時候。

live2d動作管理

1.資源載入入口函式

2.model.init函式(修改支援drawmode切換)

public

void

init(string modeljson,int drawmode)}}

3.model.json 解析引導//事實上所有的動作等資源均是類似管理,如果需要提高效能可以單獨實現陣列

//通過modelsettingjson來解析model.json

modelsetting =new modelsettingjson(modeljson);
//通過函式跟蹤可以發現其實是直接返回json而已

len =modelsetting.gettexturenum();
遊戲中動作被分為:

待機動作,

特殊待機動作,

觸控事件動作,

震動事件動作。

除了待機動作,所有動作均可以相互交換。

特殊待機動作,觸控動作,震動動作,被維護成乙個字典,有唯一索引,進行呼叫。

group,string motionname,int priority);

live2d表情管理

遊戲中沒有太多的使用表情,所以也不展開討論。

標籤檔案為json格式。

使用方法與動作類似 。

表情使用時候要注意覆蓋的問題。

name);

live2d口型管理

通過控制param_mouth_open_y。

我們可以在遊戲中使用pose.json檔案來實現某些特性

其實主體的方法就是切換部件來實現某些特性。

在需要的時候會讀取pose.json檔案然後載入上需要的元件

pose.initparam(live2dmodel);
live2d觸控事件的管理

在遊戲中live2d觸控事件在每個場景中是不一樣的,為了提高整個元件的復用。

元件中的觸控事件是乙個事件鏈

在不同場景中的控制器可以使用委託來事件觸控事件的反應,而且在做出反應後可以通過函式的返回值來確定下一級時候繼續要處理整個事件,增加了這個的靈活性。

在遊戲中使用keybd event的問題

今天發現在遊戲中,keybd event不能使用,結果發現遊戲是使用directinput實現讀取鍵盤的,關鍵還是掃瞄碼的問題,我抄了一段老外的 經測試有效 在金庸中測試重複輸入空格 include include for key pushing byte scan code dword pkey ...

在遊戲中使用keybd event的問題

在遊戲中使用keybd event的問題 今天發現在遊戲中,keybd event不能使用,結果發現遊戲是使用directinput實現讀取鍵盤的,關鍵還是掃瞄碼的問題,我抄了一段老外的 經測試有效 在金庸中測試重複輸入空格 include include for key pushing byte ...

在Unity遊戲開發中使用暫停的小技巧

很多人在unity3d遊戲開發中寫暫停指令碼的時候,經常會想到 time.timescale 0 這種方法,但是 time.timescale 只是能暫停部分東西。如果在 update 函式中持續改變乙個物體的位置,這種位置改變貌似是不會受到暫停影響的。比如 1transform.position ...