Unity3D
簡介
Unity3D是由Unity Technologies開發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動畫等類型互動內(nèi)容的多平臺的綜合型游戲開發(fā)工具,是一個(gè)全面整合的專業(yè)游戲引擎。
具體來說:引擎是開發(fā)者開發(fā)內(nèi)容的框架,整合了很多個(gè)開發(fā)的關(guān)鍵模塊。你可以將美術(shù)資源(如使用Maya或3ds Max制作的三維模型或Photoshop制作的圖片等)導(dǎo)入引擎中,然后將這些資源建造成場景,添加燈光、音頻、特效、物理和動畫,然后通過編寫腳本增加交互和邏輯,最后調(diào)試、優(yōu)化,發(fā)布到目標(biāo)平臺(如PC、移動端、游戲機(jī)等平臺)。
用Unity可以開發(fā):2D/3D游戲,2D/3D應(yīng)用,VR,AR,甚至移動App,網(wǎng)頁前端 ,電影實(shí)時(shí)渲染。下面舉兩個(gè)例子。
作為國民手游,相信你一定玩過或者聽說過,這款游戲就是采用Unity引擎開發(fā)的。

風(fēng)靡一時(shí)的手機(jī)跑酷類游戲,可以說是手游的鼻祖之一。

語言
在Unity中可以使用的語言,官方推薦的由JS和C#兩種。現(xiàn)在主流的大都是C#編寫。
環(huán)境搭建
安裝Unity Hub
參考文檔: https://docs.unity3d.com/Manual/GettingStartedInstallingHub.html
Unity Hub安裝好后,選擇Unity版本,安裝,把iOS的組件安裝好。
安裝XCode
安裝Visual Studio。(寫C#代碼用)
選擇下載Community 2019版。
背景
Unity3D作為一款跨平臺開發(fā)工具,難免會與原生平臺進(jìn)行一些交互操作來完成一些特定的平臺功能。例如:你需要直接操作iOS的IAP來實(shí)現(xiàn)游戲中的內(nèi)付費(fèi)功能;甚至一些第三方SDK沒有提供U3D版本的情況下,你會直接在原生系統(tǒng)平臺調(diào)用其提供接口等等。
實(shí)現(xiàn)
iOS調(diào)Unity
//iOS中
//參數(shù)一:是需要提供腳本掛載的物體名稱,如果掛載在主攝像機(jī)上,那這里就填"Main Camera"。
//參數(shù)二:這里需要注意,填寫的是方法名,而不是類名,unity提供的這個(gè)SendMessage方法機(jī)制是根據(jù)提供的掛載體遍歷需要調(diào)用的方法,保證方法名是唯一就行。
//參數(shù)三:這是需要傳遞的參數(shù),如果不需要傳值就用""就行。
UnitySendMessage("iOSSendMessageToUnity", "ChangeCameraDirection", "");
//Unity中
public class iOSSendMessageToUnity : MonoBehaviour
{
public void ChangeCameraDirection() {
Debug.Log(@"更改相機(jī)方向");
}
}
Unity調(diào)iOS
- 在unity腳本中引用using System.Runtime.InteropServices; 作用是:使用DllImport,提供從非托管DLL導(dǎo)出的函數(shù)的必要調(diào)用信息
//static:靜態(tài)方法。(靜態(tài)方法:不屬于類的實(shí)例,而是屬于類本身)
//extern:支持在外部實(shí)現(xiàn)方法。
[DllImport("__Internal")]
private static extern void UnitySendMessageToiOS();
public void Test() {
UnitySendMessageToiOS();
}
void Start () {
Test();
}
- 在iOS中聲明
extern "C"
{
void UnitySendMessageToiOS() {
NSLog(@"收到Unity的調(diào)用");
}
}
注意事項(xiàng)與踩坑:
- 如果在編寫給Unity使用的NativeSDK,NativeSDK需要調(diào)UnitySendMessage,此時(shí)不需要引入U(xiǎn)nity相關(guān)的環(huán)境/代碼/庫等??梢灾苯尤致暶鱑nitySendMessage函數(shù)(此時(shí)NativeSDK工程只能編譯通過,但不能真正做到向Unity發(fā)消息)。當(dāng)NativeSDK被引入U(xiǎn)nity工程后,便可以正常工作。
extern void UnitySendMessage(const char *, const char *, const char *);
注意在iOS中對應(yīng)文件后綴名更換為.mm文件,因?yàn)閑xtern "C" 是c++代碼。
在iOS調(diào)Unity的過程中,在iOS傳遞字符串需要對NSString轉(zhuǎn)成char *。使用[NSString UTF8String]方法。
UnitySendMessage("Object","GetUserMessage",[User UTF8String]);
在Unity調(diào)iOS的過程中,在iOS方法里面如果需要取字符串參數(shù),要對字符串參數(shù)進(jìn)行char *轉(zhuǎn)NSString處理。使用[NSString stringWithUTF8String:]方法。
在Unity調(diào)iOS的過程中,如果是同步調(diào)用方法(也就是iOS需要返回給Unity char *),在iOS方法中需要先對NSString轉(zhuǎn)char *,并對char *用strdup包起來(用strdup給字符串分配內(nèi)存),不然在Unity中釋放該變量會引起il2cpp_codegen_marshal_free錯(cuò)誤。
extern "C" {
char * iosHandleMsgFromUnitySync(const char *msg) {
NSString *newMsg = @"test";
return strdup([newMsg UTF8String]);
}
}