环境:
AndroidStudio2.0
Unity4.68
AS打jar包
新建空工程
删除无用的MainActivity等。
新建Module
Module选择Android Library,起名为unitylib
向Module中引入Unity的classes.jar
不同版本unity classes.jar的位置
...........\Unity468\Editor\Data\PlaybackEngines\androidplayer\release\bin
...........\Unity53\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
把unity classes.jar直接放入新建module文件下的libs中
把classes.jar引入,具体过程为
选择unitylib,点击+号,确定引入了classes.jar后点击ok保存,退出Project Structure界面
想删除新建的module,需要在ProjectStructure中先点-号,然后回到把unitylib delete调,然后在回到工程中把unitylib整个delete掉
打包内容填写
这里要打包一个MainActivity,所以在module中新建一个MainActivity.Java
MainActivity内容为
- package com.n.unitylib;
- import android.app.Activity;
- import android.content.res.Configuration;
- import android.graphics.PixelFormat;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.MotionEvent;
- import android.view.Window;
- import android.view.WindowManager;
- import com.unity3d.player.UnityPlayer;
- public class MainActivity extends Activity {
- protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code
- // Setup activity layout
- @Override protected void onCreate (Bundle savedInstanceState)
- {
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- super.onCreate(savedInstanceState);
- getWindow().takeSurface(null);
- getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
- mUnityPlayer = new UnityPlayer(this);
- if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
- getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(mUnityPlayer);
- mUnityPlayer.requestFocus();
- }
- // Quit Unity
- @Override protected void onDestroy ()
- {
- mUnityPlayer.quit();
- super.onDestroy();
- }
- // Pause Unity
- @Override protected void onPause()
- {
- super.onPause();
- mUnityPlayer.pause();
- }
- // Resume Unity
- @Override protected void onResume()
- {
- super.onResume();
- mUnityPlayer.resume();
- }
- // This ensures the layout will be correct.
- @Override public void onConfigurationChanged(Configuration newConfig)
- {
- super.onConfigurationChanged(newConfig);
- mUnityPlayer.configurationChanged(newConfig);
- }
- // Notify Unity of the focus change.
- @Override public void onWindowFocusChanged(boolean hasFocus)
- {
- super.onWindowFocusChanged(hasFocus);
- mUnityPlayer.windowFocusChanged(hasFocus);
- }
- // For some reason the multiple keyevent type is not supported by the ndk.
- // Force event injection by overriding dispatchKeyEvent().
- @Override public boolean dispatchKeyEvent(KeyEvent event)
- {
- if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
- return mUnityPlayer.injectEvent(event);
- return super.dispatchKeyEvent(event);
- }
- // Pass any events not handled by (unfocused) views straight to UnityPlayer
- @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); }
- @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); }
- @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); }
- /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); }
- public static void Test()
- {
- Log.e("nafio","success!");
- }
- }
AndroidManifest.xml内容为
- <?xml version="1.0" encoding="utf-8"?>
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.n.unitylib"
- android:installLocation="preferExternal"
- android:versionCode="1"
- android:versionName="1.0">
- <supports-screens
- android:smallScreens="true"
- android:normalScreens="true"
- android:largeScreens="true"
- android:xlargeScreens="true"
- android:anyDensity="true"/>
- <application
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:label="@string/app_name"
- >
- <activity android:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
- </intent-filter>
- <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
- <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
- </activity>
- </application>
- </manifest>
配置gradle打包参数
在module的build.gradle最后添加
- task makeJar(type: Copy) {
- delete 'build/libs/unitylib.jar'
- from('build/intermediates/bundles/release/')
- into('build/libs/')
- include('classes.jar')
- rename('classes.jar', 'unitylib.jar')
- }
- makeJar.dependsOn(build)
打jar包
然后在Terminal中输入gradlew makejar
第一次运行Androidstudio可能会更新gradle,20-30分钟,更新完会自动打jar包
jar包位置在
android调试module
module用来打包,如果要调试
把module中的build.gradle中
apply plugin: 'com.android.library'
改为
apply plugin: 'com.android.application'
然后同步下gradle module就是普通工程了
Unity调用
新建空工程
在Assets下新建Plugins/Android/
把打出的unitylib.jar和对应的AndroidManifest.xml(这个从哪copy都可以,单独写都可以,只要内容对就行)
新建脚本,随便挂一个节点上
- using UnityEngine;
- using System.Collections;
- public class TestAS : MonoBehaviour {
- private AndroidJavaObject _java;
- public AndroidJavaObject Java
- {
- get
- {
- if (_java == null)
- {
- var javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
- _java = javaClass.GetStatic<AndroidJavaObject>("currentActivity");
- }
- return _java;
- }
- }
- // Use this for initialization
- void Start () {
- Debug.Log("nafio-----START");
- Java.CallStatic("Test");
- Debug.Log("nafio-----END");
- }
- // Update is called once per frame
- void Update () {
- }
- }
打包时注意一点,包名保持跟jar包中的包名一致(如果jar包中包含的不是主Acticity,而是其他java类,应该不一致也可以)
- Log.e("nafio","success!");
遇到问题记录
Lint found errors in the project; aborting build
解决办法
文件build.gradle,添加如下信息
android {
lintOptions {
abortOnError false
}
}