打Jar包流程

1,新建一个AS的Java空项目

2,修改plugins为com.android.library,删掉多余的配置,再点击Sync Now,把这个工程变成类库

unity Java 互相调用 unity 调用 自定义 java 类_unity

3,在java目录下新建所需要的Java类

unity Java 互相调用 unity 调用 自定义 java 类_unity_02

4,打包

unity Java 互相调用 unity 调用 自定义 java 类_jar包_03

5,找到jar包

unity Java 互相调用 unity 调用 自定义 java 类_jar_04

6,将这个jar包放入Unity工程下的Plugins/Android下即可

C#调用Java:

得到类:AndroidJavaClass class=new AndroidJavaClass(“包名.类名”);
得到对象:AndroidJavaObject obj =new AndroidJavaObject(“包名.类名”);

unity Java 互相调用 unity 调用 自定义 java 类_jar_05

调用方法:obj.Call(“方法名”);
调用静态方法:class.CallStatic(“方法名”); obj.CallStatic(“方法名”);
得到字段:obj.Get(“字段名”);

Java调用C#

(1) 找到Unity安卓平台目录下的安卓jar包。

Unity安装目录下的:Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

(2) 将这个jar包放入AS工程下的libs目录下

unity Java 互相调用 unity 调用 自定义 java 类_jar_06

(3) 将这个jar包添加到库中

unity Java 互相调用 unity 调用 自定义 java 类_jar_07


unity Java 互相调用 unity 调用 自定义 java 类_jar包_08

(4) 通过UnityPlayer这个类中的UnitySendMessage方法与C#调用,
这个方法三个string类型参数,
var1:游戏对象名称
var2:方法名
var3:参数

Unity安卓项目结构:

Unity打包安卓项目

unity Java 互相调用 unity 调用 自定义 java 类_jar_09

用AS打开这个项目:File-Open

unity Java 互相调用 unity 调用 自定义 java 类_jar_10

launcher:放置安卓的配置以及权限

AndroidManifests配置文件

unity Java 互相调用 unity 调用 自定义 java 类_unity_11

unityLibrary:放置Unity主要内容

unity Java 互相调用 unity 调用 自定义 java 类_unity Java 互相调用_12

Java:代码

assets:游戏资源

AndroidManifest:

unity Java 互相调用 unity 调用 自定义 java 类_jar_13

Activity(活动):

代表了一个具有用户界面的单一屏幕,具有一系列的周期函数
onCreate():第一次创建
onStart():用户可见调用
onResume():应用程序与用户可交互的时候调用
onPause():被暂停的活动无法接受用户输入,不能执行任何代码。当前活动暂停,上一个活动将被恢复时调用
onStop():不可见调用
onDestroy():销毁调用
onRestart():停止后重新打开调用

创建一个自定义的活动,

Unity的默认的UnityActivity可以在Unity的安装目录下的:Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player下找到

  1. 创建一个自定义的活动类继承Activity,重写周期函数
  2. 在AndroidManifest增加一个Activity节点,将UntiyPlayerActivity节点的主活动移动到自定义活动下
  3. unity Java 互相调用 unity 调用 自定义 java 类_unity Java 互相调用_14

  4. 创建活动自定义布局
  5. unity Java 互相调用 unity 调用 自定义 java 类_android_15

创建后自定义GUI(Text,Button等),鼠标拖动放入,编辑详细信息

unity Java 互相调用 unity 调用 自定义 java 类_android_16

  1. 在onCreate中调用setContentView这个自定义布局
    setContentView(R.layout.testlayout);//通过id设置
  2. 布局上的GUI组件,通过调用findViewById(R.id.button)得到

Button btn = findViewById(R.id.button);
给按钮加上事件:btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TestActivity.this,UnityPlayerActivity.class);//跳转活动
startActivity(intent);//开始活动
}});

创建Activity动画

(1)帧动画

  1. 在res/drawable创建一个动画XML
  2. 新建根节点< animation-list android:oneshot=“false”>,oneshot:false代表一直重复播放
  3. 在animation-list节点下创建图片节点:drawable表示哪个图片,duration表示当前图片播放多久,毫秒计算
  4. 在layout中创建一个ImageView组件,将background设为新建的动画XML
  5. 在活动脚本的onCreate方法,先设置布局,在得到ImageView组件,在激活对应的动画
    setContentView(R.layout.test);//设置布局
    Img = findViewById(R.id.wrap);//通过id得到组件
    Img.setImageResource(R.drawable.animation);//给图片组件绑定动画
    AnimationDrawable animationDrawable = (AnimationDrawable) Img.getDrawable();//得到图片组件上的动画
    animationDrawable.start();//激活动画

(2)自定义UnityAPK启动页

(1) 新建AS项目(注意包名要和Unity的包名相同)导入class.jar和UnityPlayerActivity脚本,在Unity安装目录下

(2) 在新建一个Java类继承UnityPlayerActivity

(3) 重写onCreate方法

(4) 创建ImageView这样的GUI组件:

ImageView iv = new ImageView(this);

(5) 增加动画以及给组件绑定动画以及激活动画,方式和帧动画方式差不多(帧动画的图片大小不能太大,不然会报GC的错误)

(6) 添加到unity的活动中

mUnityPlayer.addView(iv);

(7) 增加隐藏方法调用隐藏启动页:

iv.setVisibility(View.GONE);

//GONE隐藏,GONE 不显示且不占用布局,VISIBLE显示,INVISIBLE:不显示

(8) 修改AndroidManifest.xm,增加activity节点以及intent-filter节点设置主activity为自定义的activity,

unity Java 互相调用 unity 调用 自定义 java 类_jar包_17

(9) 生成的主jar包,以及AndroidManifest.xml,以及res下用到的资源也放入Unity工程下(Assets/Plugins/Android下)。(注意,这个jar包里有UnityPlayerActivity和BuildConfig脚本,会与unityLibrary里的重复,可以通过改后缀的方式用360压缩解压在删除在压缩在改后缀删除)
(10) 在Unity的Awake方法中调用这个隐藏方法

动态请求权限

Unity中可以通过UnityEngine.Android.Permission.RequestUserPermission方法获取用户同意的一些权限,比如相机之类的

unity Java 互相调用 unity 调用 自定义 java 类_jar包_18

另外一些权限直接在AndroidManifest文件中添加uses-permission节点

unity Java 互相调用 unity 调用 自定义 java 类_jar包_19

AndroidStudio中的一些小功能

(1) 显示消息面板:Toast.makeText(Context text,String str).show();
Context:Activity是继承Context的,如果实在Activity中的话,直接this
str:消息内容
(2)

AS小技巧:

关闭启动AS自动打开项目

unity Java 互相调用 unity 调用 自定义 java 类_jar包_20

AS打开日志输出:

unity Java 互相调用 unity 调用 自定义 java 类_jar包_21


只看Unity的Log:

unity Java 互相调用 unity 调用 自定义 java 类_unity_22


在Tag里面填入Unity即可

按住Ctrl键的同时单击鼠标查看源码

显示代码行数:

unity Java 互相调用 unity 调用 自定义 java 类_unity_23

修改文件编码为UTF-8

unity Java 互相调用 unity 调用 自定义 java 类_jar包_24

多行注释取消注释快捷键:

Ctrl+/

注意事项

(1) ,警告AGPBI导致的问题
是包重复引用导致的原因,仔细检查Java类中的引用包
(2) 报错Attribute application@label value=…AndroidManifest
是因为Library也定义了与主项目相同的属性,会导致合并失败,比如都默认生成的android:label=“@string/app_name” 或者 android:icon=“@drawable/icon_logo”,在application中加入tools:replace="android:icon, android:theme , android:label"标签解决或者选择删除哪个属性
(3) res下的文件不能以数字和大写字母开头