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,表明回传成功!

   

原文地址:https://www.cnblogs.com/Yellow0-0River/p/4242352.html