在Fragment中集成Unity

2017-1-12

突然特別感謝在我編程時出現的bug,因為有了它,我才了解到什么是谷歌上沒有的知識,或者不全面的知識,這樣我才有內容可寫,不想寫別人寫過的,因為覺得那樣浪費資源。。。只是簡單的重復別人的東西,只會增加資源冗余。昨晚遇到了一個bug,就是之前在activity中加載unity文件是可以正常顯示的,具體參考上一篇文章unity3d項目導入android studio,然后我需要在一個fragment中也加載unity文件,顯示unity場景,然而卻出現了bug.

1.問題所在:

[區別1]
 Activity 顯示Unity3d內容是 extends UnityPlayerNativeActivity
UnityPlayerNativeFragment 顯示Unity3d內容是extends Fragment
[區別2]
[2.1]在activity中
View view=mUnityPlayer.getView(); 
scan.addView(view);       //scan是顯示unity的布局
[2.2]在fragment中
protected UnityPlayer mUnityPlayer;
private static final String ARG_SECTION_NUMBER = "section_number";
public static UnityPlayerNativeFragment newInstance(int sectionNumber) 
{ 
   UnityPlayerNativeFragment fragment = new UnityPlayerNativeFragment();    
   Bundle args = new Bundle();    
   args.putInt(ARG_SECTION_NUMBER, sectionNumber);        
   fragment.setArguments(args);    
   return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,                        
Bundle savedInstanceState)
 {    
    getActivity().getWindow().takeSurface(null);       
    getActivity().setTheme(android.R.style.Theme_NoTitleBar_Fullscreen); 
    getActivity().getWindow().setFormat(PixelFormat.RGB_565);    
    mUnityPlayer = new UnityPlayer(getActivity());    
    if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))        
    getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                
    WindowManager.LayoutParams.FLAG_FULLSCREEN);    
    int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);   
    boolean trueColor8888 = false;    
    mUnityPlayer.init(glesMode, trueColor8888);    
    mUnityPlayer.windowFocusChanged(true);    
    View playerView = mUnityPlayer.getView();    
    return playerView;
}

2.寫一個具體的demo

1.android studio 2.2
2.新建工程
3.在MainActivity中添加兩個fragment

3.導入unity項目

1.將unity3d項目目錄下的libs下的jar文件復制黏貼到android studio 項目下的libs,并右擊其中一個jar,選擇add as library.
2.將unity3d項目下的assets文件復制黏貼到android studio項目下的main文件下。
3.在main文件下新建文件jniLibs,將unity3d項目libs文件里的armeabi-v7a復制到jniLibs文件下。
4.配置清單文件

4.實例代碼

在MainActivity

@Override
public void onClick(View v) 
{    switch (v.getId()){        
case R.id.scan:            
L.i(LOGTAG,"呈現Unity");            
Toast.makeText(getApplicationContext(), "加載中!",Toast.LENGTH_LONG).show();           
 clickScan();            
break;        
case R.id.me:            
L.i(LOGTAG,"個人中心");            
image03.setImageResource(R.mipmap.bottom_btn_me);            
clickMe();            
break;    
}
}
public void clickScan(){    
if(UnityPlayerNativeFragment==null)
{        
scanFragment=new UnityPlayerNativeFragment();    
}    
addOrShowFragment(getSupportFragmentManager().beginTransaction(),scanFragment);
}

在UnityPlayerNativeFragment

public class UnityPlayerNativeFragment extends Fragment {    
protected UnityPlayer mUnityPlayer;    
private static final String ARG_SECTION_NUMBER = "section_number";    
public static UnityPlayerNativeFragment newInstance(int sectionNumber) 
{        
UnityPlayerNativeFragment fragment = new UnityPlayerNativeFragment();        Bundle args = new Bundle();        
args.putInt(ARG_SECTION_NUMBER, sectionNumber);        
fragment.setArguments(args);        
return fragment;    
}    
@Override    
public View onCreateView(LayoutInflater inflater, ViewGroup container,                             
Bundle savedInstanceState) {        
getActivity().getWindow().takeSurface(null);        
getActivity().setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);        
getActivity().getWindow().setFormat(PixelFormat.RGB_565);        
mUnityPlayer = new UnityPlayer(getActivity());        
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))            
getActivity().getWindow().setFlags 
(WindowManager.LayoutParams.FLAG_FULLSCREEN,                    
WindowManager.LayoutParams.FLAG_FULLSCREEN);        
int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);        
boolean trueColor8888 = false;        
mUnityPlayer.init(glesMode, trueColor8888);        
mUnityPlayer.windowFocusChanged(true);        
View playerView = mUnityPlayer.getView();        
return playerView;    
}    
@Override    
public void onDestroy ()    
{       
 mUnityPlayer.quit();        
super.onDestroy();    
}    
@Override    
public void onPause()    
{        
super.onPause();        
mUnityPlayer.pause();    
}       
@Override   
 public void onResume()   
 {        
super.onResume();        
mUnityPlayer.resume();    
}        
@Override    
public void onConfigurationChanged(Configuration newConfig)   
 {        
super.onConfigurationChanged(newConfig);        
mUnityPlayer.configurationChanged(newConfig);   
 }    
public void onWindowFocusChanged(boolean hasFocus)   
 {        
mUnityPlayer.windowFocusChanged(hasFocus);    
}
}

基本就是這樣了。。。運行,調試,success.

參考資料
Unity
demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容