【Unity3D自学记录】Unity3d Virtual Button(虚拟按钮)

一、利用Unity3d进行开发


查看这个脚本,是对虚拟按钮的事件进行监听控制。相应地修改按钮的触发事件可以通过这个类进行。

[csharp]  view plain copy
  1. // Add the material corresponding to this virtual button  
  2.         // to the active material list:          
  3.         switch (vb.VirtualButtonName)  
  4.         {  
  5.             case "red":  
  6.                 mActiveMaterials.Add(m_TeapotMaterials[0]);  
  7.                 break;  
  8.   
  9.             case "blue":  
  10.                 mActiveMaterials.Add(m_TeapotMaterials[1]);  
  11.                 break;  
  12.   
  13.             case "yellow":  
  14.                 mActiveMaterials.Add(m_TeapotMaterials[2]);  
  15.                 break;  
  16.   
  17.             case "green":  
  18.                 mActiveMaterials.Add(m_TeapotMaterials[3]);  
  19.                 break;  
  20.         }  
  21.   
  22.         // Apply the new material:  
  23.         if (mActiveMaterials.Count > 0)  
  24.             mTeapot.renderer.material = mActiveMaterials[mActiveMaterials.Count - 1];  

二、在Eclipse中

使用的版本是SDK3.0.9,samples是3.0.5。


虚拟按钮sample包下只有这两个文件,一个主类,一个渲染类。

主类中主要对虚拟按钮进行设置并创建。

渲染类主要对按钮事件进行监听和渲染三维模型。

Vuforia 虚拟按钮案例执行流程:

先调用这个接口方法:

   public voidonInitARDone(SampleApplicationException exception)

再在该方法中调用private voidsetSampleAppMenuSettings(),在该方法中设置虚拟按钮的选项:

group =mSampleAppMenu.addGroup("", true);

        group.addSelectionItem(getString(R.string.menu_button_red),

            CMD_BUTTON_RED, true);

       group.addSelectionItem(getString(R.string.menu_button_blue),

            CMD_BUTTON_BLUE, true);

       group.addSelectionItem(getString(R.string.menu_button_yellow),

            CMD_BUTTON_YELLOW, true);

       group.addSelectionItem(getString(R.string.menu_button_green),

            CMD_BUTTON_GREEN, true);

包含按钮名称、触发指令以及是否开启。

触发之后执行该接口方法:publicboolean menuProcess(int command)

caseCMD_BUTTON_RED:

                addButtonToToggle(0);

                break;

           

            case CMD_BUTTON_BLUE:

                addButtonToToggle(1);

                break;

           

            case CMD_BUTTON_YELLOW:

                addButtonToToggle(2);

                break;

            

            case CMD_BUTTON_GREEN:

                addButtonToToggle(3);

                break;

再执行这个方法:

private voidaddButtonToToggle(int virtualButtonIdx)

    {

        Log.d(LOGTAG,"addButtonToToggle");

       

        assert (virtualButtonIdx >= 0&& virtualButtonIdx < NUM_BUTTONS);

       

        switch (virtualButtonIdx)

        {

            case 0:

                buttonMask |= BUTTON_1;

                break;

           

            case 1:

                buttonMask |= BUTTON_2;

                break;

           

            case 2:

                buttonMask |= BUTTON_3;

                break;

           

            case 3:

                buttonMask |= BUTTON_4;

                break;

        }

        updateBtns = true;

    }

 

然后这个方法每帧都会执行,publicvoid onQCARUpdate(State state),因此又执行到

 

   if ((buttonMask & BUTTON_1) != 0)

            {

                Log.d(LOGTAG, "ToggleButton 1");

               

               toggleVirtualButton(imageTarget, virtualButtonColors[0],

                    -108.68f, -53.52f, -75.75f,-65.87f);

               

            }

            if ((buttonMask & BUTTON_2) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 2");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[1],

                    -45.28f, -53.52f, -12.35f,-65.87f);

            }

            if ((buttonMask & BUTTON_3) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 3");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[2],

                    14.82f, -53.52f, 47.75f,-65.87f);

            }

            if ((buttonMask & BUTTON_4) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 4");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[3],

                    76.57f, -53.52f, 109.50f,-65.87f);

            }

           

            // Reactivate the data set:

            it.activateDataSet(dataSet);

           

            buttonMask = 0;

            updateBtns = false;

 

最后执行到这个方法就成功创建了四个虚拟按钮:

booleantoggleVirtualButton(ImageTarget imageTarget, String name,

        float left, float top, float right,float bottom)

注意:在主类中并没有相应的触发事件,只是创建了四个按钮,那么触发事件是在哪里监听的呢?答案就是渲染类。

在渲染类主要工作有两个:一是监听虚拟按钮触发事件,二是渲染三维虚拟模型

在renderFrame()方法中,同样该方法也是会每帧渲染的,所以会一直在监听和渲染。       

 for (int j = 0; j <VirtualButtons.NUM_BUTTONS; ++j)

                {

                    if(button.getName().compareTo(

                        mActivity.virtualButtonColors[j])== 0)

                    {

                        buttonIndex = j;

                        break;

                    }

                }               

                // If the button is pressed,than use this texture:

                if (buttonResult.isPressed())

                {

                    textureIndex = buttonIndex+ 1;

                }

根据这里可以修改模型,不同的textureIndex对应不同的模型。

研究这个方法的实现可以看出,

public StringgetName() {

    returnVuforiaJNI.VirtualButton_getName(this.swigCPtr, this);

  }

 

public booleanisPressed() {

    returnVuforiaJNI.VirtualButtonResult_isPressed(this.swigCPtr, this);

  }

检测是否按下按钮的方法是本地库中定义的。

你可能感兴趣的:(【Unity3D自学记录】Unity3d Virtual Button(虚拟按钮))