首页 > 编程知识 正文

unity镜像复制,unity添加脚本

时间:2023-05-05 03:05:15 阅读:39244 作者:3907

另一方面,一些知识点学习Unity项目需要访问安卓操作系统的功能。 例如,电量取得、wifi状态等。 Unity必须启动Android系统的BroadcastReceiver以监听状态,并在状态更新后通知Unity接口。 这需要一种相互调用Unity和Android的机制。 直观地说,这是C#和Java相互调用的方法。

有Unity和Android交互调用需求的项目必须在两个开发环境中同时进行,并创建两个项目。 在这种情况下,关于如何连接两个项目有两种方法。

Android项目生成aar/jar文件,将其复制到Unity项目中,最后使用Unity构建机制生成apk。 Unity工程将所有内容和代码导出到一个Android gradle项目中,使用Android Studio打开和开发项目,最终使用Android Studio打包apk 比较一下两者的优缺点。

Unity使用jar/aar库

Unity将导出gradle项目

Unity与安卓的依赖关系

Unity只依赖安卓库文件,只有分区清晰且需要同步的文件是库文件

安卓依赖于Unity导出的场景数据,需要同步的文件太多

开发调试速度

安卓库文件小,调试快

Unity工程大、同步慢、调试周期长

构建机制

Unity内置的Android Build机制类似于eclipse编译Android项目

安卓studio grad le

Build灵活性

如果存在较差的、无法深度定制的库依赖关系,则必须将所有依赖关系显式复制到Unity项目中

非常自由,可以使用最新的安卓构建机制

如何包装apk

单元构建机制直接打包

安卓studio软件包

这个项目使用了第一种方法。 这是因为在这个项目中Unity项目特别大,导出Unity项目的成本太大。 但是,也出现了库文件依赖关系问题,但依赖关系并不多,可以手动解决。 解决方法如下所示。

Unity要调用Android Unity的官方文档,必须通过Plugin调用Java代码,但实际上可以在不部署Plugin的情况下调用Java代码。 但是,通常需要调用的是封装库,只有在这种情况下,才能将jar或aar放入Unity项目中,并通过C#访问其内容。

jar或aar文件可以位于Unity的任何目录中,并位于Assets/Plugins/Android目录中以方便管理。

调用c#Java方法以获取Java字段

Java调用的基本原理是使用JNI调用,Unity提供了一个有用的接口。

创建对象: C#使用AndroidJavaObject类封装Java对象。 newandroidjavaobject对象相当于调用相应Java对象的构造函数。 使用C#可变参数列表,可以将任意数量的参数传递给Java对象的构造函数。 //第一个参数是Java类的完整包名称,其馀参数传递给构造方法。 androidjavaobjectjo=newandroidjavaobject (' Java.lang.string ',' some_string ' ); 调用对象方法:使用AndroidJavaObject类的Call方法。 有两个版本:通用型和非通用型。 //通用版本。 目的是指定返回值的类型inthash=jo.callint('hashcode ) )。 //处理非泛型版本中返回值为void的情况。 jo.call(amethodreturnvoid ); //String没有返回void的简单方法。 获取类。 主要用于获取静态字段和调用静态方法,常用于获取UnityPlayer。 //传入类的完整包名称androidjavaclassjc=newandroidjavaclass (' com.unity 3d.player.unity player ) ); 获取静态字段,因为没有void类型的字段。 androidjavaobjectjo=JC.getstaticandroidjavaobject (' current activity ' ); 二、项目实践环节:第一步,Unity Part :新Unity项目,实现如图用户界面:

绑定按钮的单击逻辑:

public void onClickCopy () debug.logwarning ) (unitycopy ); //注意这里的cla

ss 路径 需要跟后面 AS 工程的 JAVA 脚本要对应上!! using (AndroidJavaClass androidClass = new AndroidJavaClass("com.example.moduleb.MainActivity")) { // 这里的方法是否是static的也要注意!不是static的,用Call方法! androidClass.CallStatic("copyTextToClipboard", "test text"); }}public void onClickPaste(){ Debug.Log("unity paste "); // 注意这里的 class 路径 需要跟后面 AS 工程的 JAVA 脚本要对应上!! using (AndroidJavaClass androidClass = new AndroidJavaClass("com.example.moduleb.MainActivity")) { // 这里的方法是否是static的也要注意!不是static的,用Call方法! string s = androidClass.CallStatic<string>("getTextFromClipboard"); Debug.LogWarning("unity paste s=" + s); }}

        unity 部分暂时完成。

第二步,AS Part:

        新建个 AS 工程, no activity 就可以。

        进去之后,我们 新建一个 module :

        然后 再 src 下 新建接口java脚本:

public static void copyTextToClipboard(final String str) { Activity activity = UnityPlayer.currentActivity; activity.runOnUiThread(new Runnable() { @Override public void run() { ClipboardManager clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE); ClipData clipData = ClipData.newPlainText("data", str); clipboard.setPrimaryClip(clipData); Log.i("speedmobile", "DoCopyText text: " + str); } });}/* * 从剪贴板中获取文本 */public static String getTextFromClipboard() { Activity activity = UnityPlayer.currentActivity; ClipboardManager clipboard = (ClipboardManager)activity.getSystemService(Activity.CLIPBOARD_SERVICE); if (clipboard != null && clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { ClipData cdText = clipboard.getPrimaryClip(); ClipData.Item item = cdText.getItemAt(0); return item.getText().toString(); } return "null";}

        注意到 这里 用到的 UnityPlayerActivity 是 Unity 的库类 。这个类需要以 Library 导入到 我们这里的 AndroidTools-module 。 导入的做法是:找到 Unity的安装路径 , 搜索 classes.jar 。

        我这里的路径是 :C:Program FilesUnityHubEditor2018.4.36f1EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClassesclasses.jar

        然后拷贝到我们module - libs 文件夹内, 右键点击 classes.jar 选择 Add As Library

        这时候,回头再看我们的java脚本,已经不报错误了。

        接下来,需要导出我们当前模块 AndroidTools 为 jar 包 , 给Unity使用。

        找到 AndroidTools module 的build.gradle脚本。添加下面task语句:

bundle.gradle 示例:

plugins { id 'com.android.library'}android { compileSdk 31 defaultConfig { minSdk 21 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation files('libs\classes.jar') testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'}task clearJar(type: Delete) { delete 'build/libs/androidTools.jar'这行表示如果你已经打过一次包了,再进行打包则把原来的包删掉}task makeJar(type: Copy) { from('build/intermediates/aar_main_jar/release') //这行表示要打包的文件的路径,根据下面的内容,其实是该路径下的classes.jar into('build/娇气的小笼包/') //这行表示打包完毕后包的生成路径,也就是生成的包存在哪 include('classes.jar') //看到这行,如果你对分包有了解的话,你就可以看出来这行它只是将一些类打包了 rename ('classes.jar', 'androidTools.jar')}makeJar.dependsOn(clearJar, build)

如图:

        然后点击 左边的小箭头,运行导出语句。 执行完之后,可以看到在build/娇气的小笼包 下生成了我们需要的jar包。

        然后拷贝这个jar包 到 Unity 工程 Assets/Plugins/Android 下。

第三步,build and run!看 logcat !

success!

附上示例项目地址:

https://github.com/zengzhiwei/Unity2Android4Copy.git

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。