當前位置:首頁 » 編程軟體 » unity編譯android

unity編譯android

發布時間: 2022-11-02 15:42:00

1. unity工程是怎麼在android上運行的

首先我們要創建一個android項目 因為項目需要使用Unity提供的介面,所以需要將介面classes.jar引入至當前工程但中。介麵包的所在地,打開Finder->應用程序->Unity->點擊Unity圖標,滑鼠右鍵選擇「顯示包內容」->Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar 。介麵包引入工程後,開始編寫java代碼。 UnityTestActivity是主Activity,Unity程序一起動就會調用這個Activity,它是在AndroidManifest.xml中配置的。它需要繼承UnityPlayerActivity,然而它就是剛剛我們引入的classes.jar包中提供的介面類。UnityTestActivity對外提供了兩個方法介面,StartActivity0(String name) 方法與StartActivity1(String name)方法,這兩個方法是在Unity中使用C#腳本調用的,意思是調用後程序將打開一個新的Activity,參數name也是由C#腳本傳遞過來的,接著將傳遞的String參數繼續傳遞給新打開的Activity。 接下來就是設置xml文件和布局文件了。對於會android編程的同學就很熟悉了。 把寫好的java代碼發布成jar包。接下來就創建unity工程,Unity工程中文件夾的結構如下,Plugins->Android的名稱不能修改,必需保持一致。接著把Eclipse中Android的工程文件拷貝至這里,除了Android工程中的src文件夾,將其它文件夾全部拷貝至Plugins->Android文件夾中。最後在Plugins->Android文件夾中創建bin文件夾,然後將剛剛生成的.jar文件拷貝進來,jar的名稱可以隨便修改,但是jar包裡面必須是com->xys->你的class文件,否則運行程序後提示找不到類文件。 接下來就是如何在C#中調用android的方法的代碼了。 加入如下代碼。 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); jo.Call("StartActivity0","第一個Activity"); 先得到AndroidJavaClass,然後得到AndroidjavaObject就是當前Activity的對象,也就是我們在上面創建的主UnityTestActivity.JAVA。拿到它的對象後調用jo.Call()參數1表示調用UnityTestActivity.JAVA類中的方法名稱,參數2表示該方法傳遞過去的參數。如下圖所示:「第一個Activity」與「第二個Activit」就是我在C#中傳遞過去的字元串。 7 發布成android平台apk

2. 如何提高Unity3d編譯安卓apk的速度

分成二步untiy導出android工程,用android工具編譯出apk .到底是你生成工程慢?還是編譯apk慢?
unity一般是處理resource下資源慢,編譯一般是streamassets下文件多zip慢

3. Unity3D 編譯Android客戶端真機閃退

確實許可權,你在錯誤提示框里找一下缺少什麼許可權,在清單文件里加上就可以了的

4. 如何將unity模型導入android程序中

准備工作:

下面是我總結的流程,目的是使本文思路更加清晰一些:

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);
}
}
看完這個類後就知道了為什麼在自定義的Activity中繼承了UnityPlayerActivity等類以後,只要重寫了onCreate並調用super.onCreate()方法後不需要任何其他的代碼就會自動的顯示出Unity3D的視圖。因為初始化Unity視圖的代碼都在UnityPlayerNativeActivity父類中實現了。

ANDROID端代碼:

在寫ANDROID代碼的時候,一定要導入Unity3D提供給我們的jar包,jar包的位置我在上面說了。引入jar包加入到buildpath中這些最基本的我就不多說了。

要想和Unity交互,我們就不能繼承ANDROID提供給我們的Activity,我們需要繼承剛才jar包中引入的Unity提供的Activity類,一共有這么3個:

UnityPlayerActivity,UnityPlayerProxyActivity,UnityPlayerNativeActivity。具體區別不知道,因為沒有文檔,沒有API,沒有源碼(這里再次鄙視一下)。剛才我們看過UnityPlayerNativeActivity的代碼(雖然很短,但我覺得這個就是源碼),知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子類,而且最終父類為NativeActivity。所以我們繼承Unity提供的最外層的子類是最好的選擇,我這里選擇的是UnityPlayerActivity,因為名字最簡單,覺得該封裝的都應該封裝好了。

public class MainActivity extends UnityPlayerActivity {

private Button topButton;
private Button bottomButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 設置test為我們的根布局
setContentView(R.layout.test);

// 通過剛才的源碼分析,知道mUnityPlayer為一個全局的引用變數,而且已經在父類中設置好了,所以直接拿來用就可以了
View playerView = mUnityPlayer.getView();
// 將Unity的視圖添加到我們為其准備的父容器中
LinearLayout ll = (LinearLayout) findViewById(R.id.unityViewLyaout);
ll.addView(playerView);

// 上面的button設置監聽器
topButton = (Button) findViewById(R.id.topButton);
topButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//發送消息給Unity端,該函數第一個參數為接受消息的類對象,第二個該類對象用接受消息的方法,第三個參數為傳遞的消息
//所以下面的意思就為:調用Main Camera下面的Previous方法,傳送的消息為空
UnityPlayer.UnitySendMessage("Main Camera","Previous","");
}
});

// 為下面的button設置監聽器
bottomButton = (Button) findViewById(R.id.bottomBtn);
bottomButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//調用Main Camera下面的Next方法,傳送的消息為空
UnityPlayer.UnitySendMessage("Main Camera","Next","");
}
});
}
}
最後看一下Android端的布局文件,布局很簡單,上下各有一個button按鈕,兩個按鈕中間是Unity的視圖。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/topButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="PREVIOUS" />

<LinearLayout
android:id="@+id/unityViewLyaout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottomBtn"
android:layout_below="@+id/topButton"
android:orientation="horizontal" >
</LinearLayout>

<Button
android:id="@+id/bottomBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="NEXT" />

</RelativeLayout>
Android端的代碼就介紹完了,很簡單。唯一的難點就是UnityPlayerActivity和UnityPlayer的使用,就這兩個破玩意花了我好幾天的時間,很簡單的東西不知道為什麼官方不給個文檔或者API(也可能我太挫沒找到。。。)
轉載

5. 如何在unity中生成android工程

最近使用unity開發android程序,但是如何能夠生成android工程,並且結合android sdk 一起開發,下面就給大家講解一下:

首先在unitu界面之下選擇file下拉菜單中的BuildSettings,然後在BuildSettings中點擊addCurrent添加場景如圖:

打開android eclipse 導入生成的android工程,就可以運行在android手機上了!有想要了解更多的unity插件,可以到納金論壇上去找 希望可以幫助到你

6. 怎麼樣編譯Unity3D Mono for Android

斷點調試功能可謂是程序員必備的功能了。Unity3D支持編寫js和c#腳本,但很多人可能不知道,其實Unity3D也能對程序進行斷點調試的。不過這個斷點調試功能只限於使用Unity3D自帶的MonoDevelop編輯器。而用Visual Studio是不行的。聽說有個叫做Unit

7. 如何配置unity3d的安卓手機開發環境

1.Android運行環境的搭建

進行安卓系統的軟體設計,那麼JDK的開發環境搭建必須是首要的。我們選擇Windows10 64位操作系統。同時在JDK版本的選擇中選用Windows x64版本的Java SE Development Kit 8u5,該版本穩定,應用廣泛而且開源免費,獲取方便。在安裝的過程中要注意不要重復安裝,應安裝完畢後立即刪除安裝包,否則如果不小心再次點到安裝包,該安裝包會立刻刪除所安裝的程序並詢問是否重新安裝。在JDK的安裝過程中,要注意開發工具,源代碼,公共JRE三項都要選中,而且要安裝到C盤默認目錄下,同時將其附帶的JRE同樣安裝到相同目錄下,同時硬碟至少應該留有2G的空間。

選擇好JDK的版本並進行安裝後,我們的JAVA環境就安裝好了,眾所周知,安卓系統是由JAVA語言架構的,所以在搭建安卓運行環境之前必須要先安裝JAVA環境。安裝完JAVA環境之後,我們進行安卓開發環境的搭建。我們就要進行Android SDK版本的選擇。我們這里選擇android-sdk_r24.4.1-windows版本。這個版本是與安卓8.0同時發布的,同時它的發布時間也在我們的安卓測試機紅米NOTE5A型號之後,可以完美兼容我們的安卓測試機所運行的安卓7.1.2版本。

以上就是安卓環境的安裝和搭建,更多Unity開發方面的問題可以看下這個視頻教程網頁鏈接,希望我的回答能幫到你。

8. unity3d怎麼打包android

方法原理倒是很簡單,通過對比Unity打包的apk,與普通的Android apk的文件差別,找出Unity文件存放的目錄,隨後對應存放到Android studio工程目錄中,最後通過Android studio完成對Unity相關文件的打包。
首先將apk添加zip的後綴,方便用beyond compare進行對比:
1. 發現只是多了assert/bin目錄,在這個目錄之下,可以看到unity相關dll庫 ;
2. 將該文件,拷貝到Android studio工程的src/main/assert目錄之下;
3. 在Android studio調試時,可以將aar library工程設置為app工程,這樣就可以編譯apk運行到手機了;
4. 用Android studio對該工程進行編譯,發現assert/bin目錄成功被打包進去;
5. 直接apk install 運行,可以看到跟Unity編譯打包的apk,是相同的效果;

9. 修改unity導出到安卓的activity

1、首先將Unity創建一個Android工程,例如我的工程名是:01_Unity_Message,如下是Project視圖下的目錄。
2、新建庫模塊——Android工程是由模塊組成的,每一個模塊可以創建一個應用,切換到Android視圖下可以看到每一個模塊。因為Unity與Android通信主要是調用了各自的方法,因此在Android工程中我們可以單獨新建一個模塊作為庫模塊,來負責與Unity的交互內容。
新建模塊操作:
點擊Finish按鈕,然後稍等片刻,就會創建出新的模塊,我們作為一個庫模塊來使用,如下圖:
3、將Unity的jar包(class.jar)導入到新建的庫模塊中,首先說明:
首先找到class.jar文件,它的路徑在Unity的安裝路徑下,例如我的是在:D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes,然後會發現只有一個class.jar文件。
這里注意兩點:
(1)、這個路徑是新版的Unity下的路徑,以前版本的jar文件是在\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Release\下;
(2)、Unity路徑下有兩個class.jar文件的不同路徑,一個是在Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下,另一個是在D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes下。Unity中我們使用的是C#腳本,最終運行在Android上是由於Mono進行轉換的,所以我們選用的jar文件是第一個路徑下的。如果使用的是il2cpp,就要選擇第二個路徑下的jar文件。
將jar包導入庫模塊的操作如下:
4、因為新建的庫模塊中沒有MainActivity.java,我們可以理解為啟動這個模塊的java類,例如在初始的app模塊中就有一個MainActivity.java。因此需要新建一個MainActivity.java的文件,並且調用Unity包中的基類,具體操作如下:
點擊Finish後,會在庫模塊的中創建出一個MainActivity的類
注意:生成MainActivity類後,會在res/layout下生成一個xml文件:main_layout.xml。這個文件是一個布局文件,
因為我們的庫模塊是為了跟Unity交互的,不需要界面布局,所以為了防止後面發生錯誤,這里刪除掉這個文件
注意:要修改AndroidMainfest.xml文件,
然後仿照初始的app模塊中的AndroidMainfest.xml文件,將裡面的<activity></activity>部分復制到庫模塊的AndroidMainfest.xml的相同位置。
然後需要修改一下MainActivity這個腳本
5、下面就是在Android中編寫Unity要調用的方法了,例如我這里只寫一個簡單的兩數求和的方法:
6、Build庫模塊,然後將生成的配置文件導入到Unity工程中,操作如下:
然後稍等片刻,編譯中....
然後在Project視圖下,找到編譯生成文件的所在目錄unity_exchange/build/intermediates/bundles/debug,右鍵後打開所在文件夾
然後把debug文件夾下的classes.jar文件移動到libs文件夾中,並且把libs文件夾中的class.jar文件替換掉。然後將debug文件夾下的libs文件夾、res文件夾、AndroidManifest.xml文件導入到Unity的Assets/Plugins/Android文件夾下(沒有這個文件夾需先創建)。
然後將三個文件移動到Unity的plugins/Android文件夾下。
7、創建Unity的C#腳本,並掛載到MainCanera上。為了在真機測試時能夠看到求和的結果,這里我使用的是UGUI的Text來顯示結果,同時通過Button的按鈕來觸發求和方法。如下圖。
以下是主要的腳本代碼。調用Android中的方法,並將求和結果顯示在(Text)界面上
將腳本掛載到MainCamera上
8、Unity編輯器不能運行與Android相關的操作,所以需要導出apk文件到真機上測試。
注意:導出前要修改PlayerSettings相關配置。因為從Android工程中導入了一個AndroidManifest文件,這個文件中有Android工程的相關配置,例如工程名稱、工程的包名、最低SDK版本、執行的Activity等等。因此我們要在Unity導出apk前修改一些相關配置,主要修改的是包名
最後是導出apk包到手機上或虛擬機上測試即可。
特別提醒:如果使用Android工程中初始的app模塊來與Unity交互,需要修改部分配置。build.gradle文件中,將applicationId刪除,然後將apply plugin後面的內容修改為"com.android.library"。
不建議大家使用初始的app模塊,而是新建一個專門作為交互的Library模塊。

熱點內容
釘鼎伺服器出口ip 發布:2025-05-15 07:13:08 瀏覽:278
移動硬碟和光碟哪個存儲時間長 發布:2025-05-15 07:04:25 瀏覽:488
壓縮一定 發布:2025-05-15 06:57:30 瀏覽:289
進棧演算法 發布:2025-05-15 06:56:02 瀏覽:215
安卓和緩存 發布:2025-05-15 06:56:02 瀏覽:428
筆記本電腦台式伺服器 發布:2025-05-15 06:40:41 瀏覽:109
4k無壓縮 發布:2025-05-15 06:02:54 瀏覽:75
hp存儲6350 發布:2025-05-15 05:40:41 瀏覽:233
怎麼更改電腦默認緩存位置 發布:2025-05-15 05:39:01 瀏覽:877
安卓qq公孫離在哪個戰區戰力最低 發布:2025-05-15 05:38:58 瀏覽:494