如题,本文将介绍关于如何制作unity插件,并通过unity调用Android中的程序,并打开Webview访问网页。本文参考雨松momo的文章http://www.xuanyusong.com/archives/1418,在此表示感谢。

   开发环境:win7,Unity,Eclipse

   手机:me525+

   首先,我们在Eclipse中新建一个工程OpenWebView,会默认生成一个MainActivity.java。在写程序之前我们要去你安装Unity程序的目录下Unity->Editor->Data->PlaybackEngines->androidplayer->bin->classes.jar ,将这个classes.jar文件拷贝出来,先放在桌面上,然后打开Eclipse将我们刚刚找到的classes.jar文件放在工程的libs文件下面。

   好了,现在可以开始编程了.

   在MainActivity.java文件中

package com.cheng.jack;
import com.unity3d.player.UnityPlayerActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends UnityPlayerActivity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }
    //这个函数将是我们通过unity调用的函数
    public void OpenWeb(){
        //这里是直接跳转到M_Webview这个Activity中
        Intent intent = new Intent();
        intent.setClass(mContext, M_Webview.class);
        mContext.startActivity(intent);
                                                                                                                                                                                                                                                                                                                                                                                              
    }
}

   接下来我们再在Eclipse中新建一个Class,命名为M_Webview(这个名字自己)

M_Webview的代码如下:

package com.cheng.jack;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
public class M_Webview extends Activity {
    private WebView mView;
    private Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_main);
        //获得我们的WebView和Button
        mView = (WebView)findViewById(R.id.webview);
        mButton = (Button)findViewById(R.id.btn);
                                                                                                                                                                                                                                                                                                                                                                                     
        //将WebView的初始状态设为百度网页
        mView.loadUrl("http://www.baidu.com");
        mView.getSettings().setJavaScriptEnabled(true);
        mView.setWebViewClient(new WebviewClient());
                                                                                                                                                                                                                                                                                                                                                                                     
        //设置button的监听事件,当button按下时,我们关闭Activity
        mButton.setOnClickListener(new OnClickListener() {
                                                                                                                                                                                                                                                                                                                                                                                         
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                M_Webview.this.finish();
            }
        });
    }
    //这个就是实现在程序中打开一个新的连接,还停留在这个程序中
    private class WebviewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            view.loadUrl(url);
            return super.shouldOverrideUrlLoading(view, url);
        }
                                                                                                                                                                                                                                                                                                                                                                                     
    }
}

然后就是我们的配置文件,配置文件其实没什么,里面就是一个Webview和一个Button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭网页"/>
</LinearLayout>

AndroidManifest.xml这个文件是个重要的文件,里面有几个配置是必须的,我们后来新建了一个Activity,所以必须要在这里体现出来,然后我们要人我们的程序必须有联网权限,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cheng.jack"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.cheng.jack.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 这里是我们新添加的Activity -->
        <activity android:name="com.cheng.jack.M_Webview"
            ></activity>
    </application>
    <!--这里就是添加联网权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


现在我们在Eclipse这边的代码部分基本上都完成了,接下来我们要将我们的程序都打包成jar文件(这个将在我们的unity中将会用到,这就是我们说的所谓的插件)。我们运行windows下面的终端,从终端进入我们的OpenWebView工程,进入OpenWebView->bin->classes文件夹下,我们执行命令:

jar -cvf class.jar *  然后在classes文件夹下面将会生成一个class.jar文件,我们先将它拷贝到桌面上,除了这个文件我们还要拷贝两个文件,一个是工程下面的AndroidManifest.xml文件和res文件,好了Eclipse这边算是完成了,我们现在确保桌面上有三个文件,class.jar ,res,AndroidManifest.xml。


   现在我们来到unity下面,在写程序之前,我们要做些准备工作。首先,新建一个Unity工程,在工程的Assets文件夹下面新建一个文件夹,名字必须是Publigs,然后在Publigs文件夹下面新建一个Android文件夹。ok,现在我们将我们放在桌面上的三个文件放到Android文件夹下面。准备工作做好了。接下来就是编程写代码了。我们新建一个c#文件,名字叫做OpenWebview

using UnityEngine;
using System.Collections;
public class OpenWebView : MonoBehaviour {
                                                                                                                
    void OnGUI(){
        if(GUI.Button(new Rect(100,100,100,30),"OpenWebView")){
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("OpenWeb");
        }
    }
}


   在这里要说明几点啊,jo.call("OpenWeb");这个就是调用我们的Android程序了,在我们编译运行之前我们要配置我们的Unity,第一点Bundle Identifier这个必须要和我们的Android的包名称相同,我这里是com.cheng.jack  ,第二点unity设置中的最低版本和Android设置中的最低版本要相同(这点让我纠结了好长时间)。

然后运行就ok了,这里上两张效果图。

154324215.jpg

154325334.jpg




最后附上工程地址

http://down.51cto.com/data/861687