Unity2019.4.4
AndropidStudio4.2.1
參考文檔:
Android內(nèi)嵌Unity并實(shí)現(xiàn)互相跳轉(zhuǎn)的實(shí)例代碼_Android_腳本之家
Android Fragment中加載,嵌套Unity視圖_unity 導(dǎo)入并作為fragment_周灬浩的博客-CSDN博客
本文只實(shí)現(xiàn)了Activity整個(gè)切換過(guò)去,而Fragment,這種像h5似的與app共存,目前還未實(shí)現(xiàn),可參考的第二個(gè)鏈接
1、在空?qǐng)鼍爸袆?chuàng)建一個(gè)空節(jié)點(diǎn)名字為unityObject(這個(gè)名字安卓調(diào)用unity用到)
然后在節(jié)點(diǎn)上添加一個(gè)腳本
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
/// <summary>
/// 安卓 unity交互
/// </summary>
public class AndoridAndUnity : MonoBehaviour
{
public static AndoridAndUnity instance;
AndroidJavaObject jo;
private void Awake()
{
Debug.Log("AndoridAndUnity Awake");
instance = this;
//RunGameScene("Test");
DontDestroyOnLoad(this);
}
private void Start()
{
Debug.Log("AndoridAndUnity Start");
//Debug.Log("AndoridAndUnity 包名:"+ Application.identifier);
//Debug.Log("AndoridAndUnity 版本號(hào):" + Application.version);
}
//安卓回掉unity
void fromAndroid(string str)
{
Debug.Log("安卓傳來(lái)信息 : " + str);
}
//安卓回掉unity
void RunGameScene(string str)
{
Debug.Log("切換場(chǎng)景 : " + str);
SceneManager.LoadScene(str);
}
//返回app
public void GoBack()
{
PlayerPrefs.Save();
Debug.Log("AndoridAndUnity GoBack");
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("goBack");//調(diào)用Android中函數(shù)
//Application.Quit();
}
string str;
private void OnGUI()
{
GUI.color = Color.white;
//GUI.Label(new Rect(10, 100, 200, 40), str);
if (GUI.Button(new Rect(10, 20, 200, 80), "返回"))
{
//str = "點(diǎn)擊成功";
GoBack();
}
}
}
然后在Build Settings中將平臺(tái)切換到Android
Unity項(xiàng)目目錄與(下面新建的)安卓項(xiàng)目目錄之間的關(guān)系:
?2、創(chuàng)建安卓項(xiàng)目
??
選擇NoActivity->Next
?盡量保持一致,不一致也是以安卓的為準(zhǔn)
?NativeAndroidApp 中settings.gradle文件添加代碼,將導(dǎo)出的unity庫(kù)導(dǎo)入到安卓項(xiàng)目中(unityLibrary 的路徑就是導(dǎo)出放置的路徑有關(guān))
include ':unityLibrary'
project(':unityLibrary').projectDir = new File('..\\androidBuild\\unityLibrary')
?在應(yīng)用級(jí)build.gradle中加入so庫(kù)和dependencies相應(yīng)的unity依賴?在應(yīng)用級(jí)build.gradle中加入so庫(kù)和dependencies相應(yīng)的unity依賴
android {
defaultConfig {
***
ndk {
// 設(shè)置支持的SO庫(kù)架構(gòu),第三方給的so庫(kù)哪幾種架構(gòu),就配置這幾種架構(gòu)
abiFilters 'armeabi', 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}
dependencies {
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
***
}
在根級(jí)build.gradle(Module:NativeAndroidApp)中 加入
allprojects {
repositories {
google()
jcenter()
// Add Code
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
// End
}
}
引用完成就能在項(xiàng)目中看到unityLibrary,并修改unityLibrary下面的AndroidManifest.xml文中
?
3、構(gòu)建安卓布局和加入調(diào)用代碼
選擇 NativeAndroidApp 的?strings.xml?添加
<string name=
"game_view_content_description"
>Game view</string>
構(gòu)建一個(gè)ui布局,并加入button按鈕
?
MainActivity.java
package com.fancy.rush;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_unity);
Button btn=(Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d("/Unity", "UnityActivity");
Intent intent = new Intent(MainActivity.this, UnityActivity.class);
intent.putExtra("sceneLevel","MatchAndMerge");//傳遞參數(shù),利用傳遞的參數(shù)可以切換場(chǎng)景,或者數(shù)據(jù)之類的
startActivity(intent);
}
});
}
}
?UnityActivity.java
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;
public class UnityActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent=getIntent();
String sceneLevel=intent.getStringExtra("sceneLevel");
testSendMessage(sceneLevel);
}
//當(dāng)unity場(chǎng)景設(shè)置為常駐activity時(shí),就需要運(yùn)用到,常駐場(chǎng)景goBack切換出去后,再次打開時(shí)不會(huì)再周OnCreate,而是走onNewIntent
@Override protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
String sceneLevel=intent.getStringExtra("sceneLevel");
testSendMessage(sceneLevel);
}
// 向unity發(fā)送信息
public void testSendMessage(String sceneLevel)
{
//獲取意圖對(duì)象
Log.d("/Unity", "testSendMessage sceneLevel:"+sceneLevel);
UnityPlayer.UnitySendMessage("unityObject", "fromAndroid", "UnityActivity");
//利用傳遞的參數(shù)切換場(chǎng)景
//第一個(gè)參數(shù)是Unity中一個(gè)節(jié)點(diǎn)對(duì)象的名字,第二個(gè)參數(shù)是節(jié)點(diǎn)對(duì)象上掛的腳本中一個(gè)函數(shù)的名字,第三個(gè)參數(shù)是函數(shù)中的參數(shù)值
//UnityPlayer.UnitySendMessage("unityObject", "RunGameScene", sceneLevel);
}
public void goBack()
{
// unity點(diǎn)擊按鈕跳轉(zhuǎn)回安卓界面
Intent intent = new Intent(this, MainActivity.class);
this.startActivity(intent);
}
}
?再unity和app間相互切換會(huì)出現(xiàn)奔潰現(xiàn)象,只要把UnityActivity設(shè)置為 singleTask,常駐就不會(huì)被清除掉,再次調(diào)用打開unity就不會(huì)奔潰文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-801984.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801984.html
到了這里,關(guān)于Android內(nèi)嵌Unity (Activity)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!