温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Unity调用Android的Activity

发布时间:2020-07-14 20:47:21 阅读:13078 作者:lreach 栏目:移动开发
Android开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

之前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的代码为:

package com.reach.test;
/**
 * Created by Administrator on 2017/6/5.
 */
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class OpenActivity1 extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
        TextView text=(TextView)this.findViewById(R.id.textView1);
        text.setText(this.getIntent().getStringExtra("name"));
        Button close=(Button)this.findViewById(R.id.button0);
        close.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                OpenActivity1.this.finish();
            }
        });
    }
}

其中TextView什么的都是加在其上的组件,先不用管,最简单的就是onCreate方法前两行语句

而我们用于与Unity交互的MainActivity代码如下

package com.reach.test;
import android.app.Activity;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
import android.content.Context;
import android.content.Intent;
public class MainActivity extends UnityPlayerActivity {
    Activity mActivity=null;
    Context mContext=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity=this;
        mContext=this;
        StartActivity1("我是通过安卓中显示的Activity");
    }
    public void StartActivity1(String name)
    {
        Intent intent=new Intent(mContext, OpenActivity1.class);
        intent.putExtra("name", name);
        mActivity.startActivity(intent);
    }
}

其中StartActivity1方法用于打开OpenActivity1,先是app运行时由于在onCreate中最后一行调用了,所以一开始会先看到OpenActivity1(先不纠结这个)

总之,此方法就是打开OpenActivity1的,而且会在Unity中调用

那回头看Unity

我们建一个脚本,叫Test.cs,随便挂在场景中的某个GameObject上就行

代码如下:

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
        if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) || Input.GetKeyDown(KeyCode.Menu))
        {
            Application.Quit();
        }
}
    private void OnGUI()
    {
        if(GUILayout.Button("Open Activity", GUILayout.Height(80)))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("StartActivity1""Unity中调出android的方法了");
        }
    }
}

主要看OnGui方法

里面画出了一个按钮,上面显示Open Activity

下面三行代码规定了按钮点击执行的操作,点击这个按钮就会调用Android中的StartActivity1方法

调用OpenActivity1

前两行基本是固定用法

第三行则是调用Android项目中MainActivity里的StartActivity1方法,也就是打开OpenActivity1

这里需要注意一点,就是第二行

AndroidJavaObject jo = 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了

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×