问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

unity项目如何导入android项目中成为安卓项目中的一部分

发布网友 发布时间:2022-05-01 08:10

我来回答

1个回答

热心网友 时间:2022-06-26 13:39

 1.Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)

  2.Unity3D端代码要在Unity中开发

  3.Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。

  4.将Android端代码编译成jar文件以插件形式放入到Unity端中

  5.在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行

  本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。

  UnityPlay:

  在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。

  个人理解UnityPlay是个Unity提供给外部交互的一个接口类。

  为什么是“个人理解”?这我不得不爆粗口了,*官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。

  在关联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,因为名字最简单,觉得该封装的都应该封装好了。

  public class MainActivity extends UnityPlayerActivity {

  private Button topButton;
  private Button bottomButton;

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

  // 设置test为我们的根布局
  setContentView(R.layout.test);

  // 通过刚才的源码分析,知道mUnityPlayer为一个全局的引用变量,而且已经在父类中设置好了,所以直接拿来用就可以了
  View playerView = mUnityPlayer.getView();
  // 将Unity的视图添加到我们为其准备的父容器中
  LinearLayout ll = (LinearLayout) findViewById(R.id.unityViewLyaout);
  ll.addView(playerView);

  // 上面的button设置*
  topButton = (Button) findViewById(R.id.topButton);
  topButton.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View v) {
  //发送消息给Unity端,该函数第一个参数为接受消息的类对象,第二个该类对象用接受消息的方法,第三个参数为传递的消息
  //所以下面的意思就为:调用Main Camera下面的Previous方法,传送的消息为空
  UnityPlayer.UnitySendMessage("Main Camera","Previous","");
  }
  });

  // 为下面的button设置*
  bottomButton = (Button) findViewById(R.id.bottomBtn);
  bottomButton.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View v) {
  //调用Main Camera下面的Next方法,传送的消息为空
  UnityPlayer.UnitySendMessage("Main Camera","Next","");
  }
  });
  }
  }
  最后看一下Android端的布局文件,布局很简单,上下各有一个button按钮,两个按钮中间是Unity的视图。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 清明节是法定假吗 糯米红色染料放几天还有用吗? 清明节法定节假日里有吗 打电话公安局报案,举报人身份会被泄露吗 打电话报警,警察会透漏我的电话号码吗? 打电话公安局报案,举报人身份会被泄露吗? 打电话报警会留案底吗 请问有什么软件能把面部较为模糊的照片,弄得来清晰吗? 为什么清明节要放三天假 证件照怎么拍才能拍出面部清晰又饱满 用手机拍照如何使面部清晰 为什么我煮的奶茶出来颜色是红的, 而别人煮出来的颜色是白的呢 谁有捷荣港式奶茶粉的比例给个好点的来谢谢! 美食推荐怎么写(关于奶茶的) 台湾产人参乌龙是否存在“残留问题”? 请介绍下麻辣蕃茄牛肉面的推荐做法? 开个奶茶店需要准备哪些机器和设施? 煮一大锅奶茶是在怎么煮 港式奶茶不对味 有谁知道,丝袜奶茶为什么叫丝袜奶茶么 给派出所打电话算报警吗 鱼缸能否加小苏打? 有没有高手在人间?像素低的照片调面部清晰 五彩糯米饭染料会不会坏? 鱼缸加什么容易养出硝化细菌? 跪求胡歌“亦庄亦谐”的,面部高清全图! 给110打电话报警 110不出现场 造成严重后果该咋办? 有没有那种图片,就是一半是正常的人脸,另一半是很恐怖的脸。求高清图 谢谢 录入面部识别系统需要提供高清正面照片是真的还是假的? 怎么使佳能60D单反录视频人脸清晰? 报警立案打电话可以么 如果糯米染料和面粉混合会不会对身体不好? 梦见去世的爷爷 5.1去澳门玩了,昨天晚上很清晰的梦到和爷爷去澳门玩,但是爷爷身体不好,玩的不开心 如果骗子打电话报警了我没有告诉骗子的位置*回到我们家来吗? 报案可以打电话吗 unity3d怎么打包android 报案需要本人亲自去吗还是打电话就可以 为什么使用枫叶制作黑色糯米饭染料时放入铁器可以使黑色更黑? 如何锻炼使脸部轮廓更清晰? unity 和android studio之间的通信怎么解决