您好,登錄后才能下訂單哦!
之前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了
免責(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)容。