前面说了怎么把vuforia 添加到 unity工程里,现在说下怎么把unity工程导入到android studio 里面,实现在android studio 里面开发AR
一、打开Build Setting
二、导出文件
1.按这个配置,然后点击 Build APP run可以直接以APK文件在手机运行
2.导出为android studio文件,点击export即可导出
导出后的文件如下,很熟悉的android文件吧,然后把里面的东西全部复制到我们自己的工程
三、在android studio里面编辑
让你的activity继承UnityPlayerActivity,在需要的地方用addView方法把mUnityPlayer加进去就行了
public class Main2Activity extends UnityPlayerActivity {
private ProgressDialog progressDialog;
private boolean isClick=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.up);
linearLayout.addView(mUnityPlayer);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("加载中。。。");
progressDialog.show();
mUnityPlayer.windowFocusChanged(true);
}
@Override
protected void onResume() {
super.onResume();
isClick=false;
}
//对应unity中调用方法
public void HideSplash(){
progressDialog.dismiss();
}
//对应unity中 点击事件
public void ClickModel(){
if(!isClick){
isClick=true;
startActivity(new Intent(this,Main3Activity.class));
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onDestroy();
}
return true;
}
public void bu1(View view) {
Toast.makeText(this, "bu1bu1bu1bu1", Toast.LENGTH_SHORT).show();
}
}
四、unity android studio 方法互调
参考这篇文章,写的不错
http://blog.csdn.net/crazy1235/article/details/46733221
五、下面是在unity中可能会用到的脚本
1、这个脚本控制模型的点击事件,通过OnclickModel 方法实现与android studio的交互
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Vuforia;
public class Touch : MonoBehaviour {
private string name;
public GUISkin mySkin;
public Text text;
// Use this for initialization
void Start () {
//自动对焦的方法
GameObject ARCamera=GameObject.Find("ARCamera");
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
// Update is called once per frame
void Update () {
//自动对焦的方法
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
if (Input.touchCount == 1)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo))
{
Debug.DrawLine(ray.origin,hitInfo.point);//划出射线,只有在scene视图中才能看到
GameObject gameObj = hitInfo.collider.gameObject;
//gameObj.transform.parent.renderer.material = mats<i>;//设置父组件的材质
if(Input.GetTouch(0).tapCount==1){
text.color = Color.red;
OnclickModel ();
}
}
}
}
//调用android想对应的方法
void OnclickModel(){
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
//调用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的参数
jo.Call ("ClickModel");
}
}
}
}
2.这个脚本很用用处,在vuforia 启动时候会有很长一段时间的黑屏,这个方法可以在vuforia 启动完毕以后调用android 方法
using UnityEngine;
using System.Collections;
public class Launcher : MonoBehaviour
{
public string loadScene;
void Awake()
{
Debug.Log("Launcher Awake");
DontDestroyOnLoad(gameObject);
}
void Start()
{
Debug.Log("Launcher Start");
StartCoroutine(LoadSence());
}
IEnumerator LoadSence()
{
if (!string.IsNullOrEmpty(loadScene))
{
Application.LoadLevelAsync(loadScene);
}
else
{
int levelCount = Application.levelCount;
int curLevel = Application.loadedLevel;
if (curLevel + 1 < levelCount)
Application.LoadLevelAsync(curLevel + 1);
}
yield return 0;
Invoke("OnFinish", 0.5f);
//OnFinish();
}
void OnFinish()
{
if (Application.platform.Equals(RuntimePlatform.Android))
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("HideSplash");
}
}
}
// Destroy(gameObject);
}
}
好了,本篇博文到此结束,我也是才开始研究,有哪里不对的,望提出,大家一起交流