2016-05-06 2 views
1

В настоящее время я пытаюсь работать с дополнением реальности в android. Для этой задачи я использую Unity + Vuforia.Получить объект модели с ImageTarget Android

Итак, я создал сцену, которая работает, когда я смотрю на конкретный объект с моей камеры, он показывает мне мою модель (в основном модель 3d-кота с анимацией). Я сделал это в соответствии с учебниками, например: text format tutorial и видео на YouTube: video tutroial.

После этого я сделал андроид приложение, основанное на этом scene, как это: enter image description here

В результате Android проект, который в основном имеет один Activity и Banch из assets и libs. Единственная связь с Unity, что я вижу до сих пор является UnityPlayer класса, но это просто ViewGroup, простирались от FrameLayout

public class UnityPlayer extends FrameLayout implements com.unity3d.player.a.a 

Моей цели: мне нужно переопределить onClick на виде из Unity, что я имею (мой 3d-кошка), что-то вроде того, когда вы нажимаете на кошку на своем телефоне, это произведет какой-то звук и добавит некоторую анимацию к нему после нажатия. У меня есть модель на scene, просто логически он был преобразован в View класс внутри Android, и я подумал, что это просто ребенок UnityPlayer, но такой код:

mUnityPlayer.getChildAt(0).setOnClickListener 

не имеет никакого эффекта.

Я хочу либо иметь какой-то объект, который будет содержать все анимации и другие свойства, модель единства, или, если это невозможно, узнать, как установить OnClick слушателей в самой Unity

Я понимаю, что этот вопрос может быть неясным, и я хотел бы более подробно объяснить это тем, кто попытается помочь.

Если вам нужна дополнительная информация, просто спросите об этом в комментариях. Благодаря

Edit: Как ответ предлагал, я мог бы просто написать сценарий для этого, который я сделал, для использования VirtualButton, это выглядит следующим образом:

using UnityEngine; 
using System.Collections.Generic; 
using Vuforia; 

    public class VirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler { 

     // Private fields to store the models 
     private GameObject kitten; 
     private GameObject btn; 
     /// Called when the scene is loaded 
     void Start() { 

      // Search for all Children from this ImageTarget with type VirtualButtonBehaviour 
      VirtualButtonBehaviour[] vbs = GetComponentsInChildren<VirtualButtonBehaviour>(); 
      for (int i = 0; i < vbs.Length; ++i) { 
       // Register with the virtual buttons TrackableBehaviour 
       vbs[i].RegisterEventHandler(this); 
      } 

      // Find the models based on the names in the Hierarchy 
      kitten = transform.FindChild("kitten").gameObject; 

      btn = transform.FindChild("btn").gameObject; 

      kitten.SetActive(false); 
      btn.SetActive(true); 
     } 

     /// <summary> 
     /// Called when the virtual button has just been pressed: 
     /// </summary> 
     public void OnButtonPressed(VirtualButtonAbstractBehaviour vb) { 
      //Debug.Log(vb.VirtualButtonName); 
      //GUI.Label(new Rect(0, 0, 10, 5), "Hello World!"); 


     } 

     /// Called when the virtual button has just been released: 
     public void OnButtonReleased(VirtualButtonAbstractBehaviour vb) { 

     } 
    } 

Как вы можете видеть, в Start() метод я хочу найти и модель шкуры, которая называется kitten, но это не скрывает

Я приложил этот сценарий для виртуального объекта кнопки, я обеспечу экран:

enter image description here

Edit: Моя ошибка на самом деле, по какой-то причине, я должен был приложить VirtualButtonBehaviorHandler сценарий к ImageTarget, это не так просто понять, для меня, но я думаю, что я вижу некоторую логику его прямо сейчас , Но, по какой-то причине неизвестная, если я добавить этот код:

public void OnButtonPressed(VirtualButtonAbstractBehaviour vb) { 
     //Debug.Log(vb.VirtualButtonName); 
     switch(vb.VirtualButtonName) { 
     case "btn": 
      kitten.setActive(true); 
      break; 
     } 

    } 

Он работает мгновенно, даже не касаясь кнопки

Заключительный изменить: Это произошло, потому что я добавил свою кнопку в базу данных .xml, когда я удалил из нее кнопку - все сработало, я отмечаю единственный ответ как правильный, потому что это помогло мне

ответ

2

Брат Все возможно, если мы это сделаем. Согласно моему пониманию, что именно вы хотите сделать, это:

Первое: Вам нужно очистить некоторые базовые концепции, читая блог & Учебники:

  1. Как упоминалось объект, на котором ваш белый цит :) cat render is «Marker»

  2. В Unity Все это игровой объект, который вы можете написать сценарий для управления этим игровым объектом (CAT) с использованием скрипта. который будет находиться в любом из C# (Mono) или JavaScript для этой работы вы можете использовать Visual Studio или MonoDevelop на Unity Но перед этим, пожалуйста, поиск по ключевым словам на Google

    а) TouchEvent, RayCastMenu Контрол в единстве: Для того, чтобы справиться с Сенсорный метод

    б) MonoBehaviour класс, Start(), Update(), OnGUI() в Unity

  3. Вы можете определить любой геймобжекты, используя его имя или тег, который вы можете увидеть или изменить в инспектора окне

Таковы некоторые основные вещи. Пожалуйста, следуйте vuforia портал для разработчиков, чтобы узнать больше: https://developer.vuforia.com/library/


сейчас: Coming на ваш вопрос: По мне вы хотите сделать некоторые вещи на Щелк вашей сладкой кошки. Его простой, если просто вы хотите запустить андроид деятельность по щелчку кошки, то есть 2 варианта:

  1. Создать андроида проект и импортировать его в единстве, как библиотека проекта в Unity.

    ИЛИ

  2. создать андроида деятельность от единства проекта с помощью C# сценария. Прикрепите этот скрипт к любому объекту GameObject в сцене.

Вот я и в качестве примера второй: На нажатие кнопки Это запустит Android Activity. То, что вы должны сделать, это:

Заменить кнопку GameObject КПП Project GameObjectExport, как Android и написать деятельность с таким же именем и упаковке, как упоминание в C# код, чтобы сделать все, что вы хотите

Здесь, в моем примере я объяснили:

  1. Как всплывать GUI, когда маркер обнаружен с помощью Unity + Vuforia

  2. Как запустить андроид Ac сительности из Кодекса единства на конкретное событие

  3. Как обрабатывать событие в Unity

  4. Как сохранить GUI же с несколькими резолюциями


Пожалуйста, изучите код внимательно и прочитать комментарии также :)

using UnityEngine; 
using System.Collections; 
using Vuforia; //import Vuforia 
using System; 

public class ButtonPopup : MonoBehaviour, ITrackableEventHandler 

{ 

    float native_width= 1920f;// Native Resolution to maintain resolution on different screen size 
    float native_height= 1080f; 
    public Texture btntexture;// drag and drop any texture in inspector window 

    private TrackableBehaviour mTrackableBehaviour; 

    private bool mShowGUIButton = false; 


    void Start() { 


     mTrackableBehaviour = GetComponent<TrackableBehaviour>(); 
     if (mTrackableBehaviour) { 
      mTrackableBehaviour.RegisterTrackableEventHandler(this); 
     } 
    } 

    public void OnTrackableStateChanged(
     TrackableBehaviour.Status previousStatus, 
     TrackableBehaviour.Status newStatus) 
    { 
     if (newStatus == TrackableBehaviour.Status.DETECTED || 
      newStatus == TrackableBehaviour.Status.TRACKED || 
      newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) 
     { 
      mShowGUIButton = true;// Button Shown only when marker detected same as your cat 
     } 

     else 
     { 
      mShowGUIButton = false; 
     } 
    } 

    void OnGUI() { 

     //set up scaling 
     float rx = Screen.width/native_width; 
     float ry = Screen.height/native_height; 

     GUI.matrix = Matrix4x4.TRS (new Vector3(0, 0, 0), Quaternion.identity, new Vector3 (rx, ry, 1)); 

     Rect mButtonRect = new Rect(1920-215,5,210,110); 


     if (!btntexture) // This is the button that triggers AR and UI camera On/Off 
     { 
      Debug.LogError("Please assign a texture on the inspector"); 
      return; 
     } 

     if (mShowGUIButton) { 

      // different screen position for your reference 
      //GUI.Box (new Rect (0,0,100,50), "Top-left"); 
      //GUI.Box (new Rect (1920 - 100,0,100,50), "Top-right"); 
      //GUI.Box (new Rect (0,1080- 50,100,50), "Bottom-left"); 
      //GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom right"); 

      // draw the GUI button 
      if (GUI.Button(mButtonRect, btntexture)) { 
       // do something on button click 
       OpenVideoActivity(); 
      } 
     } 
    } 

    public void OpenVideoActivity() 
    { 
     var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer”);// any package name maintain same in android studio 
     var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity"); 
     // Accessing the class to call a static method on it 
     var jc = new AndroidJavaClass("com.mobiliya.gepoc.StartVideoActivity”);//Name of android activity 
     // Calling a Call method to which the current activity is passed 
     jc.CallStatic("Call", jo); 
    } 

} 

Помните: в Unity каждый Дело в том, GameObject, и вы можете написать скрипт, чтобы управлять любым геймобжекты

Edit: Информация для виртуальной кнопки

Виртуальные кнопки определить, когда основные характеристики конечного изображения скрыты из поля зрения камеры. Вам нужно будет поместить свою кнопку над областью изображения, которая богата функциями, чтобы она могла надежно запустить свое событие OnButtonPressed. Чтобы определить, где эти функции находятся на вашем изображении, используйте ссылку «Показать возможности» для вашего изображения в целевом менеджере.

Выберите области в изображениях, размеры которых составляют приблизительно 10% от размера цели изображения.


Вот пример изображения я упростить для вас:


enter image description here


Регистрация виртуальной кнопки:

Чтобы добавить виртуальную кнопку цель изображения, добавить элемент VirtualButton elem ent и его атрибуты элементу ImageTarget в XML-файле.

XML Атрибуты:

  1. Name - уникальное имя для кнопки
  2. Прямоугольник - определяемой по четырем углам прямоугольника в пространстве цели координат
  3. Enabled - логическое значение, указывающее должна ли кнопка включаться по умолчанию
  4. Чувствительность - высокая, средняя, ​​низкая чувствительность к окклюзии

Вы можете получить .xml файл в папке streamingAsset в единстве PROJEC т.

<ImageTarget size="247 173" name="wood"> 
    <VirtualButton name="red" sensitivity="HIGH" rectangle="-108.68 -53.52 -75.75 -65.87" 
    enabled="true" /> 
    <VirtualButton name="blue" sensitivity="LOW" rectangle="-45.28 -53.52 -12.35 -65.87" 
    enabled="true" /> 
    <VirtualButton name="yellow" sensitivity="MEDIUM" rectangle="14.82 -53.52 47.75 -65.87" 
    enabled="true" /> 
    <VirtualButton name="green" rectangle="76.57 -53.52 109.50 -65.87" 
    enabled="true" /> 
</ImageTarget> 

После регистрации виртуальных код кнопки просто затем:

public class Custom_VirtualButton : MonoBehaviour, IVirtualButtonEventHandler 
{ 
    // Use this for initialization 
    void Start() { 

// here it finds any VirtualButton Attached to the ImageTarget and register it's event handler and in the 
//OnButtonPressed and OnButtonReleased methods you can handle different buttons Click state 
//via "vb.VirtualButtonName" variable and do some really awesome stuff with it. 
     VirtualButtonBehaviour[] vbs = GetComponentsInChildren<VirtualButtonBehaviour>(); 
     foreach (VirtualButtonBehaviour item in vbs) 
     { 
      item.RegisterEventHandler(this); 
     } 

    } 

    // Update is called once per frame 
    void Update() { 

    } 


    #region VirtualButton 

    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb) 
    { 
     Debug.Log("Helllllloooooooooo"); 
    } 

    public void OnButtonReleased(VirtualButtonAbstractBehaviour vb) 
    { 
     Debug.Log("Goooooodbyeeee"); 
    } 

    #endregion //VirtualButton 
} 

и после написания этого кода вы должны пойти в StreamingAsset/QCAR и найти ImageTarget XML ассоциации & сделать что-то например:

<?xml version="1.0" encoding="UTF-8"?> 
<QCARConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="qcar_config.xsd"> 
    <Tracking> 
    <ImageTarget name="marker01" size="100.000000 100.000000"> 

     <VirtualButton name="red" rectangle="-49.00 -9.80 -18.82 -40.07" enabled="true" /> 
    </ImageTarget> 
    </Tracking> 
</QCARConfig> 

Best of Luck :) Bdw CAT так мило :)

+0

Да, ваш ответ очень полезен, как вы уже упоминали, все в основном GameObject, и я сделал scprit для использования виртуальной кнопки, единственная проблема здесь , он вообще не работает, я внес изменения в свой вопрос, пожалуйста, посмотрите, когда у вас есть свободное время –

+0

привет, пожалуйста, проверьте отредактированный ответ и позвольте спросить, есть ли у вас какие-либо трудности снова –

Смежные вопросы