使用unity开发android平台的游戏时候,大部分可能都需要加入一些广告,收费等一些额外的功能来进行游戏扩展,只要unity和android代码能够相互调用那一切都有希望。
当然工具必不可少,首先安装android sdk和最新版unity4.1.5. android
sdk里面已经有了eclipse,就方便多了。
安装过程在此省略。。。
首先新建一个android项目,从unity的安装文件路径下找到一个classes.jar文件
mac版路径:找到安装路径下Unity.app,显示包内容 …/Contents/PlaybackEngines/AndroidPlayer/bin/classes.jar
pc版路径:Unity3D的安装目录下的这个文件夹中 …\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar
找到后,丢到android工程的libs文件夹下,右键选中classes.jar点击菜单:Build Path->Add To Build Path,这样jar包就添加到工程中引用。
然后打开你的工程的主Activity,把继承的Activity改成UnityPlayerActivity,并导入对应的包:import com.unity3d.player.UnityPlayerActivity;
把默认的onCreate方法中的默认方法setContentView(R.layout.activity_main);删除。
然后对应的Activity代码如下:
package com.dillon; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: System.out.println("show dialog!!!!!!!!!!!!!!!!!!!!!!!!!!"); showLightDialog("tip", "Are you sure want to on/off the light?", true); break; default: break; } } }; } //unity中调用的方法 public void DisplayDialog(){ Message message = new Message(); message.what = 1; handler.sendMessage(message); } void showLoginActivity(){ runOnUiThread(new Runnable() { @Override public void run() { Intent intent = new Intent(MainActivity.this,LoginActivity.class); MainActivity.this.startActivity(intent); } }); } void showLightDialog(String title, String content,boolean isCanceledOnTouchOutside) { AlertDialog.Builder builder = new Builder(this); builder.setTitle(title); builder.setMessage(content); builder.setPositiveButton("ok", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { UnityPlayer.UnitySendMessage("Main Camera", "ON_OFF_Light", ""); dialog.dismiss(); } }); builder.setNegativeButton("cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(isCanceledOnTouchOutside); dialog.show(); } }
然后新建第二个Activity,我新建的是Android中默认的登录界面,需要在AndroidManifest中配置一下的。
AndroidManifest.xml中代码如下:
<!--?xml version="1.0" encoding="utf-8"?-->
在这个类里面,处理了两个unity调用请求:弹出对话框和跳转到login activity,android代码OK了之后就pc下的doc命令中(mac下打开终端),cd到android工程中bin/classes文件夹下,输入jar cvf class.jar com/命令,回车后会在bin文件夹下声称一个class.jar文件.
下面转到unity中,新建unity项目,在Project中新建Plugins/Android目录,
然后需要把android工程中的资源放到unity中,目录结构大致是这样子:
Plugins
–Android
AndroidManifest.xml
–bin
class.jar
–res
….
截图是这样子的:
放置完毕之后,在unity场景中新建一个任意基础物体(那方块来举例),然后新建一个光源,光源要照射到物体上;
新建c#脚本AndroidTest.cs,就开始编写unity代码,代码如下:
using UnityEngine; using System.Collections; public class AndroidTest : MonoBehaviour { AndroidJavaClass jc; AndroidJavaObject jo; void Start () { jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); jo = jc.GetStatic("currentActivity"); } void OnGUI() { if(GUI.Button(new Rect(240, 100, 100, 40),"Dialog")){ jo.Call("DisplayDialog"); } if(GUI.Button(new Rect(240,350,100,40),"Activity")){ jo.Call("showLoginActivity"); } } public Light mlight; void ON_OFF_Light(){ Debug.Log("ON_OFF_Light@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); mlight.enabled = !mlight.enabled; } }
把AndroidTest脚本附加到摄像机上,然后把灯光拖拽到脚本的mLight属性里就完成了,装机后点击Dialog按钮,弹出对话框,当点击OK之后会通过android代码中UnityPlayer.UnitySendMessage(“Main Camera”, “ON_OFF_Light”, “”);方法回调
c#中ON_OFF_Light函数,打开或者关闭光源。
当点击Activity按钮后,进行了Activity跳转.
有了这些桥接,我们就可以使用Android中原生态的功能在游戏中添加各种丰富的功能.
使用有些功能可能会调用失败,部分原因如下:
1.在unity调用的方法不能更新主线程的内容,比如弹出框,弹出Toast等。
2.有些可能需要添加权限,比如录音.
3.可能会崩溃:在android的AndroidManifest.xml主activity屏幕方向要和unity中设置的方向一致,要不然当屏幕发生旋转程序可能崩溃。