1. 如何編寫Unity原生插件
unity可以導入其它語言編寫(和編譯)的代碼,稱為原生插件(Native Plugins)。今天為大家分享如何創建Unity原生插件。
Unity中的託管和非託管插件
連接不同的代碼並非Unity首創的。若你是Windows用戶,可能聽說過DLL,動態鏈接庫的縮寫。與單機應用類似,它們是編譯過的軟體。不同的是,它們不能直接執行,因為它們是被專門設計為供其它應用使用的。
Unity支持兩種插件:託管(Managed)和非託管(Unmanaged)的。前者是用C#編寫並編譯為通用中間語言(CIL)的位元組碼語言。託管插件與C#腳本一樣強大,且帶有編譯過的源碼。非託管(或原生)插件,是使用其它語言編寫的軟體,典型是C++。它們在功能上幾乎沒什麼限制,而且因為都被編譯為機器碼所以通常比傳統的腳本要快。
第一步:新建C++項目
本例中,我用的是Visual Studio 2015;你可以選擇任意IDE編譯C++代碼。首先創建一個非託管C++庫也就是新建項目。打開Visual Studio,依次點擊File | New Project ,選擇Visual C++ | Win32 Console Application。
在給項目命名後(本例中為TestDLL),確保將應用類型(Application type)設為DLL,附加選項(Additional options)下選擇空項目(Empty project)。
至此,Visual C++解決方案已經准備好,我們可以開始編寫代碼了。
第二步:編寫庫
C++代碼通常分為兩個文件。函數定義(頭文件)和函數實現(實現文件)。實現文件為.cpp文件,放在ResourceFiles目錄下,頭文件為同名.h放在HeaderFiles目錄下。本例中我們創建一個頭文件和一個實現文件;實現文件將包含所有要保存到DLL的功能。可以在相應的文件夾上單擊右鍵新建文件,然後依次選擇Add(添加)>NewItem(新選項)。
實現部分:TestDLLSort.cpp
開始編碼,實現給數組排序。
[AppleScript] 純文本查看 復制代碼?
#include "TestDLLSort.h" #include extern "C" { void TestSort(int a[], int length) { std::sort(a, a+length); } }
5~7行使用了algorithm 庫里的數組排序函數std:sort。如果熟悉C++11就會知道。只增加了extern "C"塊,必須用它將TestSort的引用導出到DLL。
頭文件:TestDLLSort.h
實現文件中的定義必須與頭文件保持完全一致。它必須包含TestSort原型也就是函數簽名。
[AppleScript] 純文本查看 復制代碼?
123456 #define TESTDLLSORT_API __declspec(dllexport) extern "C" { TESTDLLSORT_API void TestSort(int a[], int length); }
其餘部分是創建DLL必須的代碼。TESTDLLSORT_API可以是任意名字,用來標記所有的導出函數。在更復雜軟體中,TESTDLLSORT_API應該根據需要綁定到 __declspec(dllimport) 上。但是在本例中,沒有必要。
第三步:編譯
最後一步是在Visual Studio中編譯我們的DLL。請確保發布平台設置正確(32位或64位)。然後依次選擇Build>Build Solution。
在屏幕下方的控制台上會看到輸出日誌如下:
[AppleScript] 純文本查看 復制代碼?
1>------ Rebuild All started: Project: TestDLL, Configuration: Release x64 ------ 1> TestDLLSort.cpp 1> Creating library C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.lib and object C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.exp 1> Generating code 1> All 30 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 1> Finished generating code 1> TestDLL.vcxproj -> C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.dll ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
若發現有警告如:warning C4273: inconsistent dlllinkage,這可能表示編譯器不確定使用__declspec(dllimport) 還是 __declspec(dllexport)。若想為Unity創建原生插件,就使用後者。
第四步:導入Unity
根據上面的編譯日誌,在工程文件中找到編譯好的DLL。本例中,它在文件夾x64\Release中。我們只要這個文件。在Unity中使用它的第一步是把它拷貝到Plugins文件夾下。
原生插件通常與操作系統或平台相關。可以查看右側的檢視面板確保每個DLL被包含到正確的平台。
第五步:在Unity中使用
導入後,使用DLL就相對簡單了。第一步是使用DLLImport定義入口(EntryPoint)。你需要指定DLL名和函數名。會提供別名讓它可以像其它函數一樣被調用。
[AppleScript] 純文本查看 復制代碼?
using UnityEngine; using System.Runtime.InteropServices; public class TestDLL : MonoBehaviour { // The imported function [DllImport("TestDLL", EntryPoint = "TestSort")] public static extern void TestSort(int [] a, int length); public int[] a; void Start() { TestSort(a, a.Length); } }
入口的字元串必須與C++庫中的名字一樣。但你可以使用如下方法調用函數;以後C#就這樣調用它。
你應該注意到Unity在編輯器中不能檢測非託管DLL;必須運行游戲來檢測是否成功連接。對於託管的DLL,則可以靜態檢測。
2. 如何用C#製作一個帶有輸入框,按鈕,輸出框的Unity插件
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
界面只是一個和用戶交互的窗口,比如說在MFC中,界面和程序之間數據傳遞的方式就是通過UpDate()這個函數,UpDate(FALSE);是把變數數據傳給界面,UpDate(TRUE)是把界面數據傳給變數。當然,前提是需要它們之間關聯一下。這么一說樓主估計就明白界面的用處了吧。
MFC是用C++開發的,C++和C上還是有很大的差異的。直接入門會有很大的難度。建議樓主可以先看看C++的書。了解下,什麼是類,什麼是容器,什麼是重載,什麼是構造,什麼是析構,什麼是面向對象。這也不是一句話兩句話能講完的。
我給樓主些意見:
一:想玩界面的話,就用QT寫,或者先用其它簡單語言(VB、或國產易語言。PS:易語言實質上就是C++的封裝,不過很多功能都打包了,用起來比MFC簡單的多。)。
二:如果你想更深一步做軟體,可以選擇學習C++,然後學MFC
三:C語言很強大,是其它編程易語言無法超越的(個人觀點)。你前面的說C語言學的很好,我覺得你話撩的有點早。(這個觀點當你水平從菜鳥上升一兩個等級時候你就會明白)
四:多做項目。
3. 如何將ffmpeg變成unity插件
ffmpeg基本沒有什麼依賴,只要有libc和pthread就可以了。 基本的linux加上gcc和libc-dev就可以來編譯ffmpeg。 如果是x86/x64平台,可以增加一個yasm來使用一些匯編代碼加速, 如果要播放的支持,可以得編譯個SDL 當然,如果想使用一些插件,比如
4. unity 導出安卓工程怎麼編譯成apk
1.android端代碼可以在Eclipse中開發(AndroidStudio沒有試,應該也可以)
2.Unity3D端代碼要在Unity中開發
3.Android和Unity3D端,兩邊都需要加入一些代碼從而可以使之關聯交互。
4.將Android端代碼編譯成jar文件以插件形式放入到Unity端中
5.在Unity中將整個項目Build成apk文件,然後安裝到手機或模擬器里運行
本文主要講解1,2,3。對於4,5建議大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在編寫Android端和Unity3d端代碼前,有必要先了解一下可以使兩部分交互的類UnityPlay。
個人理解UnityPlay是個Unity提供給外部交互的一個介面類。
為什麼是「個人理解」?這我不得不爆粗口了,TMD官網根本就沒有相關的API和文檔(如果大家有誰找到一定給我來一份,就當我罵自己了)。
在關聯Android時,想拿到UnityPlay以及相關類的jar包可以從下面的地址找到:Unity安裝路徑\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夾下有一個classes.jar的jar文件,它就是我們想要的。
而在bin同目錄下有一個src文件,點擊到最後有3個類,分別是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前兩個打開個後只有一行代碼,說的是UnityPlayerActivity和UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity。而打開UnityPlayerNativeActivity中居然有代碼,而且我估計這應該是UnityPlayerNativeActivity的源碼。
由於關於UnityPlay的資料我只找到這么一個,所以我把UnityPlayerNativeActivity中的代碼都貼出來,如果我註解有不對的地方希望大家指正。
/**
* UnityPlayerActivity,UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity繼承自NativeActivity
* 在該類里定義了一些和ANDROID生命周期相同的回調方法,留給自定義的Activity子類重寫。
*/
public class UnityPlayerNativeActivity extends NativeActivity
{
//UnityPlayer的引用,並且我們不能改變這個引用變數的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;
protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 設置顯示窗口參數
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);
// 創建一個UnityPlayer對象,並賦值給全局的引用變數
mUnityPlayer = new UnityPlayer(this);
//為UnityPlayer設置一些參數
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在將view附加到layout之前調用。它將會調用native code
mUnityPlayer.init(glesMode, trueColor8888);
// 從UnityPlayer中獲取到Unity的View視圖
View playerView = mUnityPlayer.getView();
// 將Unity視圖載入到根視圖上
setContentView(playerView);
// 使Unity視圖獲取焦點
playerView.requestFocus();
}
protected void onDestroy ()
{
// 當Activity結束的時候調用UnityPlayer.quit()方法,它會卸載之前調用的native code
mUnityPlayer.quit();
super.onDestroy();
}
// 下面幾個方法都是ANDROID相關回調方法,確保在ANDROID執行相應方法時UnityPlayer也需調用相應方法
protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
}
}
5. unity項目文件打不開
一個unity只能打開一個項目,但這個項目中可以有多個場景
當然也可以多開unity或者用不同的unity版本來打開不同的項目
Android端代碼可以在Eclipse中開發(AndroidStudio沒有試,應該也可以)
2.Unity3D端代碼要在Unity中開發
3.Android和Unity3D端,兩邊都需要加入一些代碼從而可以使之關聯交互。
4.將Android端代碼編譯成jar文件以插件形式放入到Unity端中
5.在Unity中將整個項目Build成apk文件,然後安裝到手機或模擬器里運行
你是指的是將嵌入html頁面的.unity3d文件作為獨立軟體運行吧?這個是不能獨立運行的,如果要在單機上打開文件可以有下面幾種方法:
將文件嵌入頁面,如果你已經下載並安裝了unitywebplayer插件,是可以離線打開頁面的,如果你不想通過瀏覽器來看,那麼這個方法可能不適合你;
用Visual Studio編寫一個軟體(用C#、VB、VC++各種語言都可以),在窗體中放一個WebBrowser控制項,然後將WebBrowser控制項的url屬性設置為需要顯示的頁面文件(嵌入了.unity3d文件)的路徑,這樣看起來就是一個獨立的軟體了。
原理同上,安裝了unitywebplayer插件後,在窗體中放一個UnityWebPlayer Control控制項(要添加COM組件到工具箱),將控制項的src屬性設為你需要顯示的.unity3d文件路徑,這樣也可以成為一個獨立運行的軟體,還可以通過組件的SendMessage方法與場景交互。效果如下:
這個是最徹底的,如果你有工程源碼,重新發布成獨立運行的軟體就行了。
6. 求unity插件
有朋友想要了解unity3d插件的安裝,順便做一個簡易的安裝教程,希望大家理解初學者的艱難 呵呵。簡單介紹2種安裝方法。
下面 第一種u3d安裝方法 ().
1.在工程窗口的空白處點擊右鍵,出現彈出菜單,如圖1所示
2.把滑鼠移到 import package 如下圖2所示
3.在出現的彈出菜單,找到custom package 並 點擊 如下圖3
4.在打開的文件瀏覽窗口中,找到你要安裝的插件,這里以NGUI3.6.4為例,然後點擊 打開 。如下圖4所示
5.在彈出的窗口上,點擊 import 按鈕 ,Unity將會對插件編譯、核實插件是否有錯誤,稍等一會如果沒有任何報錯,即可完成NGUI3.6.4的安裝,如下圖5所示
6.如果插件在導入過程中沒有報錯,安裝完成後,即可在上面的菜單中看到NGUI 圖下圖6所示
註:如果安裝沒有報錯,菜單中也沒有看到NGUI,請關閉Unity再重打開,NGUI即可更新顯示出來
第二中u3d安裝方法(簡單的說明一下)
1.首先保證Unity開打,
2.項目已經建立完成
3.找到你要安裝的插件,雙擊文件即自動導入到項目中
7. 如何安裝unity3d的 插件
第一種u3d安裝方法 (推薦).
1.在工程窗口的空白處點擊右鍵,出現彈出菜單,如圖1所示
2.把滑鼠移到 import package 如下圖2所示
3.在出現的彈出菜單,找到custom package... 並 點擊 如下圖3
4.在打開的文件瀏覽窗口中,找到你要安裝的插件,這里以NGUI3.6.4為例,然後點擊 打開 。如下圖4所示
5.在彈出的窗口上,點擊 import 按鈕 ,Unity將會對插件編譯、核實插件是否有錯誤,稍等一會如果沒有任何報錯,即可完成NGUI3.6.4的安裝,如下圖5所示
6.如果插件在導入過程中沒有報錯,安裝完成後,即可在上面的菜單中看到NGUI 圖下圖6所示
註:如果安裝沒有報錯,菜單中也沒有看到NGUI,請關閉Unity再重打開,NGUI即可更新顯示出來
第二中u3d安裝方法(簡單的說明一下)
1.首先保證Unity開打,
2.項目已經建立完成
3.找到你要安裝的插件,雙擊文件即自動導入到項目中
更多unity,盡在納金論壇。