Unity和Android的交互——Toast实现

来源:互联网 发布:手机扫描条形码软件 编辑:程序博客网 时间:2024/05/01 03:05

看来很多网上的关于Unity和安卓交互的博客,发现很多都是用Eclipse的的jar包 ,不幸的是我的电脑的Eclipse挂了,也好,正好学习下安卓官方的开发工具Android Studio,不瞎比比,开始! 
首先看下效果图 (只实现界面不漂亮,放张图就好了) 
小说说明:第一个按钮是调用了android的方法 ,返回了值 Java Return 
第二个按钮是调用了android的Toast消息 
第三个按钮是 也是调用了安卓的一个方法,不同的是这个安卓的方法紧接着又 调用了 untiy的方法 (这里就实现了android调用Unity的方法了)

下面给出android的代码

public class MainActivity extends UnityPlayerActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(R.layout.activity_main);    }    public String ShowDialog(final String _title, final String _content){        return "Java return";    }    // 定义一个显示Toast的方法,在Unity中调用此方法    public void ShowToast(final String mStr2Show){        // 同样需要在UI线程下执行        runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show();            }        });    }    // 第一个参数是unity中的对象名字,记住是对象名字,不是脚本类名    // 第二个参数是函数名    // 第三个参数是传给函数的参数,目前只看到一个参数,并且是string的,自己传进去转吧    public void callUnityFunc(String _objName , String _funcStr, String _content)    {        UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

这里要先解释下 
1.MainActivity extends UnityPlayerActivity 这个是要继承UnityPlayerActivity的,因为unity打包的apk默认的一个activity 
2.第一个参数是unity中的对象名字,记住是对象名字,不是脚本类名。这句话我也是照着别人的博客来的,其实这个对象名字就是gameObject,它会去这个gameObject下着要调用的方法

接下来是C#代码

public class TestAndroidDemo : MonoBehaviour {    public UILabel label;//显示的labelUI    // Use this for initialization    void Start () {    }    // Update is called once per frame    void Update () {    }    /// <summary>    /// 调用安卓的对话框    /// </summary>    public void FirstButtonClick()     {        // Android的Java接口          AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");        // 参数          string[] mObject = new string[2];        // 调用方法          string ret = jo.Call<string>("ShowDialog", mObject);        SetUILabelText(ref ret);    }    //调用安卓的Toast    public void ScendButtonClick()    {        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");        jo.Call("ShowToast", "Showing on Toast");    }    /// <summary>    /// 测试 unity->java->unity    /// </summary>    public void ThirdButtonClick()    {        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");        jo.Call("callUnityFunc", "Scripts", "BeCallFunc", "yangx");    }    //设置一个回掉方法    private void BeCallFunc(string _content)    {        SetUILabelText(ref _content);    }    private void SetUILabelText(ref string value) {        label.text = value;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

这个脚本我是挂在Scripts这个GameObject上的 
这里写图片描述

通过上面的就是整个的代码逻辑,把上面的流程弄清楚了,接下来就是如何打包arr文件的问题以及一些报错,这个顺序我也想过,也觉得一开始就把怎么打包,怎么处理错误一步步来这样更好,但我始终觉得一开始把流程弄明白,出错都是一些方法问题。废话不说,首先看我的工具版本 
1,android studio 2.2.2 
jdk 1.8 
sdk 
这里写图片描述 
这里我用的全是最新的包括 Android Studio 和sdk (我是不怕坑的坑,哈哈) 
2 unity是 5.4 当然打包的sdk 和Android Studio 是一样的

好了 ,首先新建一个unity项目,导出android 开发包 
这里写图片描述 
这个就是导出包的android目录 
用android studio将它打开,在Project的结构 
这里写图片描述

接下来我们将代码写到src下的mainActivity中,这个我在开头已有了代码,这里不重复,我们将class.jar包放到libs目录中,这个class.jar的路径:D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 这个是我的路径,我把untiy安装在D盘 
具体为什么要class.jar请www.baidu.com

这里写图片描述

右键选择Ass Libraries 导入之后可以发现在build.gradle中就有他的引入了。

然后贴下我的AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.unitytest.lanjian.testunity">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@android:style/Theme.Black.NoTitleBar">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <!-- 一定要加上这句 -->            <meta-data                android:name="unityplayer.UnityActivity"                android:value="true" />        </activity>        <activity            android:name=".Main2Activity"            android:label="@string/title_activity_main2"></activity>    </application></manifest>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

截个图 说下我该的地方 
图标下文说明

1 这个包名和unity上的要保持一致 
2 这个改了 不让在unity导apk的时候 会报没有找到这个主题Theme的错误,我的解决就是这个 
3 一定要这个,我有不知道为什么 ,请知悉告知

再有一个就是导出arr包的时候要把原来的class.jar删除 因为本省untiy导apk的时候就会带上一个,会冲突(你也可以把Unity自带的那个干掉 ,这个我没试,有人试了有用 请告诉我下,谢谢) 
(导arr包:android studio工具>bulid>bulid Apk, 导完的目录地址在你项目的\app\build\outputs\aar下 用解压工具打开,不需要解压 我用的是好压 
这里写图片描述

1 打开这个文件 删除 class.jar

我们可以打开res文件下的 values.xml看下 
这里写图片描述 
这个图应该很清楚了 这个说一个报错就是 
这里写图片描述 
这个文件是原来可以自定义的theme 会报一个 找不到 colorAccent的定义 我的解决是宝item这三行全干掉,就不报错了 这个可能是安卓和unity的一个坑

最后 
这里写图片描述

arr包和AndroidMainifest的位置 就可以导出apk包了

写的可能有点乱 ,跳动大 ,耐心点吧 
最后提供下载地址 
http://download.csdn.net/detail/sinat_23156865/9731010

原创粉丝点击