如何做一個跨平臺的游戲App?

来源:https://www.cnblogs.com/YueHeiZS/archive/2019/05/20/10669429.html
-Advertisement-
Play Games

如何做一個跨平臺的游戲App? iOS和安卓系統上的應用程式,根據提供的內容不同,按照開發方式和用戶體驗不同,可區分為app和游戲; 首先從開發方式不同來說明,app開發一般是用操作系統官方提供的開發套件來做對應的開發; 這裡的開發套件就系統不同可做以下區別: iOS: Xcode, Objecti ...


如何做一個跨平臺的游戲App?

 

iOS和安卓系統上的應用程式,根據提供的內容不同,按照開發方式和用戶體驗不同,可區分為app和游戲;

首先從開發方式不同來說明,app開發一般是用操作系統官方提供的開發套件來做對應的開發;

這裡的開發套件就系統不同可做以下區別:

iOS:  Xcode, Objective-C

android: AndroidStudio, Java/Kotlin

游戲的開發方式就很多了,不過最終一步一般都是生成對應IDE的項目工程,然後在對應的項目工程上進行配置設置,簽名配置等步驟,最後完成打包.ipa和.apk的打包; 在最後一步前開發方式就根據項目需求以及其他因素考量,可採取不同的開發方案了; 之前有幸在做iOS的SDK開發,對接了上百款游戲,也算對游戲的開發環境有所瞭解了。

2D游戲一般用: Cocos2dx, Cordova,Corona,Contruct2等,當然也可以用Unity來開發2D游戲;

3D游戲一般用: Unity為主流;

最後從用戶體驗不同來說明,

app在前幾年時間里,界面一般要根據不同系統來做開發,市面上看到的很多app的iOS版本和安卓版本有一些UI是長的不一樣的, 這裡就導致用戶體驗不一致的問題,如果領導需要,可採取混合網頁的方式,但是同時會帶來體驗不流暢的問題,這就要看溝通了,最終採取哪種方式了。

一般情況下,市面上的應用程式要麼是app要麼是游戲類型,但是碰到一些需求,需要吸取app和游戲的特性,融合在一起,豐富應用程式的功能和體驗,這時候我們開發的應用程式,我通常稱它為游戲app.

 

前段時間參與過一個項目,功能和體驗就是這樣的一個應用程式,我把用到的基本技術抽出來,整理代碼出來一個小demo, 其它類似的游戲混合app都可以借鑒此思路進行開發; 這個小demo的效果如下所示:

                            iOS                  Android

 

demo說明:

演示場景最後一個畫面是Unity的游戲場景,倒數第二個界面是React-Native界面,其它頁面是原生界面;

相關開發環境說明:

Unity2018.3.11f1

AndroidStudio3.3.2 (gradle插件版本3.2.0,gradle版本4.10.1,buildToolsVersion 29.0.0-rc1)

ReactNative0.59.5

XCode10.2.1

demo效果參考步驟如下: 

一. 創建ReactNative工程

參考文檔https://facebook.github.io/react-native/docs/getting-started,逐步實現RN功能,下麵截圖就是我demo工程里創建的一個測試登錄界面:

 

二.Unity導出原生項目

這步網上有很多教程,參考就可以了,基本沒什麼特別需要註意的地方,主要是一些打包配置設置問題,在我demo工程里,由於我引入了ReactNative功能,我需要把導出的xcode工程和as工程放到指定的文件夾層次,我把導出的原生項目工程截圖所示如下:

 

使用的Unity版本在iOS和安卓打包的時候,有一些區別;

iOS端:  打包生成Xcode工程,可以選擇replace或者append, 建議用append方式,這樣每次打包不影響原生工程的東西。

安卓端: 打包生成AS工程,會直接替換老的文件,建議用github Desktop進行代碼文件管理,不然原生工程修改的相關配置一不小心就被覆蓋了。

 

下麵說一下Unity每次修改打包成Xcode工程和AS工程的時候,會改變哪些代碼和哪些文件? 此類混合項目要清楚,不然在功能協作的時候,很容易發生混亂,代碼相互覆蓋等問題!

 

  開發場景一: 每次修改Unity里的.scene里的場景數據,打包出來Xcode工程,截圖所示文件夾內的代碼文件會發生大幅度的修改

  iOS

 

 android

 

 開發場景二: 腳本代碼發生修改後,打包出來的文件,截圖所示紅框部分文件每次新打包都會改變,黃框部分文件是腳本代碼發生修改後,打包出來發生修改的文件

 iOS                                 android

 

 

 測試發現Unity打包出Xcode工程以及Unity里功能變更,打包出來的Xcode工程,涉及到文件和項目配置眾多,之前網上看到的很多文章大都是把Unity打包出來的新文件和配置,手動在原生項目里進行修改和文件引用眾   多工作,我個人操作很麻煩,也有很多問題,每次Unity端功能發生更新,代碼和文件更新到原生項目就有點麻煩了,我這邊的操作步驟是在Unity端打包出來的Xcode工程上進行原生模塊功能添加,原生模塊功能以動態   庫.framework形式引入,彼此松耦合!

 

三.原生項目框架引入

這一步按照ReactNative官方文檔https://facebook.github.io/react-native/docs/integration-with-existing-apps來就可以了,這裡需要註意;

我在iOS端使用CocoaPods (建議最好用CocoaPods集成方式,跟之前的項目工程形成松耦合)方式的時候,有一些第三方React-Native庫沒有CocoaPods集成方式,這時候就需要查看源碼來手動link和項目配置了,或者換第三方庫,再或者自己寫,自己寫的話,可按照官方指引https://facebook.github.io/react-native/docs/native-modules-setup來;

 下麵分享一段我項目中使用的Podfile文件

 

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'Unity-iPhone' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for Unity-iPhone

  # 'node_modules'目錄一般位於根目錄中
  # 但是如果你的結構不同,那你就要根據實際路徑修改下麵的`:path`
  
  pod 'React', :path => '../node_modules/react-native', :subspecs => [
 'Core',
  'CxxBridge', # 如果RN版本 >= 0.47則加入此行
 'DevSupport', # 如果RN版本 >= 0.43,則需要加入此行才能開啟開發者菜單
 'RCTText',
 'RCTNetwork',
  'RCTWebSocket', # 調試功能需要此模塊
 'RCTAnimation', # FlatList和原生動畫功能需要此模塊
 # 在這裡繼續添加你所需要的其他RN模塊
 'RCTImage',
  ]
  # 如果你的RN版本 >= 0.42.0,則加入下麵這行
 pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'

 # 如果RN版本 >= 0.45則加入下麵三個第三方編譯依賴
 pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
 pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
 pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'

#  # CodePush plugin dependency
#  pod 'CodePush', :path => '../node_modules/react-native-code-push'
#  pod 'react-native-blur', :path => '../node_modules/react-native-blur'
#  pod 'react-native-fetch-blob',:path => '../node_modules/react-native-fetch-blob'
#  pod 'react-native-fast-image',:path => '../node_modules/react-native-fast-image'
#  pod 'react-native-orientation',:path => '../node_modules/react-native-orientation'
#  pod 'RNFS', :path => '../node_modules/react-native-fs'
#  pod 'RNSVG',:path => '../node_modules/react-native-svg'

  
  target 'Unity-iPhone Tests' do
    inherit! :search_paths
    # Pods for testing
#    pod 'react-native-blur', :path => '../node_modules/react-native-blur'

  end

end

 

四. 功能整合

這裡要以iOS和android兩端做對應處理,區別有點大,由於iOS和安卓端都是我一個人弄,而我本身是iOS出身,對iOS端會更熟悉些,安卓端處理可能會不太專業,但也算初步實現了。

以iOS端為例:

前面的步驟可以算ReactNative功能跟Unity功能初步集成到一起了,接下來就要再加入iOS原生功能,最後再把ReactNative功能,Unity功能串接到一起了!

1. 加入iOS原生功能

demo里我是加入了兩個導航頁面,我是直接在Unity導出的Xcode工程上加入的,因為Unity導出Xcode工程是可以增量更新的,後續Unity測功能更新,重新打包也不會影響我舊有Xcode工程的代碼。

2.引入ReactNative功能

在第一步里,我們已經創建好ReactNative項目,也創建了一個登錄測試頁面,在這一步里我們需要導航到這個頁面,這個頁面我們需要用一個原生視圖控制器來承載,然後就是原生功能的簡單導航了

 

-(UIViewController*) getRNDisplayVC
{
    if(!self.rnVC)
    {
        NSURL* jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
        jsCodeLocation=[[NSBundle mainBundle] URLForResource:@"/bundle/index" withExtension:@"jsbundle"];
        RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                            moduleName:@"myApp"
                                                     initialProperties:nil
                                                         launchOptions:self.launchOptions];
        rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
        UIViewController *rootViewController = [UIViewController new];
        rootViewController.view = rootView;
        self.rnVC=rootViewController;
    }
    return self.rnVC;
    
}

代碼里我使用的是已經打包好的.jsbundle文件,下麵給出打包命令,在ReactNative文件夾下創建bundle文件夾,然後在ReactNative項目根文件夾里打開終端命令,輸入下麵代碼

react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ./bundle/index.jsbundle --assets-dest ./bundle

 

最後把bundle文件夾引入到項目工程里,使用視圖控制器的導航相關代碼,就已經完成原生頁面向ReactNative頁面導航了,而ReactNative頁面向原生頁面導航,實質就是ReactNative訪問原生模塊的問題了,參考官方指引 https://facebook.github.io/react-native/docs/native-modules-ios#content

3.Unity跟原生互調或者Unity跟ReactNative互調

本質就是Unity跟原生的通信了,網上文章很多,這裡就不闡述了。

 

demo的開發思路初步是這樣,其中有一些步驟還不算完美,有做類似此類項目的同學,可以一起討論! 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從sys.objects對象表中,可以獲取當前資料庫所有觸發器: SELECT * FROM sys.objects WHERE [type] = 'tr' ...
  • 關係運算 關係代數 關係代數的基本操作 並 使用條件:兩個關係滿足並相容性 操作結果:將兩個關係合併,並刪除重覆的元組 差 使用條件:兩個關係滿足並相容性 操作結果:R-S產生一個元組在R中但不在S中的關係 笛卡爾積 操作結果:RxS表示將R與S中所有元組拼接的可能。 選擇 操作結果:選擇出滿足條件 ...
  • caement Archaic spelling of cement. caement Alternative forms[edit] caement (archaic) cæment (archaic) Hyphenation: cement Noun cement (countable and ...
  • 最近準備對之前學習SQL Loader的筆記進行整理,希望通過官方文檔中的示例學習(Case Studies)來進行,但是官方文檔中示例學習相關的腳本文件在資料庫軟體安裝完成之後預設並沒有提供,而是整合在另外一個安裝介質中,需通過安裝Oracle Examples介質來獲取相應的示例學習腳本。 數據 ...
  • 本例實現動態表名,列名,輸入參數,輸出參數等進行操作。 先準備一些數據: IF OBJECT_ID('tempdb.dbo.#Part') IS NOT NULL DROP TABLE #Part CREATE TABLE #Part ( [ID] INT, [Item] NVARCHAR(40), ...
  • 一、手機界面UI渲染顯示流程 二、16ms原則 三、造成卡頓的原因 四、過度繪製介紹、檢測工具、如何避免造成過度繪製造成的卡頓 ...
  • 一 :Bluetooth 的設置應用 packages\apps\Settings\src\com\android\settings\bluetooth\ 藍牙設置應用及設置參數,藍牙狀態,藍牙設備等。 BluetoothDevicePreference.java 顧名思義,藍牙設備首選項,也就是藍 ...
  • 一 : Android.mk文件概述 主要向編譯系統指定相應的編譯規則。會被解析一次或多次。因此儘量減少源碼中聲明變數,因為這些變數可能會被多次定義從而影響到後面的解析。這個文件的語法會把源代碼組織成模塊,每個模塊屬於下列類型之一: 二 : 系統變數 三 : mk文件模板 編譯C/C++應用程式的模 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...