一, 准备工作

     Ⅰ, JDK

           建议别玩花哨, 直接用X64的JDK8

     Ⅱ, SDK

     直接下载Android Studio

     Ⅲ, NDK

            目前使用R19的最好, 反正试过R21的是不行的

配置如下

Unity之Android打包_Unity3D


 二, 用Unity打包

Unity之Android打包_APK_02

点击 "Build" 直接打出apk包


三, 使用Android Studio打包

Ⅰ, 勾选 "Export Project"来导AS项目

Unity之Android打包_Android_03

      Ⅱ, 导出的AS项目结构:

Unity之Android打包_APK_04

Ⅲ, 使用Make Project来打包APK

Unity之Android打包_Unity3D_05


四, C#与Java互调用

Ⅰ, 准备工作

1, 创建Android类库 略

2, 创建测试类 , 如下图

Unity之Android打包_APK_06

UnityTest.java代码:


package com.example.testunitylib;

import android.util.Log;

public class UnityTest {
public static String NAME = "Snow";
public String message;

public static void SetName(String name){
UnityTest.NAME = name;
Log.d(NAME, "SetName: " + name);
}

public static String GetName(){
Log.d(NAME, "GetName: " + UnityTest.NAME);
return NAME;
}

public void SetMessage( String message ){
this.message = message;
Log.d(this.message, "SetMessage: " + message);
}

public String GetMessage(){
Log.d(message, "GetMessage: " + this.message);
return this.message;
}
}

                  3, 构建类库

Unity之Android打包_Unity3D_07

导出文件的位置:

Unity之Android打包_APK_08

注意, 本测试只需Java类库代码, 并不需要其他资源, 所以直接将app-debug.arr中的classes.jar放入到unity中就可以了

具体做法:

将app-debug.arr 命名为 app-debug.zip 解压后即可在文件夹得到

或着(但这里直接可以得到jar包),如下图

Unity之Android打包_Unity3D_09

               4, 将jar包放入到unity项目中

注意一定要放在Plugins文件夹下: 如

Unity之Android打包_APK_10

       Ⅱ, C#调用Java

1, C#代码


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 测试C#调用Java
/// </summary>
public class TestCSharpCallJava : MonoBehaviour
{
public InputField txtSetName;
public InputField txtSetMessage;

public Text txtName;
public Text txtMessgae;
/// <summary>
/// 调用静态java
/// </summary>
private AndroidJavaClass androidJavaClass;
/// <summary>
/// 调用java对象
/// </summary>
private AndroidJavaObject androidJavaObject;
void Start()
{
this.androidJavaClass = new AndroidJavaClass("com.example.testunitylib.UnityTest");
this.androidJavaObject = new AndroidJavaObject("com.example.testunitylib.UnityTest");
}

// Update is called once per frame
void Update()
{

}

public void SetName(){
this.androidJavaClass.CallStatic("SetName", this.txtSetName.text);//调用Java静态方法 . 无返回值
}

public void SetMessage(){
this.androidJavaObject.Call("SetMessage", this.txtSetMessage.text);//调用Java实例对象方法 . 无返回值
}

public void GetName(){
this.txtName.text = this.androidJavaClass.GetStatic<string>("NAME");//获取Java静态的字段 , 或如下
// this.txtName.text = this.androidJavaClass.CallStatic<string>("GetName");//调用Java的静态方法
}

public void GetMessage(){
this.txtMessgae.text = this.androidJavaObject.Get<string>("message");//获取Java实例对象字段 , 或如下
// this.txtMessgae.text = this.androidJavaObject.Call<string>("GetMessage");//调用java实例对象方法
}
}

2, Scene

Unity之Android打包_APK_11

3, 结果

Unity之Android打包_Android_12


Ⅲ, Java调用C#

           1, Android项目引用Unity提供的jar类库

位置为: unity安装位置下的 Editor/Data/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar , 如下

Unity之Android打包_Unity3D_13

a,将classes.jar放入Android类库下的libs文件夹下

Unity之Android打包_Android_14

b,添加为库

Unity之Android打包_Android_15

2,用UnityPlayer.UnitySendMessage调用C#

      参数1 : 脚本所在的GO的名称 / 参数2 : 脚本中方法的名称 / 参数3: 方法参数

package com.example.testunitylib;

import android.util.Log;

import com.unity3d.player.UnityPlayer;

public class UnityTest {
/**姓名, 静态类型*/
public static String NAME = "Snow";
/**消息*/
public String message;

public static void SetName(String name){
UnityTest.NAME = name;
Log.d(NAME, "SetName: " + name);

UnityPlayer.UnitySendMessage("Canvas","GetName","");//调用 Canvas下 某脚本 GetName方法, 方法无参数
}

public static String GetName(){
Log.d(NAME, "GetName: " + UnityTest.NAME);
return NAME;
}

public void SetMessage( String message ){
this.message = message;
Log.d(this.message, "SetMessage: " + message);

UnityPlayer.UnitySendMessage("Canvas","GetMessage","");//调用 Canvas下 某脚本 GetMessage方法, 方法无参数
}

public String GetMessage(){
Log.d(message, "GetMessage: " + this.message);
return this.message;
}
}