Unity3D移植到自己的Android程序

Home / Android MrLee 2015-5-15 5697

最近公司有一个3D图形项目,用Unity3D开发需要把动画效果移植到现有的APP上面。Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序。而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的。试想下,人家既然能打包成APK安装包肯定是走了android-sdk的打包流程,有这流程我们自然能拿到源码(即便是反编译)。研究了一会儿,发现其实很简单,写了一个小DEMO放上来。所有操作如下
首先创建一个android工程,这个很简单就不详细说明了。然后打开Unity的安装目录,找到需要用的class.jar文件,就是封装调用unity引擎的java源码,位置在Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar(安装目录),然后复制这个文件到android工程的libs目录,系统会自动引用,adt22以下不记得会不会,如果不会的话需要自己设置一下,右键工程

QQ截图20150515103111


添加这个文件即可。
然后把MainAtivity稍微改一下,就是把继承父类改成UnityPlayerActivity,这样就对接上了unity接口,源码如下:
package com.lee.unityandroid;
import android.os.Bundle;
import android.widget.RelativeLayout;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		RelativeLayout layout = (RelativeLayout) findViewById(R.id.parent_layout);
		layout.addView(mUnityPlayer.getView());
	}
}
为了显明观察显示,布局稍微改动了一下。把这个显示在我们的视图上。
activity_main.xml

    
    
配置清单文件,这个里面的包名要用到后面Unity的


    
    
        
            
                
                
            
        
    

android基本上就完成了。现在创建一个Unity工程,名字啥的随便取,然后在菜单File->Build Settings->Android->Player Settings

QQ截图20150515104138

QQ截图20150515104308


最后生成的APK文件我们直接解压,把里面的assets目录下面的data目录复制到我们工程的assets目录下,然后把lib目录下的armeabi-v7a或armeabi一起复制(如果都有的话,只有其中一个就复制一个即可),最后编译我们的程序,运行效果如下:

device-2015-05-15-104600


白色是我们的布局容器,蓝色就是unity视图内容了。
下面继续说下在Unity中调用Andriod的函数,在Unity工程中创建一个C#脚本,直接将它绑定在摄像机中,它用来通知界面打开Activity。如下图所示,利用GUI在屏幕中创建两个按钮,点击按钮打开不同的Activity。
using UnityEngine;
using System.Collections;
 
public class Test : MonoBehaviour
{
 
	// Update is called once per frame
	void Update ()
	{
		//当用户按下手机的返回键或home键退出游戏
		if (Input.GetKeyDown(KeyCode.Escape) ¦¦ Input.GetKeyDown(KeyCode.Home) )
  		{
   			Application.Quit();
  		}
	}
 
	void OnGUI()
	{
		if(GUILayout.Button("OPEN Activity01",GUILayout.Height(100)))
		{
			//注释1
			 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      	 	 	 AndroidJavaObject jo = jc.GetStatic("currentActivity");
        	 	 jo.Call("Method01","第一个方法");
		}
		if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100)))
		{
			 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      	 	 	 AndroidJavaObject jo = jc.GetStatic("currentActivity");
        	 	 jo.Call("Method02","第二个方法");
		}
	}
 
}
以上代码就是Java里面的反射机制。

本文链接:https://www.it72.com/2910.htm

推荐阅读
最新回复 (0)
返回