ANDROID嵌入式应用Unity3D视图(画廊3D模型) (2)

在关联Android时。想拿到UnityPlay以及相关类的jar包能够从以下的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin目录下有一个classes.jar的jar文件,它就是我们想要的。

而在bin同文件夹下有一个src文件,点击到最后有3个类,各自是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。

前两个打开个后仅仅有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中竟然有代码,并且我预计这应该是UnityPlayerNativeActivity的源代码。

因为关于UnityPlay的资料我仅仅找到这么一个。所以我把UnityPlayerNativeActivity中的代码都贴出来,假设我注解有不正确的地方希望大家指正。

/** * UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity * 而UnityPlayerNativeActivity继承自NativeActivity * 在该类里定义了一些和ANDROID生命周期同样的回调方法,留给自己定义的Activity子类重写。

*/ public class UnityPlayerNativeActivity extends NativeActivity { //UnityPlayer的引用,而且我们不能改变这个引用变量的名字。它被native code所引用 protected UnityPlayer mUnityPlayer; protected void onCreate (Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); // 设置显示窗体參数 getWindow().takeSurface(null); setTheme(android.R.style.Theme_NoTitleBar_Fullscreen); getWindow().setFormat(PixelFormat.RGB_565); // 创建一个UnityPlayer对象。并赋值给全局的引用变量 mUnityPlayer = new UnityPlayer(this); //为UnityPlayer设置一些參数 if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true)) getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1); boolean trueColor8888 = false; // UnityPlayer.init()方法须要在将view附加到layout之前调用。它将会调用native code mUnityPlayer.init(glesMode, trueColor8888); // 从UnityPlayer中获取到Unity的View视图 View playerView = mUnityPlayer.getView(); // 将Unity视图载入到根视图上 setContentView(playerView); // 使Unity视图获取焦点 playerView.requestFocus(); } protected void onDestroy () { // 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code mUnityPlayer.quit(); super.onDestroy(); } // 以下几个方法都是ANDROID相关回调方法。确保在ANDROID运行对应方法时UnityPlayer也需调用对应方法 protected void onPause() { super.onPause(); mUnityPlayer.pause(); } protected void onResume() { super.onResume(); mUnityPlayer.resume(); } public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mUnityPlayer.windowFocusChanged(hasFocus); } public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE) return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event); return super.dispatchKeyEvent(event); } }

看完这个类后就知道了为什么在自己定义的Activity中继承了UnityPlayerActivity等类以后。仅仅要重写了onCreate并调用super.onCreate()方法后不须要不论什么其它的代码就会自己主动的显示出Unity3D的视图。

由于初始化Unity视图的代码都在UnityPlayerNativeActivity父类中实现了。

ANDROID端代码:

在写ANDROID代码的时候,一定要导入Unity3D提供给我们的jar包。jar包的位置我在上面说了。引入jar包增加到buildpath中这些最主要的我就不多说了。

要想和Unity交互,我们就不能继承ANDROID提供给我们的Activity,我们须要继承刚才jar包中引入的Unity提供的Activity类,一共同拥有这么3个:

UnityPlayerActivity。UnityPlayerProxyActivity,UnityPlayerNativeActivity。详细差别不知道,由于没有文档,没有API。没有源代码(这里再次歧视一下)。

刚才我们看过UnityPlayerNativeActivity的代码(尽管非常短,但我认为这个就是源代码)。知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子类,并且终于父类为NativeActivity。所以我们继承Unity提供的最外层的子类是最好的选择。我这里选择的是UnityPlayerActivity,由于名字最简单,认为该封装的都应该封装好了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzydjx.html