工作过程中接触了很多新的知识,但一直没想起来记录下来,导致有很多都记不清楚,于是决定开始将知识进行汇总以备后续的学习或使用。因为是初次使用,所以可能有很多错误的地方,希望大家及时回复我以进行改正,谢谢。
方法引自: https://blog.csdn.net/g777520/article/details/53331797与https://blog.csdn.net/qq_15020543/article/details/80516066
前提
在工作过程中需要与Android端进行配合使用,但是在网上找到的交互方式大多是生成jar或是arr包。我试了很多种方法总是出错,最后尝试了直接用Unity导出,这次终于成功了。
下面是我的具体操作
一、创建一个Unity工程
我使用的是Unity 7.1.2,算是比较新的版本了,现在创建一个Text以及两个Button,分别命名为 Button01,Button02,令外加一个Cube,将Canvas设置成Screen Space-Camera

C#:挂在MainCamera上的脚本Test:
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
//定义一个int 变量用来接收java传过来的参数
int index = 0;
string angle;
public Text mtext;
//一个旋转物体
public GameObject cube;
public void OnClick1()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
/* jo.call | java对象的函数名字
* <> | 函数返回值类型
* ("") | 调用的方法名 */
index = jo.Call<int>("makePauseUnity");
angle = jo.Call<string>("makeRotateUnity");
mtext.text = index.ToString();
RotateCube(angle);
}
public void OnClick2()
{
print("OnClick1被执行到了");
/* com.android.unityToandroid : Android工程定义的包名
* UnityPlayerActivity :java方法所在的类名 */
AndroidJavaClass jc = new AndroidJavaClass("com.android.unityToandroid.UnityPlayerActivity");
//m_instance : UnityPlayerActivity类中自己声明
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("m_instance");
//ShowMessage : java对应的方法
//Unity : 向这的代码传一个参数
jo.Call("ShowMessage", "Unity");
}
public void RotateCube(string angle)
{
cube.transform.Rotate(Vector3.up, float.Parse(angle));
}
}
二、打包Android工程
1、File->Build Setting后弹出

(1) 选择android平台
(2) 点击player settings
(3) 更改包名(很重要)
(4) 将Build System改为Gradle
(5) 勾选Export Project(如果不勾,导出为apk)
(6) Export
导出一个文件夹

可能会出现错误:release builds have to be signed when using Gradle,这是因为没有签名,接下来开始签名设置
2、Gradle签名
1)关闭other settings,打开publishing settings,点击Browse Keystore ,新建文件夹保存Key,点击确定
2)点击Unsigned(debug)之后会有一个下拉列表选择Create a new Key。并弹出一个二级弹框设置。

Alias:设置key的名称
Validity:有效期
3)点击CreatKey后,在Alias选择刚刚创建的Key的名字.输入Key的密码。Ctrl+s保存,之后点击Build。
3、Android Studio
导入Android Studio,如下图

打开UnityPlayerActivity,在此界面进行编译

代码:
package com.andrtoid.unityToandroid;
import com.unity3d.player.*;
public class UnityPlayerActivity extends Activity
{
protected UnityPlayer mUnityPlayer;referenced from native code
private int index;
private String string;
public static UnityPlayerActivity m_instance=null;
// Setup activity layout
@Override protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
mUnityPlayer = new UnityPlayer(this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
m_instance=this;
}
//Unity调用的ShowMessage方法并传递参数 str
public void ShowMessage(final String str){
Log.i("调用信息", "我被onclik2调用了");
runOnUiThread(new Runnable() {
@Override
public void run() {
Show(str);
}
});
}
public void Show(String str){
Toast.makeText(this, str+"成功调用了android中的函数", Toast.LENGTH_LONG).show();
}
//Unity调用的makePauseUnity方法并返回index
public int makePauseUnity(){
Log.i("调用信息","我被onclick1调用了");
index++;
return index;
}
//这是我模仿上式写的,不一定完全正确
public String makeRotateUnity(){
Log.i("调用信息","我被onclick1调用了");
string="80";
return string;
}
}
编译结束,下面显示结果



网友评论