当前位置:   article > 正文

Android内嵌Unity (Activity)_安卓以framement方式集成unity

安卓以framement方式集成unity

Unity2019.4.4

AndropidStudio4.2.1

参考文档:

Android内嵌Unity并实现互相跳转的实例代码_Android_脚本之家

Android Fragment中加载,嵌套Unity视图_unity 导入并作为fragment_周灬浩的博客-CSDN博客

本文只实现了Activity整个切换过去,而Fragment,这种像h5似的与app共存,目前还未实现,可参考的第二个链接

1、在空场景中创建一个空节点名字为unityObject(这个名字安卓调用unity用到)

然后在节点上添加一个脚本

  1. using UnityEngine;
  2. using UnityEngine.SceneManagement;
  3. using UnityEngine.UI;
  4. /// <summary>
  5. /// 安卓 unity交互
  6. /// </summary>
  7. public class AndoridAndUnity : MonoBehaviour
  8. {
  9. public static AndoridAndUnity instance;
  10. AndroidJavaObject jo;
  11. private void Awake()
  12. {
  13. Debug.Log("AndoridAndUnity Awake");
  14. instance = this;
  15. //RunGameScene("Test");
  16. DontDestroyOnLoad(this);
  17. }
  18. private void Start()
  19. {
  20. Debug.Log("AndoridAndUnity Start");
  21. //Debug.Log("AndoridAndUnity 包名:"+ Application.identifier);
  22. //Debug.Log("AndoridAndUnity 版本号:" + Application.version);
  23. }
  24. //安卓回掉unity
  25. void fromAndroid(string str)
  26. {
  27. Debug.Log("安卓传来信息 : " + str);
  28. }
  29. //安卓回掉unity
  30. void RunGameScene(string str)
  31. {
  32. Debug.Log("切换场景 : " + str);
  33. SceneManager.LoadScene(str);
  34. }
  35. //返回app
  36. public void GoBack()
  37. {
  38. PlayerPrefs.Save();
  39. Debug.Log("AndoridAndUnity GoBack");
  40. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  41. jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  42. jo.Call("goBack");//调用Android中函数
  43. //Application.Quit();
  44. }
  45. string str;
  46. private void OnGUI()
  47. {
  48. GUI.color = Color.white;
  49. //GUI.Label(new Rect(10, 100, 200, 40), str);
  50. if (GUI.Button(new Rect(10, 20, 200, 80), "返回"))
  51. {
  52. //str = "点击成功";
  53. GoBack();
  54. }
  55. }
  56. }

然后在Build Settings中将平台切换到Android

Unity项目目录与(下面新建的)安卓项目目录之间的关系:

 2、创建安卓项目

  

选择NoActivity->Next

 尽量保持一致,不一致也是以安卓的为准

 NativeAndroidApp 中settings.gradle文件添加代码,将导出的unity库导入到安卓项目中(unityLibrary 的路径就是导出放置的路径有关)

  1. include ':unityLibrary'
  2. project(':unityLibrary').projectDir = new File('..\\androidBuild\\unityLibrary')

 在应用级build.gradle中加入so库和dependencies相应的unity依赖 在应用级build.gradle中加入so库和dependencies相应的unity依赖

  1. android {
  2. defaultConfig {
  3. ***
  4. ndk {
  5. // 设置支持的SO库架构,第三方给的so库哪几种架构,就配置这几种架构
  6. abiFilters 'armeabi', 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
  7. }
  8. }
  9. }
  10. dependencies {
  11. implementation project(':unityLibrary')
  12. implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
  13. ***
  14. }

在根级build.gradle(Module:NativeAndroidApp)中 加入

  1. allprojects {
  2. repositories {
  3. google()
  4. jcenter()
  5. // Add Code
  6. flatDir {
  7. dirs "${project(':unityLibrary').projectDir}/libs"
  8. }
  9. // End
  10. }
  11. }

引用完成就能在项目中看到unityLibrary,并修改unityLibrary下面的AndroidManifest.xml文中

 

3、构建安卓布局和加入调用代码

选择 NativeAndroidApp 的 strings.xml 添加

<string name="game_view_content_description">Game view</string>

构建一个ui布局,并加入button按钮

 

MainActivity.java

  1. package com.fancy.rush;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.widget.Button;
  8. public class MainActivity extends Activity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main_unity);
  13. Button btn=(Button) findViewById(R.id.button);
  14. btn.setOnClickListener(new View.OnClickListener(){
  15. @Override
  16. public void onClick(View v) {
  17. Log.d("/Unity", "UnityActivity");
  18. Intent intent = new Intent(MainActivity.this, UnityActivity.class);
  19. intent.putExtra("sceneLevel","MatchAndMerge");//传递参数,利用传递的参数可以切换场景,或者数据之类的
  20. startActivity(intent);
  21. }
  22. });
  23. }
  24. }

 UnityActivity.java

  1. import android.os.Bundle;
  2. import android.util.Log;
  3. import com.unity3d.player.UnityPlayer;
  4. import com.unity3d.player.UnityPlayerActivity;
  5. import com.unity3d.player.UnityPlayer;
  6. public class UnityActivity extends UnityPlayerActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. Intent intent=getIntent();
  11. String sceneLevel=intent.getStringExtra("sceneLevel");
  12. testSendMessage(sceneLevel);
  13. }
  14. //当unity场景设置为常驻activity时,就需要运用到,常驻场景goBack切换出去后,再次打开时不会再周OnCreate,而是走onNewIntent
  15. @Override protected void onNewIntent(Intent intent)
  16. {
  17. super.onNewIntent(intent);
  18. String sceneLevel=intent.getStringExtra("sceneLevel");
  19. testSendMessage(sceneLevel);
  20. }
  21. // 向unity发送信息
  22. public void testSendMessage(String sceneLevel)
  23. {
  24. //获取意图对象
  25. Log.d("/Unity", "testSendMessage sceneLevel:"+sceneLevel);
  26. UnityPlayer.UnitySendMessage("unityObject", "fromAndroid", "UnityActivity");
  27. //利用传递的参数切换场景
  28. //第一个参数是Unity中一个节点对象的名字,第二个参数是节点对象上挂的脚本中一个函数的名字,第三个参数是函数中的参数值
  29. //UnityPlayer.UnitySendMessage("unityObject", "RunGameScene", sceneLevel);
  30. }
  31. public void goBack()
  32. {
  33. // unity点击按钮跳转回安卓界面
  34. Intent intent = new Intent(this, MainActivity.class);
  35. this.startActivity(intent);
  36. }
  37. }

 再unity和app间相互切换会出现奔溃现象,只要把UnityActivity设置为 singleTask,常驻就不会被清除掉,再次调用打开unity就不会奔溃

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号