zoukankan      html  css  js  c++  java
  • Unity与Android的对调

    本文结构

    • 使用注意
    • 新工程
    • Unity传Android参数
    • Android传Unity参数     

    使用注意

    1. 任何代码文件都可以使用UnityPlayer.UnitySendMessage() 向Unity发消息。只要import com.unity3d.player.UnityPlayer;然后写UnityPlayer.UnitySendMessage()即可;
    2. Android调用Android的相关方法,参数UnityPlayer.UnitySendMessage("Android_IAPManager","SimpleReturn","555:"+mIAP);参数1:GameObject名称,参数2:函数名,参数3:字符串参数。只能传一个字符串参数,不能传多个,如果需要传多个参数,只能分几个函数调用,或者字符串用'|'之类的字符合并传递再拆分接收了。物体上不存在名称为参数2的函数,不会报错,但是参数3不能为null,否则会强制退出;
    3. Unity调用Android得相关方法不再叙述,自己可查看API;
    4. Unity中调用非MainActivity的普通类对象里的函数时,可在MainActivity中写返回普通类对象的函数,然后在Unity中调用(jo = jo.call<JavaObject>("getUpdateVersion"))来获取当前类对象,比如:

        public UpdateVersion getUpdateVersion() {

            return new UpdateVersion(this);

        }

        public UpdateVersion(Activity activity) {

            this.activity = activity;

        }

        this表示传递的是当前的Activity,在UpdateVersion中的构造方法中接收此ActivityUnity3d在调用Android时感觉就是多线程的问题,所以在处理UI情况时,可以将处理UI的操作放置在Handler中,用Bundle传递相关参数。普通类中的Handler如下缩写:(注意红字部分,activity表示从构造函数传递过来的acitivity)

    private Handler mHandler = new Handler(Looper.getMainLooper()) {

       

            @Override

            public void handleMessage(Message msg) {

                switch (msg.what) {

                case TEST:

                    break;

    case SHOWTOAST:

        Toast.makeText(activity, "helloworld", Toast.LENGTH_LONG).show();

                    break;

       

                default:

                    break;

                }

            }

        };

    新工程

    1. 新建Unity工程,命名Bundle ID如com.pcc.appname
    2. 场景里添加GameObject,命名为Manager,并附带Manager.cs脚本。内容如下

      using UnityEngine;

    using System.Collections;

    public class Manager : MonoBehaviour {

    AndroidJavaClass jc;

    AndroidJavaObject jo;

    void Start()

    {

    #if UNITY_ANDROID

    jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

    jo = jc.GetStatic("currentActivity");

    #endif

    }

    void OnGUI()

    {

      if(GUI.Button(new Rect(0,0,100,100),"do"))

    {

      DO();

    }

    }

    void DO()

    {

    #if UNITY_ANDROID

    jo.Call("StartAct");

    #endif

    }

    }

    3.新建Eclipse 工程,直接选 Android Application Project。下一步,注意package Name一定要和之前的Bundle ID对应,之后一直下一步即可。 

        

        

      4.建好工程后,     

        Mac:Unity图标右键->显示包内容   Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar拷至libs下(copy)    

    • 打开src->package name(BundleID)->主代码。这里是src->com.pcc.appname->MainActivity
    • import com.unity3d.player.UnityPlayerActivity;
    • 把extends Activity 改为extends UnityPlayerActivity
    • 把类里的代码改为如下

         package com.pcc.appname;

           

    import android.os.Bundle;

    import android.app.Activity;

    import android.view.Menu;

    import android.util.Log;

           

    import com.unity3d.player.UnityPlayerActivity;

           

    public class MainActivity extends UnityPlayerActivity {

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);       

        }

           

        public void StartAct()

        {

            Log.e("jj","kk");

        }

    }

    • Build project
    • u3d里新建Plugins/Android文件夹,拷贝 Eclipse工程下的AndroidManifest.xml文件,libs文件夹,res文件三项至Plugins/Android下。并删除classes.jar.
    • 打jar包:Eclipse工程->bin->classs,    进入mac控制台, cd至该目录,然后运行jar -cvf class.jar *,之后就在Eclipse工程->bin->classs里生成了 class.jar,U3d Plugins/Android下新建bin文件夹,把class.jar拖进去windows类似,指令完全一样。只不过需要配置环境变量,并通过控制台进入该目录的方式不同罢了。Mac可以直接cd复制粘贴好的路径,windows得一层一层cd.

      5.点击Eclipse右上角的DDMS,之后左侧 选择设备,然后点击LogCat   

        

        

      6.点击log信息的自动下拉锁定钮,之后build, 在真机上运行,点击do按钮,就能在控制台看到输出的红色的信息了:

        

        

           

    二 Unity传Android参数

    • 将jo.Call 改为jo.Call("StartAct", new object[] { "hello","world" });
    • StartAct函数改为

        public void StartAct(String x, String y)

          {

           Log.e(x+Y);

          }

    • Eclipse重新Build project, 
    • 然后到bin->classes,删除class.jar, 并在控制台指令重build一个
    • 删除unity里已有的class.jar,把新的拖进去。;
    • 之后运行,看log,发现字符串参数和整数参数都传了过去

           

    Android传Unity参数

    (1)unity里Manager.cs代码改为

    using UnityEngine;

    using System.Collections;

     

    public class Manager : MonoBehaviour {

    AndroidJavaClass jc;

    AndroidJavaObject jo;

    private string txt;

    void Start()

    {

    jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

    jo = jc.GetStatic("currentActivity");

    txt = "";

    }

    void OnGUI()

    {

    if(GUI.Button(new Rect(0,0,100,50),"do"))

    {

    DO();

    }

    GUI.Label(new Rect(0,50,100,50),txt);

    }

    void DO()

    {

    #if UNITY_ANDROID

    jo.Call("StartAct",new object[] {"hello world",5});

    #endif

    }

    void AndroidReceive(string content)

    {

    txt = content;

    }

    }

    (2) Eclipse里的代码改为

             

        public void StartAct(String x, int y)

        {

         Log.e(x,"num is:"+y);

         UnityPlayer.UnitySendMessage("Manager","AndroidReceive","OKKKKKK");

        }

           

      (3)之后如前,替换class.jar

    运行时,点击do按钮,下方显示OKKKKKK,表明回传成功!

       

  • 相关阅读:
    员工管理,这么做就对了
    学会自我管理的好处及自我管理包括的内容
    职场人必看的5本书推荐,首推《情商必读12篇》
    企业管理方面的经典著作推荐
    这6本精心挑选的团队管理类好书助你做好团队管理
    战略规划,你的企业真的做对了吗?
    如何提高说服力?说服的技巧有哪些?这本书能给你答案
    读书使人进步,这本营销书籍让你真正读懂市场营销
    P1228 地毯填补问题题解
    P1010 幂次方题解
  • 原文地址:https://www.cnblogs.com/Yellow0-0River/p/4242352.html
Copyright © 2011-2022 走看看