Unity调用Android的Activity
之前http://shuxiayeshou.blog.51cto.com/4452347/1932216
写了关于Unity与Android结合所遇到的问题及解决方法
总结一下,Unity做一个简单的场景,AndroidStudio建一个简单的项目,其中MainActivity是要继承自
UnityPlayerActivity的,这样Unity程序可以调用Android端MainActivity的方法了
那如果Android项目中还有一个NewActivity,我们要通过Unity把他打开咋办呢
以下用的例子也是从网上找的,但是运行有问题,我又进行了修改才可以用。
首先,在AndroidMenifest.xml中要把这个Activity加进去
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.reach.test">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<activity android:name=".MainActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<activity android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".OpenActivity1">
</activity>
</application>
</manifest>
如上黄字部分
既然有这个OpenActivity1,那必然是有一个Java Class,OpenActivity1,继承Activity
与MainActivity在同一路径下
而且在layout文件夹下也有对应的xml部局文件,我命名为activity_new.xml
OpenActivity1的代码为:
packagecom.reach.test;/***CreatedbyAdministratoron2017/6/5.*/importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassOpenActivity1extendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_new);TextViewtext=(TextView)this.findViewById(R.id.textView1);text.setText(this.getIntent().getStringExtra("name"));Buttonclose=(Button)this.findViewById(R.id.button0);close.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){OpenActivity1.this.finish();}});}}
其中TextView什么的都是加在其上的组件,先不用管,最简单的就是onCreate方法前两行语句
而我们用于与Unity交互的MainActivity代码如下
packagecom.reach.test;importandroid.app.Activity;importandroid.os.Bundle;importcom.unity3d.player.UnityPlayerActivity;importandroid.content.Context;importandroid.content.Intent;publicclassMainActivityextendsUnityPlayerActivity{ActivitymActivity=null;ContextmContext=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);mActivity=this;mContext=this;StartActivity1("我是通过安卓中显示的Activity");}publicvoidStartActivity1(Stringname){Intentintent=newIntent(mContext,OpenActivity1.class);intent.putExtra("name",name);mActivity.startActivity(intent);}}
其中StartActivity1方法用于打开OpenActivity1,先是app运行时由于在onCreate中最后一行调用了,所以一开始会先看到OpenActivity1(先不纠结这个)
总之,此方法就是打开OpenActivity1的,而且会在Unity中调用
那回头看Unity
我们建一个脚本,叫Test.cs,随便挂在场景中的某个GameObject上就行
代码如下:
usingUnityEngine;usingSystem.Collections;publicclassTest:MonoBehaviour{//UsethisforinitializationvoidStart(){}//UpdateiscalledonceperframevoidUpdate(){if(Input.GetKeyDown(KeyCode.Escape)||Input.GetKeyDown(KeyCode.Home)||Input.GetKeyDown(KeyCode.Menu)){Application.Quit();}}privatevoidOnGUI(){if(GUILayout.Button("OpenActivity",GUILayout.Height(80))){AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObjectjo=jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("StartActivity1","Unity中调出android的方法了");}}}
主要看OnGui方法
里面画出了一个按钮,上面显示Open Activity
下面三行代码规定了按钮点击执行的操作,点击这个按钮就会调用Android中的StartActivity1方法
调用OpenActivity1
前两行基本是固定用法
第三行则是调用Android项目中MainActivity里的StartActivity1方法,也就是打开OpenActivity1
这里需要注意一点,就是第二行
AndroidJavaObjectjo=jc.GetStatic<AndroidJavaObject>("currentActivity");
这里用的是jc.GetStatic方法,是没有问题的
而原例用的是jc.Get方法(后面的参数什么的都一样),实际在Unity场景中点击按钮是没有反应的
还有一点,原例中OpenActivity1所打开的也是MainActivity的layout,即
setContentView(R.layout.activity_main);
这样做,运行App就闪退。
于是我增加了activity_new,并让OpenActivity1对应于此layout
所以改成了
setContentView(R.layout.activity_new);
就OK了
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。