2014-01-20 20 views
6

我目前正在研究Android的小型AR應用程序,並且面臨將Unity3d集成到活動中的問題。這些要求表明我需要能夠呈現一些Android UI - 例如菜單和操作欄 - 以及一個攝像頭視圖,當檢測到目標時,將顯示在Unity3d中創建的模型。將Unity3d視圖集成到Android活動中

我發現一個鏈接幫了我很多:Unity3d forums。其中一位用戶問我現在有同樣的問題,但從來沒有得到任何正確的答案 - 這就是爲什麼我在這裏發佈。

問題:

我有一個小Unity3d項目,本質上是一個白色立方體,我試圖在我的Android活動之一,以顯示它。當活動的onCreate()方法中沒有setContentView()方法時,模型看起來很好,但是我無法在XML文件中指定我的佈局。

當我添加setContentView()方法時,我可以看到立方體,但它很小,似乎沒有任何方法可以實際改變其大小。

XML文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/unityView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
</FrameLayout> 

活動實施的第一個版本:

public class HomeActivity extends UnityPlayerActivity { 

     UnityPlayer unityPlayer; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     } 
    } 

,並將所得截圖:enter image description here

活動實施的第二版:

public class HomeActivity extends UnityPlayerActivity { 

     UnityPlayer unityPlayer; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 

      setContentView(R.layout.activity_home); 
      unityPlayer = new UnityPlayer(this); 
      int glesMode = unityPlayer.getSettings().getInt("gles_mode", 1); 
      unityPlayer.init(glesMode, false); 

      FrameLayout layout = (FrameLayout) findViewById(R.id.unityView); 
      LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      layout.addView(unityPlayer.getView(), 0, lp); 
     } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 

     super.onWindowFocusChanged(hasFocus); 
     unityPlayer.windowFocusChanged(hasFocus); 

    } 
} 

,並將所得截圖:

enter image description here

任何人都可以向我解釋這是爲什麼,以及如何解決它?

回答

3

雖然我仍然不知道它爲什麼會這樣工作,但我找到了解決這個問題的方法。

而不是簡單地使用setContentView()onCreate(),擴展onResume(),並在該方法遞歸查看所有可用的視圖來查找UnityPlayer對象的父視圖。一旦找到,佈局和其他視圖可以被誇大並添加到該父視圖。

下面是一個代碼示例的鏈接 - 我用這個做我的應用程序的工作:https://developer.vuforia.com/resources/dev-guide/extending-unity-android-activity-and-adding-custom-views-eclipse

編輯:這是顯示我的解決方案的代碼片段。

@Override 
public void onResume() { 

    super.onResume(); 

    if (unityPlayer == null) { 

     View rootView = findViewById(android.R.id.content); 
     unityPlayer = findUnityPlayerView(rootView); 

     if (unityPlayer != null) { 

      ViewGroup unityPlayerParentView = (ViewGroup)(unityPlayer.getParent()); 

      View mainHomeView = getLayoutInflater().inflate(R.layout.activity_main, null); 
      LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      unityPlayerParentView.addView(mainHomeView, layoutParams); 

     } 
    } 
} 

private UnityPlayer findUnityPlayerView(View view) { 

    if (view instanceof UnityPlayer) { 

     return (UnityPlayer) view; 
    } 
    if (view instanceof ViewGroup) { 

     ViewGroup childrenViews = (ViewGroup) view; 

     for (int i = 0; i < childrenViews.getChildCount(); i++) { 

      UnityPlayer foundView = findUnityPlayerView(childrenViews.getChildAt(i)); 

      if (foundView != null) { 

       return foundView; 
      } 
     } 
    } 

    return null; 
} 
+0

的Unity3d論壇鏈接,你提到要你從臨時區域文件夾,當我在Unity5 運行項目中,我找不到它也告訴您如何複製文件在Eclipse中使用它。我正在使用Android Studio。 您可以提供有關如何在Unity5和Android Studio中執行相同操作的更新指南。 – Ishan