Unity3D
簡介
Unity3D是由Unity Technologies開發的一個讓玩家輕松創建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內容的多平臺的綜合型游戲開發工具,是一個全面整合的專業游戲引擎。
具體來說:引擎是開發者開發內容的框架,整合了很多個開發的關鍵模塊。你可以將美術資源(如使用Maya或3ds Max制作的三維模型或Photoshop制作的圖片等)導入引擎中,然后將這些資源建造成場景,添加燈光、音頻、特效、物理和動畫,然后通過編寫腳本增加交互和邏輯,最后調試、優化,發布到目標平臺(如PC、移動端、游戲機等平臺)。
用Unity可以開發:2D/3D游戲,2D/3D應用,VR,AR,甚至移動App,網頁前端 ,電影實時渲染。下面舉兩個例子。
作為國民手游,相信你一定玩過或者聽說過,這款游戲就是采用Unity引擎開發的。
風靡一時的手機跑酷類游戲,可以說是手游的鼻祖之一。
語言
在Unity中可以使用的語言,官方推薦的由JS和C#兩種。現在主流的大都是C#編寫。
環境搭建
安裝Unity Hub
參考文檔: https://docs.unity3d.com/Manual/GettingStartedInstallingHub.html
Unity Hub安裝好后,選擇Unity版本,安裝,把iOS的組件安裝好。
安裝XCode
安裝Visual Studio。(寫C#代碼用)
選擇下載Community 2019版。
背景
Unity3D作為一款跨平臺開發工具,難免會與原生平臺進行一些交互操作來完成一些特定的平臺功能。例如:你需要直接操作iOS的IAP來實現游戲中的內付費功能;甚至一些第三方SDK沒有提供U3D版本的情況下,你會直接在原生系統平臺調用其提供接口等等。
實現
iOS調Unity
//iOS中
//參數一:是需要提供腳本掛載的物體名稱,如果掛載在主攝像機上,那這里就填"Main Camera"。
//參數二:這里需要注意,填寫的是方法名,而不是類名,unity提供的這個SendMessage方法機制是根據提供的掛載體遍歷需要調用的方法,保證方法名是唯一就行。
//參數三:這是需要傳遞的參數,如果不需要傳值就用""就行。
UnitySendMessage("iOSSendMessageToUnity", "ChangeCameraDirection", "");
//Unity中
public class iOSSendMessageToUnity : MonoBehaviour
{
public void ChangeCameraDirection() {
Debug.Log(@"更改相機方向");
}
}
Unity調iOS
- 在unity腳本中引用using System.Runtime.InteropServices; 作用是:使用DllImport,提供從非托管DLL導出的函數的必要調用信息
//static:靜態方法。(靜態方法:不屬于類的實例,而是屬于類本身)
//extern:支持在外部實現方法。
[DllImport("__Internal")]
private static extern void UnitySendMessageToiOS();
public void Test() {
UnitySendMessageToiOS();
}
void Start () {
Test();
}
- 在iOS中聲明
extern "C"
{
void UnitySendMessageToiOS() {
NSLog(@"收到Unity的調用");
}
}
注意事項與踩坑:
- 如果在編寫給Unity使用的NativeSDK,NativeSDK需要調UnitySendMessage,此時不需要引入Unity相關的環境/代碼/庫等。可以直接全局聲明UnitySendMessage函數(此時NativeSDK工程只能編譯通過,但不能真正做到向Unity發消息)。當NativeSDK被引入Unity工程后,便可以正常工作。
extern void UnitySendMessage(const char *, const char *, const char *);
注意在iOS中對應文件后綴名更換為.mm文件,因為extern "C" 是c++代碼。
在iOS調Unity的過程中,在iOS傳遞字符串需要對NSString轉成char *。使用[NSString UTF8String]方法。
UnitySendMessage("Object","GetUserMessage",[User UTF8String]);
在Unity調iOS的過程中,在iOS方法里面如果需要取字符串參數,要對字符串參數進行char *轉NSString處理。使用[NSString stringWithUTF8String:]方法。
在Unity調iOS的過程中,如果是同步調用方法(也就是iOS需要返回給Unity char *),在iOS方法中需要先對NSString轉char *,并對char *用strdup包起來(用strdup給字符串分配內存),不然在Unity中釋放該變量會引起il2cpp_codegen_marshal_free錯誤。
extern "C" {
char * iosHandleMsgFromUnitySync(const char *msg) {
NSString *newMsg = @"test";
return strdup([newMsg UTF8String]);
}
}