溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Unity調(diào)用Android的Activity

發(fā)布時(shí)間:2020-07-14 20:47:21 來(lái)源:網(wǎng)絡(luò) 閱讀:13060 作者:lreach 欄目:移動(dòng)開(kāi)發(fā)

之前http://shuxiayeshou.blog.51cto.com/4452347/1932216

寫(xiě)了關(guān)于Unity與Android結(jié)合所遇到的問(wèn)題及解決方法


總結(jié)一下,Unity做一個(gè)簡(jiǎn)單的場(chǎng)景,AndroidStudio建一個(gè)簡(jiǎn)單的項(xiàng)目,其中MainActivity是要繼承自

UnityPlayerActivity的,這樣Unity程序可以調(diào)用Android端MainActivity的方法了


那如果Android項(xiàng)目中還有一個(gè)NewActivity,我們要通過(guò)Unity把他打開(kāi)咋辦呢


以下用的例子也是從網(wǎng)上找的,但是運(yùn)行有問(wèn)題,我又進(jìn)行了修改才可以用。

首先,在AndroidMenifest.xml中要把這個(gè)Activity加進(jìn)去


<?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>


如上黃字部分

既然有這個(gè)OpenActivity1,那必然是有一個(gè)Java Class,OpenActivity1,繼承Activity

與MainActivity在同一路徑下

而且在layout文件夾下也有對(duì)應(yīng)的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什么的都是加在其上的組件,先不用管,最簡(jiǎn)單的就是onCreate方法前兩行語(yǔ)句


而我們用于與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("我是通過(guò)安卓中顯示的Activity");
    }
    public void StartActivity1(String name)
    {
        Intent intent=new Intent(mContext, OpenActivity1.class);
        intent.putExtra("name", name);
        mActivity.startActivity(intent);
    }
}


其中StartActivity1方法用于打開(kāi)OpenActivity1,先是app運(yùn)行時(shí)由于在onCreate中最后一行調(diào)用了,所以一開(kāi)始會(huì)先看到OpenActivity1(先不糾結(jié)這個(gè))

總之,此方法就是打開(kāi)OpenActivity1的,而且會(huì)在Unity中調(diào)用


那回頭看Unity

我們建一個(gè)腳本,叫Test.cs,隨便掛在場(chǎng)景中的某個(gè)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中調(diào)出android的方法了");
        }
    }
}

主要看OnGui方法

里面畫(huà)出了一個(gè)按鈕,上面顯示Open Activity

下面三行代碼規(guī)定了按鈕點(diǎn)擊執(zhí)行的操作,點(diǎn)擊這個(gè)按鈕就會(huì)調(diào)用Android中的StartActivity1方法

調(diào)用OpenActivity1


前兩行基本是固定用法

第三行則是調(diào)用Android項(xiàng)目中MainActivity里的StartActivity1方法,也就是打開(kāi)OpenActivity1

這里需要注意一點(diǎn),就是第二行

AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

這里用的是jc.GetStatic方法,是沒(méi)有問(wèn)題的

而原例用的是jc.Get方法(后面的參數(shù)什么的都一樣),實(shí)際在Unity場(chǎng)景中點(diǎn)擊按鈕是沒(méi)有反應(yīng)的


還有一點(diǎn),原例中OpenActivity1所打開(kāi)的也是MainActivity的layout,即

setContentView(R.layout.activity_main);

這樣做,運(yùn)行App就閃退。

于是我增加了activity_new,并讓OpenActivity1對(duì)應(yīng)于此layout

所以改成了

setContentView(R.layout.activity_new);

就OK了



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI