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);
}
}