zoukankan      html  css  js  c++  java
  • Unity3d与Android交互

    先看下效果

    你一定会说,然并卵!
    没错,这里只是一个最简单的例子,unity与android activity 互相传参数。
    玩过手游的都知道,在你要为你心爱的游戏角色准备花钱买钻石,点击购买的时候,会弹出一个风格可能和游戏完全不符的界面,没错,那就是渠道sdk的支付界面了。
    比如:

    其实,在游戏上线之前呢,要接大量的渠道SDK啦,渠道有大量的用户,保证游戏有大量的导入量,用了用户,你的游戏才有可能赚钱。所以呢,游戏研发和渠道呢,要谈游戏分成,但是往往都是渠道占大头,谁叫用户至上。
    游戏研发呢,自然不必为这个再分心力,这个渠道sdk的提供商会把它封装好,只提供接口给我们调用,传一些参数过去,就可以完成想要的操作了。至于这个sdk里面,怎么和服务器交互啦,界面搭的多好看啦,都是后话。因为最后还是要把结果参数传回到unity里面。

    废话说了一大堆。

    1.建一个Android项目。把Unity安装目录下面的classes.jar 导入到这个工程的buildpath里面。

    2.unity里面点击一个button,打开一个新的 activity。比如说充值,打开支付的页面哦。或者点击一个button,关闭一个activity。
    那么就涉及到activity切换。
    activity的切换->Intent的使用(activity的切换会用到intent)
    要两个activity之间做切换,那必须再建一activity咯

    你可以自定义layout,怎么好看怎么弄,It is up to you !
    layout:就是告诉android,我新建的activity要显示什么控件,控件按照什么排列方式显示的
    记得改androidMainifest.xml ,把你刚加的activity加上。
    androidMainifest.xml:就是描述android有几个activity。

    新建的这个activity,要继承UnityPlayerActivity

    //写好Android里交互部分
    public void test1()
    {
        //调Unity里Testjoe函数,把参数传过去
        UnityPlayer.UnitySendMessage("JOE", "Testjoe", "I am com android");
    }
     
    public void test2(final String msg)
    {
        runOnUiThread(new Runnable()
        {
            public void run()
            {
                //跳出一个提示。
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
         });
    }
     
    //切换到自定义的activity,Unity里面记得调用哦
    public void ToMyActivity(View view)
    {
        Intent myIntent = new Intent(this,MyActivity.class);
        startActivity(myIntent);
    }

    3.Unity里面的交互部分

    using UnityEngine;
    using System.Collections;
     
    public class test1 : MonoBehaviour
    {
        string content = "unity";
     
        //Android里会调这个函数
        public void Testjoe(string s)
        {
            this.content = s;
        }
     
        void OnGUI()
        {
            if (GUILayout.Button("调用Android函数1:BackCallUnityMethod", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                jo.Call("test1");
            }
     
            GUILayout.Box(this.content, GUILayout.Height(100), GUILayout.Width(200));
     
            if (GUILayout.Button("调用Android函数2:Toast", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                jo.Call("test2","hello joe ");
            }
     
            if (GUILayout.Button("调用Android函数3:GetReturn", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                string s =  jo.Call<string>("test3","joe");
                this.content = s;
            }
     
            if (GUILayout.Button("调用Android函数4:Max(1,2)", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.test.Max.Max");
                int max =  jc.CallStatic<int>("Max", 1, 2);
                this.content = max.ToString();
            }
     
            if (GUILayout.Button("支付", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
     
                jo.Call("ToMyActivity");
            }
     
            if (GUILayout.Button("支付2", GUILayout.Height(100), GUILayout.Width(250)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
     
                jo.Call("Tonew");
            }
        }
    }

    4.然后就是导出jar包给Unity用。
    点选项目名字,file-export-java-jar file,导出jar,只需要src文件就够咯。其它都是不必要的文件(导出之前最好 project-clean一下)

    bin下面放的就是导出的jar包
    res可以从android工程里面直接拖进来
    AndroidManifest.xml也可以直接拖进来

    最后unity导出apk的包名要和android的包名一致。

    之前的例子工程找不到了,其实知道了怎么交互,后面要做什么功能,就是在这基础上扩展了。

  • 相关阅读:
    Linux服务下,设置开机自启动服务
    [知识分享] 实用且具有参考意义的博客网站
    [AutoHotKey] 自定义配置快捷键
    [driver] probe调用的时机
    [vscode] 常用快捷键
    [Linux] 双系统下linux自动挂载windows下的逻辑分区
    [Linux] manjaro中文输入法配置
    [Linux] gnome桌面顶栏透明效果
    [Linux] manjaro窗口按钮异常
    博客园简约主题设置
  • 原文地址:https://www.cnblogs.com/joeshifu/p/5489509.html
Copyright © 2011-2022 走看看