自己動手!一鍵把Unity遊戲打包上架到Facebook小遊戲平臺

2021-03-02 耿直的IT男阿斌

Unity官方H5小遊戲方法Project Tiny遲遲不發,而且即使發布了,老遊戲也沒法直接遷移。

對於很多Unity項目,想要有更多的變現途徑,比如接入Facebook小遊戲平臺,就需要自己動手了。

罷了罷了,我也是閒的和窮(不想用付費方案),不死心地研究了一下Unity遊戲轉Facebook小遊戲的可行性。

首先,很多人可能不知道,Untiy打包成WebGL代碼時,可以選擇一個模板,通過這個模板,可以自定義啟動頁面和最終的遊戲包。

所以,我們可以為Facebook小遊戲定製一個模板,實現一鍵將Unity遊戲打包到Facebook小遊戲平臺。

具體參考文檔:

https://docs.unity3d.com/2020.2/Documentation/Manual/webgl-templates.html

友提,本文介紹的方法,基於Unity 2020,但是別的版本也差不多。

# 1. 添加Facebook小遊戲發布模板

Unity提供了2個默認模板(Default和Minimal),都在Unity的安裝目錄下 

<Unity Installation>/PlaybackEngines/WebGLSupport/BuildTools/WebGLTemplates/

我使用的是Default模板,因為這個模板的功能更完整。

把Default目錄複製到項目的Assets/WebGLTemplates/<自己的模板>

假設模板目錄為FacebookDefault,那麼工程的Assets目錄大概是這樣子:

# 2. 適配Facebook小遊戲平臺

默認模板,需要修改以下幾個地方才能適配Facebook小遊戲平臺:

## 2.1. 移除在行動裝置上運行的警告

在啟動腳本index.html中,把以下這段注釋掉,不然Unity在手機上運行時會彈出一個警告。

改成這樣子

## 2.2. 全屏顯示

把unity-container的class改成unity-mobile,這樣Unity遊戲會自動全屏,而且不顯示額外的按鈕和標題欄。

可以用代碼修改,示例是用代碼修改的。

            container.className = "unity-mobile";      config.devicePixelRatio = 1;

也可以直接去修改unity-container的class:

<div id="unity-container">...</div>

## 2.3. 添加Facebook小遊戲SDK的引用

如果沒有引用sdk,直接上傳的話,會提示:Must Reference SDK via CDN

在index.html的前邊,加入:

<script src="https://connect.facebook.net/en_US/fbinstant.6.3.js"></script>

像這樣子:

## 2.4. 添加Facebook啟動代碼

### 2.4.1. 先將Unity的啟動代碼封裝為一個function

這是Unity的原始啟動代碼

封裝起來,留著後續調用

      // 把加載Unity遊戲代碼和素材的代碼段提取到一個function中,便於後續調用      function startUnity(){        var script = document.createElement("script");        script.src = loaderUrl;        script.onload = () => {          createUnityInstance(canvas, config, (progress) => {            progressBarFull.style.width = 100 * progress + "%";          }).then((unityInstance) => {            loadingBar.style.display = "none";            fullscreenButton.onclick = () => {              unityInstance.SetFullscreen(1);            };          }).catch((message) => {            // alert(message); // facebook 不允許alert            console.error("Creating Unity Instance Failed: ", message);          });        };        document.body.appendChild(script);      }

### 2.4.2. 添加Facebook啟動代碼

Facebook小遊戲啟動時,必須先調用FBInstant.initializeAsync(),任何在這個方法之前的渲染操作,都會失敗。

然後調用FBInstant.startGameAsync(),這個方法是通知Facebook,遊戲已經開始了。

但是,實際上,遊戲並沒有真正開始,還需加載Unity遊戲代碼和相關的資源。

當然,完全也可以等Unity遊戲完全加載完後,再調用FBInstant.startGameAsync()。

參考代碼:

      // 啟動 facebook初始化      console.log("=====> FBInstant.initializeAsync");      FBInstant.initializeAsync()        .then(function () {          console.info("=====> FBInstant.startGameAsync");          // 告訴Facebook加載完畢,可以進入遊戲了          // 也可以在這裡加載Unity遊戲代碼和資源,然後再加載完後再進入遊戲                   FBInstant.startGameAsync().then(function() {            console.info("=====> screen size: " + `${screen.width} x ${screen.height}`);            console.info("=====> window size: " + `${window.innerWidth} x ${window.innerHeight}`)
// 開始加載Unity遊戲代碼和資源 startUnity(); }); });

代碼修改完畢,但是還沒有完。

## 2.5. 添加Facebook的配置文件 fbapp-config.json

這個文件是Facebook小遊戲的配置文件,缺少的話,也是無法上傳的。

在模板目錄下添加一個文件,命名為 fbapp-config.json,定製內容的話,可以參考Facebook的文檔。

> https://developers.facebook.com/docs/games/instant-games/bundle-config

以下是一個參考

{  "instant_games": {    "platform_version": "RICH_GAMEPLAY",    "custom_update_templates": {      "play_turn": {        "example": "Devon just finished his game and scored 999m"      },      "new_match": {        "example": "Devon want to play with you"      }    },    "navigation_menu_version":"NAV_FLOATING"  }}

然後就可以進行打包了

# 3.打包

## 3.1. 選擇WebGL平臺


## 3.2. 選擇打包模板

打開Player Settings,在WebGL Template中,選擇剛剛配置好的FacebookDefault模板:

## 3.3. 關閉壓縮格式

由於Unity的一個bug,瀏覽器無法正確解壓Unity的WebGL包,所以需要關閉。

參考: https://xmanyou.com/unity2020-webgl-unity-framework-not-defined/

位置:Player Settings -> Publishing Setings -> Compress Format

# 4. 打包

第一次打包比較慢,我電腦花了大概3分鐘……

Unity 2020之後,如果項目沒有什麼大的修改的話,再次打包就快很多了。

看一下打包輸出的目錄,如果包含了fbapp-config.json,說明模板配置和選擇是正確的。

然後可以準備上傳測試了。

# 5. 上傳測試

在Facebook小遊戲後臺,將打包出來的WebGL目錄壓縮成zip包上傳。

上傳成功後,推入Testing測試環境。

# 6. 測試

先在瀏覽器測試,看到這個熟悉的界面,就成功了50%。

看到遊戲界面,成功了90%。

打開控制臺,如果沒有什麼錯誤,並且日誌正常,恭喜你成功了99%。

最後的1%,需要通過手機上的最終測試。

# 7. 後續工作

## 7.1. 優化遊戲包

如果沒有進行裁剪,Unity的WebGL代碼還是比較大,即使是壓縮成zip,也有5M大小。

## 7.2. 美化遊戲加載界面

比如改掉Unity的啟動logo和啟動進度條。

## 7.3. 接入更多Facebook功能

Facebook小遊戲提供了很多功能,即使不接,也不影響遊戲的正常運行。

但是,至少有一個是要接的,那就是:變現。

Facebook小遊戲最主要的變現方式是:廣告

具體Unity如何調用Facebook小遊戲的廣告接口,可以參考文檔:

https://docs.unity3d.com/2020.2/Documentation/Manual/webgl-interactingwithbrowserscripting.html

## 7.4. 增加一鍵上傳功能

由於時間原因,我並沒有做上傳功能。

但是,Facebook提供上傳的接口,可以編寫Unity插件,實現真正的一鍵打包上傳,這個沒有什麼難度(才怪!)。

# 8. 是否支持微信小遊戲或者其他小遊戲平臺?

通過自定義模板的方法(再加上強大的Unity插件功能),打包到微信小遊戲或者抖音小遊戲等平臺,不是不可能,只是會很麻煩,甚至非常麻煩。

這是因為:

Facebook小遊戲平臺比較簡單,可以運行幾乎任何可以在瀏覽器運行的H5遊戲。

微信小遊戲和國內很多其他小遊戲,基本上都是自己重新封裝了一套js接口,導致很多接口沒法使用,所以需要添加適配代碼才可以。

Unity的代碼是閉源的,導致想要寫這麼個適配器,難度大大增加。

當然了,除了寫適配器之外,還有不少別的方法可以繞開這個限制,這個就不是本文想要討論的方法了。

# 9. 參考文獻

# 10. 廣告時間

手上有遊戲的同學,想要上Facebook小遊戲平臺賺點美元的,可以聯繫我們微遊互娛。

對了,我是負責對接的技術支持,所以對接過程的技術問題完全不用擔心(才怪!)。

微遊互娛 www.minigame.vip


# 源碼

給看到這裡的同學一個福利,後臺回復 unity2fb,可以獲得示例源碼git地址。

相關焦點

  • 張路斌:從HTML5到Unity的遊戲開發之路
    一開始接觸Java、.Net和PL/SQL開發工作,由於碰上金融危機公司裁員,便跳槽至一家小公司做了半年手機遊戲開發,隨後到一家網際網路公司工作。現在在一家遊戲公司上班,接觸最多的是Unity開發。  Lufy曾開發《楊家將傳奇》、大型網頁遊戲《アイドルバトル》、《Flash遊戲ポイガチャ》、多平臺三國記系列遊戲,以及數十款手機小遊戲。
  • 在樂高商店裡將能玩到街機?遊戲是由玩家自己設計的!
    這是樂高與Unity第二次合作的Idesa比賽活動的一部分,旨在讓玩家來開發一款以樂高角色為元素的微遊戲,並且有一個頗為有趣的獎勵:有機會讓你的遊戲出現在世界各地的樂高之家和樂高商店中。如果想參加這個比賽,你需要用Unity和樂高提供更多開發工具來設計一款一鍵操作的小遊戲,而經過多次迭代之後,樂高說現在的開發工具更加容易和有趣。
  • 程序丨如何在Unity中使用AssetBundle打包?
    ,對於unity項目,把資源壓縮打包有什麼用呢?那麼按照這個原理,你的Assets文件夾的大小將會影響到你最終打包出的安裝包的大小,假如你現在正在製作一個遊戲項目,最終打出來的安裝包過大可能會對玩家下載造成一定影響,對一般玩家來講,下載10M的遊戲安裝包遠遠比下載100M的遊戲安裝包要更容易接受,而AssetBundle可以將一部分資源打包到一個壓縮包裡面,遊戲運行到需要的時候再進行下載這部分資源。
  • 專訪張路斌:從HTML5到Unity的遊戲開發之路
    一開始接觸Java、.Net和PL/SQL開發工作,由於碰上金融危機公司裁員,便跳槽至一家小公司做了半年手機遊戲開發,隨後到一家網際網路公司工作。現在在一家遊戲公司上班,接觸最多的是Unity開發。Lufy曾開發《楊家將傳奇》、大型網頁遊戲《アイドルバトル》、《Flash遊戲ポイガチャ》、多平臺三國記系列遊戲,以及數十款手機小遊戲。
  • Facebook入局遊戲直播APP,能分一杯流量紅利的羹嗎?
    原計劃於本年度6月上線的Facebook遊戲直播App:Facebook Gaming,為了抓住疫情隔離期間線上遊戲火爆的機遇,於4月20日提前推出並上架到Google Play商店,供安卓用戶使用;IOS版本待Apple Store審核通過後也會面世。
  • 廣告圍城:廣告平臺秒變小遊戲巨頭!遊戲公司熱衷賣廣告
    AppLovin早先已經在中國設立分部,這家被三方機構Singular評為年度iOS買量ROI效果排名第5、Google Play排名第3的廣告平臺,進軍小遊戲發行可謂來勢洶洶。無獨有偶,廣告平臺做起了遊戲發行,遊戲發行商早先也已經衝入移動廣告領域多時。單國內以遊戲公司身份,操辦起廣告平臺的業內企業就有獵豹移動、遊道易、掌遊天下多家。
  • unity完整項目之滾球小遊戲(完整)
    今天來寫一篇unity開發一個滾小球小遊戲的整體流程。新手操作,大佬莫笑(文章中的代碼可能會因為手誤等原因敲錯,一切以最後截圖為準)。首先打開U3D,創建一個3D新項目。創建之後先保存一下項目,然後新建一個plane,作為遊戲的地板。
  • 2021年剛開始,Facebook 小遊戲平臺又要作妖?
    :Changes to the Instant Games Platform》> https://www.facebook.com/fbgaminghome/blog/changes-to-the-instant-games-platform按照這篇文章的說法(括號裡為本斌的吐槽,阿不,注釋),Facebook小遊戲平臺於2016
  • 對話Unity | 關於Unity大學、官方教程、小遊戲和系統改進
    Unity大學這期開的是Unity C#零基礎開發課程,是針對有志向從事遊戲、虛擬實境、數字孿生方向的學生或開發者。我們最大的優勢在於,Unity大學教授的內容是最專業、最權威的, 我們發現外面的培訓機構甚至是很多遊戲公司和工業應用公司用的Unity技術都是過時的甚至是片面的。
  • Python實現貪吃蛇小遊戲!!pyinstaller打包成exe!
    pygame允許你在 Python 程序中創建功能豐富的遊戲和多媒體程序,是一個高可移植性的模塊可以支持多個作業系統,用它來開發小遊戲非常適合。pip install pygame -i http://pypi.douban.com/simple --trusted-host pypi.douban.com利用python的pygame第三方庫和面向對象編程的方法,實現簡單的貪吃蛇小遊戲,還可用pyinstaller打包成exe,方便自己想玩的時候直接點開或者分享給別人
  • QQ小遊戲平臺歡迎什麼樣的小遊戲?| 遊戲幹線
    在完成平臺的升級之後,QQ億級流量澆灌之下的小遊戲中心已經正式運營了一段時間。在這段時間內,QQ小遊戲平臺已經誕生出了新一批爆款小遊戲。此前,我們在十億流量+三大中心,中心化的QQ小遊戲到底有哪些不同 中將QQ小遊戲平臺分為三大中心,分別探討了它們的區別和特點。那麼在這段時間裡,三大中心所誕生的爆款小遊戲產品都有什麼區別,和中心的屬性又有什麼聯繫?
  • 將打包徹底一鍵化!Unity和Jenkins真是絕配
    每次他們打包總要跟我抱怨,國內版本打包步驟要10多步還能忍,不能忍的是越南版本一下子21步,所以他們也總是調侃我們程序!QA:"大佬,什麼時候能優化下打包流程,說好的一鍵呢?"我:"大約在冬季,下個項目肯定一鍵,如果有可能給你做個語音的,直接說打包就行了"。最後純屬開玩笑,好了,廢話不多說了,切入今天正題,如何做到一鍵打包?
  • Unity遊戲逆向及破解方法介紹
    Unity3D遊戲的不斷產出,遊戲的安全性要求也越來越高,在此歸納一些逆向用到的方法和思路以及一些輔助性工具,做一些知識普及。識別Unity遊戲Android平臺的apk包可以直接解壓,看是否有./assets/bin/Data/Managed目錄,也可以查看lib文件夾下面包含的一些so,如果有libmono,libunity等模塊,基本可以確定是unity遊戲了。
  • 《輻射4》官方Pip-Boy上架移動平臺,附贈《飛彈指揮官》小遊戲
    距離《輻射4》正式發售還有不到一周時間,B社又放出一個小驚喜,一款將和《輻射4》遊戲聯動的Pip-Boy應用已經上架App Store、Google Play以及Windows Phone平臺,供輻射粉們免費下載。
  • 簡單 Unity3D 安卓遊戲逆向思路
    起因是個人很喜歡玩 google play 上的一些數字類型(角色攻擊是線性增長,怪物指數變強,到後期越打不過,通過重生增強屬性變強)的小遊戲。但是這種遊戲仍舊存在一定缺陷,前期資源不多,玩的太慢、玩的時間長了,就感覺沒意思,就不想玩了,所以在玩到遊戲中期的時候,往往都會去網上搜索XXX破解版/內購版,快速進入後期然後放棄這款遊戲。
  • 【乾貨】Unity遊戲逆向及破解方法介紹
    Unity3D遊戲的不斷產出,遊戲的安全性要求也越來越高,在此歸納一些逆向用到的方法和思路以及一些輔助性工具,做一些知識普及。 識別Unity遊戲Android平臺的apk包可以直接解壓,看是否有./assets/bin/Data/Managed目錄,也可以查看lib文件夾下面包含的一些so,如果有libmono,libunity等模塊,基本可以確定是unity遊戲了。Android平臺中C#編寫的主邏輯模塊代碼靜態編輯之後存儲於Assembly-CSharp.dll文件中。
  • 【教程】unity遊戲修改so文件
    好了,說了這麼多,下面從開始unity3d遊戲開發的的角度逐漸逆向分析。  一、通過unity3d打包生成libil2cpp.so:1.如何識別u3d遊戲?打開解壓包,如果lib文件夾下有libunity.so就證明這是一個unity3d遊戲。
  • 小遊戲開啟下半場:產品為王、大公司進入、新流量入口激活
    而在上一篇《小遊戲的流量紅利期結束了》的文章中,羅斯基提到了小遊戲的流量紅利期已經過去,說的雖然是微信對分享和小程序(遊戲盒子)的跳轉限制對行業的影響(包括今天還爆出了iOS手機微信小遊戲盒子搜索入口被封停的消息),但其實更多是在談遊戲產品品質快速提升加速競爭淘汰的事實。小遊戲已經從單純的比拼流量玩法過渡到了重視產品品質的階段。
  • Unity Playground開啟遊戲製作之旅
    Unity Playground項目中有6個非常簡單的小遊戲,它們僅使用了項目中的美術資源和腳本來構建。這些遊戲包括:塔防遊戲、雙人足球遊戲、迷宮遊戲、《Lunar Lander》類遊戲、自由漫遊和收集物品的冒險遊戲、以及包含簡單的庫存和合成系統的Roguelike遊戲。
  • Unity 3D 引擎-遊戲開發速遞
    Unity大中華區業務總經理肖蓓蓓近日在2021 北京國際創新大會(BIGC)中分享了跨端遊戲趨勢向好的原因。在遊戲開發的過程中,作為內容工具的Unity依託自身成熟的引擎技術及針對各開發環節的關鍵支撐技術,助力遊戲開發者多端布局變現,甚至是推動元宇宙構建的進一步成熟。Unity支持多平臺發布,只需一次編譯,就可多平臺一鍵發布。