打Jar包流程
1,新建一个AS的Java空项目 2,修改plugins为com.android.library,删掉多余的配置,再点击Sync Now,把这个工程变成类库 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5f577a50ca56450f950bb3f4200cb02a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
3,在java目录下新建所需要的Java类 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ac9bd7c4d6c743a6ae0585ca76e414e6.png)
4,打包 ![在这里插入图片描述](https://img-blog.csdnimg.cn/76e359de8f3b4fc09ee5eee0a5014823.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
5,找到jar包 ![在这里插入图片描述](https://img-blog.csdnimg.cn/14824000e79a439cb06d35e3cff29891.png)
6,将这个jar包放入Unity工程下的Plugins/Android下即可
C#调用Java:
得到类:AndroidJavaClass class=new AndroidJavaClass(“包名.类名”); 得到对象:AndroidJavaObject obj =new AndroidJavaObject(“包名.类名”);
![在这里插入图片描述](https://img-blog.csdnimg.cn/f174d6e436a7457cb6cb7f5f8365937c.png)
调用方法: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目录下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3d0e5491ecfa457b95dad627fd418164.png)
(3) 将这个jar包添加到库中 ![在这里插入图片描述](https://img-blog.csdnimg.cn/96e3d05f96304f6a89849b1019285fdf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_16,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/5e77f055396c4a99933b2d83f6b8c0d8.png)
(4) 通过UnityPlayer这个类中的UnitySendMessage方法与C#调用, 这个方法三个string类型参数, var1:游戏对象名称 var2:方法名 var3:参数
Unity安卓项目结构:
Unity打包安卓项目
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b62c7f570e84b8e99f577ec7857b41d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
用AS打开这个项目:File-Open ![在这里插入图片描述](https://img-blog.csdnimg.cn/7b1e72535f804eb6ae9d9221849ba9b4.png)
launcher:放置安卓的配置以及权限
AndroidManifests配置文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4b1adef15a442cc8df836eda5b77759.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
unityLibrary:放置Unity主要内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/ad71e1d95b1b42cab2d440a997e0abaa.png)
Java:代码 assets:游戏资源 AndroidManifest: ![在这里插入图片描述](https://img-blog.csdnimg.cn/10d3ad47d4f2475592fdb2ed3ce243c0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
Activity(活动):
代表了一个具有用户界面的单一屏幕,具有一系列的周期函数 onCreate():第一次创建 onStart():用户可见调用 onResume():应用程序与用户可交互的时候调用 onPause():被暂停的活动无法接受用户输入,不能执行任何代码。当前活动暂停,上一个活动将被恢复时调用 onStop():不可见调用 onDestroy():销毁调用 onRestart():停止后重新打开调用
创建一个自定义的活动,
Unity的默认的UnityActivity可以在Unity的安装目录下的:Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player下找到
-
创建一个自定义的活动类继承Activity,重写周期函数 -
在AndroidManifest增加一个Activity节点,将UntiyPlayerActivity节点的主活动移动到自定义活动下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ae9340a3dfd84f7c8d4bd7447c3a4098.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16) -
创建活动自定义布局 ![在这里插入图片描述](https://img-blog.csdnimg.cn/91885ee998d84f62b490ced263a7e941.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
创建后自定义GUI(Text,Button等),鼠标拖动放入,编辑详细信息 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9dc5348800e847c8969113c12a903c22.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
- 在onCreate中调用setContentView这个自定义布局
setContentView(R.layout.testlayout);//通过id设置 - 布局上的GUI组件,通过调用findViewById(R.id.button)得到
![在这里插入图片描述](https://img-blog.csdnimg.cn/52d34e361e0e4d73b0d1c2bc9753d95b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
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)帧动画
- 在res/drawable创建一个动画XML
- 新建根节点< animation-list android:oneshot=“false”>,oneshot:false代表一直重复播放
- 在animation-list节点下创建图片节点:drawable表示哪个图片,duration表示当前图片播放多久,毫秒计算
- 在layout中创建一个ImageView组件,将background设为新建的动画XML
- 在活动脚本的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, ![在这里插入图片描述](https://img-blog.csdnimg.cn/2016ca2984c141afa3bce84b99ea3bda.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
(9) 生成的主jar包,以及AndroidManifest.xml,以及res下用到的资源也放入Unity工程下(Assets/Plugins/Android下)。(注意,这个jar包里有UnityPlayerActivity和BuildConfig脚本,会与unityLibrary里的重复,可以通过改后缀的方式用360压缩解压在删除在压缩在改后缀删除) (10) 在Unity的Awake方法中调用这个隐藏方法
动态请求权限
Unity中可以通过UnityEngine.Android.Permission.RequestUserPermission方法获取用户同意的一些权限,比如相机之类的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/05ba292423e84f449fd5cdd2ef3659e1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
另外一些权限直接在AndroidManifest文件中添加uses-permission节点 ![在这里插入图片描述](https://img-blog.csdnimg.cn/04d4e831f85247a7900ce1642b6f7431.png)
AndroidStudio中的一些小功能
(1) 显示消息面板:Toast.makeText(Context text,String str).show(); Context:Activity是继承Context的,如果实在Activity中的话,直接this str:消息内容 (2)
AS小技巧:
AS打开日志输出:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a6babd987d0b43f8afe73d3cabf12e69.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
按住Ctrl键的同时单击鼠标查看源码
显示代码行数: ![在这里插入图片描述](https://img-blog.csdnimg.cn/898dfa9c8a874bbe989c86af98f69c5e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
修改文件编码为UTF-8 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1948659d5c8f4773a7e81426092c1041.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55m96Zye,size_20,color_FFFFFF,t_70,g_se,x_16)
多行注释取消注释快捷键: 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下的文件不能以数字开头
|