基于 vuforia + unity + android studio 的AR开发(2)

前面说了怎么把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);  
    }  
}  

好了,本篇博文到此结束,我也是才开始研究,有哪里不对的,望提出,大家一起交流

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值