アンドロイド/ユニティ・ブラザーズ - 両側統合インタラクティブガイドを完了

これは非常に、非常に長い話です! - 子供ゴマの作成

始まります

送信元アドレス:GitHubの

この記事の目的は、この論文の完了後にAndroidのユニティエンドに統合され、あなたはそれを行うことができます

  1. 任意のレイアウトユニティの3Dシーンをロードするには、Android
  2. いずれかの操作ボタンのレイアウト/ 3Dオブジェクト(スケール、回転、等)
  3. 互いにメッセージング(I Diaoのあなた、私Diaoのあなた)
  4. ユニティでシーンの切り替えが無料
  5. ダイナミックロードSDカード、携帯電話の3Dリソースは、かつてどこにでも使用して開発します。
  6. 白と顔に力にロード

番号[パブリック]氏は、空の名前

物語のトピック

主なタスクは、(すでに通信および以下の説明では、動的ローディングに関して、3Dの処理を行う)ユニティプロジェクトの導出します

番号[パブリック]氏は、空の名前

黒板をノック、輸出プロジェクトに焦点をチェックする必要があり、その後、輸出の静的およびその他の輸出品目の下をクリックしてください。

番号[パブリック]氏は、空の名前

ただアンドロイドStudioプロジェクト構造(PS:もともと)として、身近な感覚をエクスポートした後の構造オープンスタジオプロジェクトのインポートが遅く、ゆっくりとお茶に行き、案内することができる初めてmoudleの形でアンドロイド。操作の成功の後に重要です。ただ、インポートファイルbuild.gradleを開き、最初はスタジオバージョンと一致Gradleの修正版です。

依存関係{
    クラスパス 'com.android.tools.build:gradle:3.2.0' 
}
私は推奨値よりも低くない、3.2のAndroidメーカーでした。
あなたは見つけることができますまた、ダウン
プラグインを適用する:「com.android.application」

変更

プラグインを適用する:「com.android.library」

因为我们要以library的形式集成,接着再往下面走就是熟悉的sdkVsersion了,保持和你的anroid项目一致。还有个applicationId,删掉这个

有的项目遇见UnityAds.aar文件,不影响。其他修改以及遇到的一些坑不再赘述,有问题可以留言。我的如下:

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}
apply plugin: 'com.android.library'
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}
android {
    compileSdkVersion 29
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 29
        ndk {
            abiFilters 'armeabi-v7a', 'x86'
        }
        versionCode 1
        versionName '1.0'
    }
    lintOptions {
        abortOnError false
    }
    aaptOptions {
        noCompress = ['.unity3d', '.ress', '.resource', '.obb']
    }
    buildTypes {
        debug {
            minifyEnabled false
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'
            jniDebuggable true
        }
        release {
            minifyEnabled false
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'
            signingConfig signingConfigs.debug
        }
    }
    packagingOptions {
        doNotStrip '*/armeabi-v7a/*.so'
        doNotStrip '*/x86/*.so'
    }
}

接着打开Unity项目的清单文件AndroidManifest.xml,删减application节点,删除intent-filter节点,activity增加内容process(解决某某问题)

<application
    //删减其他
    android:banner="@drawable/app_banner"
    android:isGame="true">
    <activity
        .....
        //删除下面两行-否则造成桌面两个icon
        //android:label="@string/app_name"
        //android:launchMode="singleTask"
        //增加这行
        android:process="e.unity3d">
        //删掉intent-filter
        <!--<intent-filter>-->
            <!--<action android:name="android.intent.action.MAIN" />-->
            <!--<category android:name="android.intent.category.LAUNCHER" />-->
            <!--<category android:name="android.intent.category.LEANBACK_LAUNCHER" />-->
        <!--</intent-filter>-->
        <meta-data
            android:name="unityplayer.UnityActivity"
            android:value="true" />
    </activity>
 ......

至此,配置完成,已经可以玩了。

但为了玩的顺畅,我们再增加一个自定义控件(1.用来解决kill问题 2.增强自己的扩展性)。自定义一个java文件集成UnityPlayer(核心关键类)

番号[パブリック]氏は、空の名前

public class MUnityPlayer extends UnityPlayer {
    public MUnityPlayer(Context context) {
        super(context);
    }
    @Override
    protected void kill() {
        //super.kill();
        //unity默认一些返回操作等会直接kill掉进程,覆写kill方法,去掉super.kill, 不让他kill
    }
}

配置完成,点击菜单栏的Build,Rebuild Project unity的lib项目中生成aar文件

番号[パブリック]氏は、空の名前番号[パブリック]氏は、空の名前

Unity导出的项目配置完成,配置自己的Android项目,首先将几个lib......so复制到你自己的项目jniLibs中。

然后在你需要集成的项目build文件中

implementation(name: 'XingFeiUnity', ext: 'aar')
接着将aar复制的你的项目libs文件下,记得 重命名删除后面的“-debug”,否则会出现找不到类的问题。

一波骚操作搞定,跑起来已经基本可以了。但是这就结束了吗?不可能,骚起来我们就停不下来。

布局渲染

我们需要在任意布局加载3d,怎么个任意法?就是找个view来addview 既不影响3d 还有android原生界面

//xml布局
<LinearLayout
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="50dp"
        android:orientation="vertical" />

//java文件
mLinear.removeAllViews();
mLinear.addView(mUnityPlayer.getView());
mUnityPlayer.requestFocus();

操作效果请看图片,全部具体代码的话 就直接放到Github

番号[パブリック]氏は、空の名前

通信交互

Android调用Unity

//参数二是 Unity中的方法名   参数一是哪个物体挂在了这个C#脚本  参数三 字符串
UnityPlayer.UnitySendMessage("Main Camera", "AndroidCallUnity", "");

番号[パブリック]氏は、空の名前

Unity调用Android 仔细看注释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Manager : MonoBehaviour
{
    private AndroidJavaObject m_androidObj = null;
    public GameObject diqiu;

    void Start()
    {
        //注意-情况不同 com.unity3d.player.UnityPlayer  可能不同,可参考其他博主
        AndroidJavaClass androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        m_androidObj = androidClass.GetStatic<AndroidJavaObject>("currentActivity");
        diqiu.SetActive(false);
    }

    //Unity中的某个物体出发此事件
    public void UnityCallAndroid()
    {
        Debug.Log("调用方法");
        if (m_androidObj != null)
        {
            Debug.Log("调用方法进来");
            // 第一个参数是android里面java代码的方法名,第二个是携带的字符串参数
            m_androidObj.Call("CallAndroid", "我是Unity,我给你发消息了");
        }
    }

    //Android调用Unity-方法名一定要注意
    public void AndroidCallUnity(string json)
    {
        if (diqiu.activeInHierarchy)
        {
            diqiu.SetActive(false);
        }
        else
        {
            diqiu.SetActive(true);
        }
    }
}

场景切换

  • Unity内部自己去处理,就跟玩游戏一样,让Unity开发自己去做
  • andorid触发,unity换场景,这个借助上面说的消息通信来实现
  • 这还有一个技巧,如果资源不是很多且在一个场景的话,可以让Unity一次直接渲染出来存在字典里,然后想显示哪个Android给Unity发消息,Unity根据订好的消息,展示不同的内容,这个好处就是切换展示速度极快。重点处理一下刚启动的时候的耗时即可。

动态资源

态加载资源的问题,因篇幅有限,咱先只提供个思路,Unity支持读取android设备的存储文件,让他们处理即可,然后android发消息告诉他们地址即可

// 参数一是Unity中的物体名称,参数二Unity中的方法名  参数三路径字符串
UnityPlayer.UnitySendMessage("AndriodMethodMgr", "CallUnitySetPath", Environment.getExternalStorageDirectory() + "");

啊哈,到这基本就结束了。快了又开心。

坑中带坑

为了愉快的装逼,最好还是看一看遇到的这些问题,能至少省几天时间。

1. 混淆问题,如果你开启了混淆,切记 切记,把混淆添加进入,这个大坑耽误我好久啊

2. 如果模型在unity中没问题,在android端穿帮,可以看看发布质量,将android的设置成高的

番号[パブリック]氏は、空の名前
3. 如果反复执行的模型动画不对,怎么不对?举例心脏跳动,这是非常注重动画的衔接的,如果衔接时间不对会造成心脏动画的抖动,这会非常的明显。

可以看动画的setting 退出时间,退出时间是比例(如下图),1代表全部动画,0.5代表动画使劲按的一般。过度时间前后动画重叠(好像默认.95?)  可以改成0,如图设置

番号[パブリック]氏は、空の名前

4.次いで、水平方向および垂直方向の画面のAPK APKが、効果なしのアプリケーションに統合、Unityがセットリードを解除され、宣伝の方向にUnityの場合、他の設定セットをエクスポート

5.アクセス許可の問題は、それがプロジェクトがアンドロイドをエクスポートしますと言う、このプロジェクトファイルAndroidManifestを見て、あなたは特権があることがわかります。

そのようなあなたのアンドロイドAプロジェクトとして、この時間はあなたが私たちが見てみたいものではありませんAへのアクセス権を持っていない最後のAPKで、その結果、合併を統合したときに、このプロジェクトは、許可ユニティAを持っていないエクスポートする権限を持っていることに注意してください。

したがって、この問題を解決するために非常に簡単です、我々はマニフェストファイルのパーミッションの二つは、一貫してああ心に留めておく、あるいは泣いする方法がわからないことができています。

6.未解決の問題があり、アドバイスのおかげでそれ、友人のノウハウを置きます。

オブジェクトのアニメーションでは、いくつかのAndroidデバイス、パフォーマンスアニメーションの旅が、いくつかのケースでアニメーション鼓動表示されます、私は進歩としてジャンプすることをプログレスバーのテレビのように感じます。

エンディング

私は、彼らが膝に来たので、ある依頼するので、多くの質問を知っている、なぜ最後に、質問しません。

番号[パブリック]氏は、空の名前

おすすめ

転載: www.cnblogs.com/zhimalier/p/12187574.html
おすすめ