草庐IT

android工程集成unity项目及两者之间相互通信

码上就成 2024-02-13 原文

本文讲详细介绍android工程集成unity项目,及达成android和unity工程之间相互调用的实现方案
主要分成两部分 1:集成2:通信

课前准备

1.准备安卓项目

相信会看这篇文章的同学都有一定的安卓基础了,as创建一个空工程备用
然后准备一个java接口类备用,这个接口类可以在先在as里创建好,

public class   AndroidUnityBridge {
 private static final String TAG = "AndroidUnityBridge";
 private UnityInterface unityInterface;
 public static AndroidUnityBridge instance;
 public static AndroidUnityBridge GetInstance(){
      if (instance == null){
           instance = new AndroidUnityBridge();
      }
      return instance;
 }

 public void setMsg(String s){
      Log.i(TAG, "setMsg: "+ s);

      if (unityInterface!=null){
           UnityPlayer.UnitySendMessage("Cube", "setString", s+  unityInterface.setFuntion("first param", "second param"));
      }
 }

 public void setUnityInterface(UnityInterface unityInterface) {
      this.unityInterface = unityInterface;
 }

 public String getStrings(){
      if (unityInterface !=null){
           return unityInterface.setFuntion("fisrt", " second");
      }
      return "null";
 }

}

配置好ndk环境

添加unityStreamingAssets配置

unityStreamingAssets=.unity3d

在strings.xml配置需要的字符串

	<string name="game_view_content_description">Game view</string>

不配置会报错

2.准备unity项目

下载安装unity请找相关攻略,这里不展开介绍,启动unity创建一个空的项目,然后创建一个正方体

然后创建一个脚本文件添加到cube上

脚本内容如下

很简单,写了几个测试方法

这里注意几点,首先,unity里的方法名要和android里的对应,另外实现类的路径要和android里的对应
比如这里的base(“com.unity.mynativeapp.UnityInterface”)
base里的内容是android里定义的接口的路径

好,到这里我们的准备工作就做完了

导出unity工程集成包

打开unity工程,打开build settings 窗口,切换到android platform,勾选export project
点击export 等待导出工程


等待片刻,导出的工程目录包含一个启动工程和一个unitylibrary

我们只要unity library就可以了

集成unity Library到android工程

打开android studio ,选择导入module,把unity Library导入到android工程,同时完成依赖设置

为了让主工程能用到library里的jar 需要在library的gradle里修改下设置

改为 api

或者

这样在app工程里就可以访问UnityPlayerActivity了

相互通信

首先需要建立通信连接,这里的方式是,安卓端写接口,unity实现接口,unity使用的地方初始化AndroidUnityBridge,并设置UnityInterface


unity调用android的方法,先初始化安卓端定义的类,然后拿着类去调用对应的方法名,如上

android调用unity的方法,直接拿着android端定义的接口类去调用

技巧

unity导出的工程里就只有UnityPlayerActivity一个类
里面有一个UnityPlayer unity工程画面就是这个对象

我们可以直接用UnityPlayer去当view使用,因为UnityPlayer继承的

但是注意,要在对应的activity里调用UnityPlayer的生命周期
onCreate 里调用

让界面显示unity画面最主要是要重写 onResume 和 onWindowFocusChanged 方法,
其他的生命周期最好都要掉一下,参考UnityPlayerActivity里的写法

注意:

有关android工程集成unity项目及两者之间相互通信的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  8. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

随机推荐