Android Studio 集成Unity 工程并相互調(diào)用

新建Unity工程

unity泛型單例腳本

SingletonUnity.cs

using UnityEngine;
public class SingletonUnity<T> : MonoBehaviour where T : MonoBehaviour
{   
    public static T instance = null;
    public virtual void Awake()
    {
        if (instance == null)
        {
            DontDestroyOnLoad(gameObject);
            instance = (T)FindObjectOfType(typeof(T));
        }
        else if (instance != null)
        {
            Destroy(gameObject);
        }
    }
}

調(diào)用Java腳本

MobPlugin .cs

using UnityEngine;

public class MobPlugin : SingletonUnity<MobPlugin>
{
#elif UNITY_ANDROID && !UNITY_EDITOR
    AndroidJavaClass jc;
    AndroidJavaObject activity;
#endif

    public void Start()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        activity.Call("SetSplashGone");
#endif
    }

    public void UnityToast(string msg)
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        activity.Call("unityToast", msg);
#endif
        Debug.Log("UnityToast:" + msg);
    }

    public void AndroidToast(string msg)
    {
        TestAndroid testAndroid = GetComponent<TestAndroid>();
        if (testAndroid!=null)
        {
            testAndroid.Toast(msg);
        }
    }
}

測試腳本

TestAndroid.cs

using UnityEngine;
using UnityEngine.UI;

public class TestAndroid : MonoBehaviour {
    public Text text;
    public void UnityToast() {
        MobPlugin.instance.UnityToast("Unity中點擊了按鈕");
    }

    public void Toast(string msg)
    {
        if (text)
        {
            text.text = msg;
        }
    }
}

簡易unity界面搭建

QQ截圖20181119155934.png

unity導出設置

包名可以隨意命名之后用不到該包名


QQ截圖20181119160236.png
QQ截圖20181119160225.png

導出后的Android工程中間件

QQ截圖20181119160358.png

新建Android工程

QQ截圖20181119152618.png

這里使用Android 8.0

因為Google play的要求


QQ截圖20181119152639.png

新建空Activity


QQ截圖20181119152651.png
QQ截圖20181119152716.png

新建一個模塊作為unity模塊供主模塊調(diào)用,讓代碼更簡潔


QQ截圖20181119154107.png
QQ截圖20181119154121.png
QQ截圖20181119154146.png
settings.gradle中要包含unity模塊
QQ截圖20181119154222.png
在app模塊添加依賴
  implementation project(':unitylib')
QQ截圖20181119154340.png

添加assets文件夾


QQ截圖20181119154439.png

添加jniLibs文件夾

QQ截圖20181119155208.png

同步代碼混淆規(guī)則配置文件


QQ截圖20181119160439.png
QQ截圖20181119160501.png

同步unitylib模塊的 gradlew


QQ截圖20181119160552.png
QQ截圖20181119160634.png

放置jar包


QQ截圖20181119160732.png

放置assets下的文件


QQ截圖20181119160805.png

放置.so文件
QQ截圖20181119160821.png
QQ截圖20181119160847.png
修改UnityPlayerActivity.java
package com.apen.unitylib;//package com.apen.uni;將之前的包名修改為庫模塊的包名

import com.unity3d.player.*;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

public class UnityPlayerActivity extends Activity
{
    protected UnityPlayer mUnityPlayer;

     /**
     *  設置父視圖
     */
    public void setView(RelativeLayout mParent){
        this.mUnityPlayer = new UnityPlayer(this);
        View mView = this.mUnityPlayer.getView();
        mParent.addView(mView);
        this.mUnityPlayer.requestFocus();
    }

....//打包后生成的代碼保留,僅刪除protected void onCreate(Bundle savedInstanceState) {}方法,為了之后繼承該activity不出錯
}

在app模塊中繼承UnityPlayerActivity并設置視圖

package com.apen.unity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.apen.unitylib.UnityPlayerActivity;


public class UnityActivity extends WebActivity {
    RelativeLayout mParent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unity);

        mParent=findViewById(R.id.UnityView);
        setView(mParent);
        findViewById(R.id.androidclick).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UnityPlayer.UnitySendMessage("TestAndroid", "Toast", "Android中點擊了按鈕");
            }
        });
    }
    public void unityToast(final String msg) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(UnityActivity.this, msg, Toast.LENGTH_LONG).show();
                    }
                });
            }
        }).start();
    }
}

視圖xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UnityActivity">
    <RelativeLayout
        android:id="@+id/UnityView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <TextView
        android:id="@+id/androidclick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TestAndroid"/>
</RelativeLayout>

配置Android 清單文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.apen.unity"
    android:installLocation="preferExternal">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true" />

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-feature android:glEsVersion="0x00020000" />
    <uses-feature android:name="android.software.leanback" android:required="false" /><!--因為該工程不適配Android TV,所以要設置這項-->
    <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
    <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
    <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
    <application
        android:allowBackup="true"
        android:name=".App"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:isGame="true"
        android:banner="@drawable/app_banner">

        <activity android:label="@string/app_name"
            android:screenOrientation="fullSensor"
            android:launchMode="singleTask"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
            android:name=".UnityActivity">
            <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>
        <meta-data android:name="unity.build-id" android:value="64375dc2-7bb1-4490-ad40-f03e6d678f1c" />
        <meta-data android:name="unity.splash-mode" android:value="0" />
        <meta-data android:name="unity.splash-enable" android:value="True" />
        <meta-data android:name="android.max_aspect" android:value="2.1" />
    </application>

</manifest>

git:https://github.com/appppppen/Unity4Android-Project.git,歡迎star

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,227評論 25 708
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,048評論 2 59
  • 今天的武漢特別冷,比昨天低了好多好多度。又一次體會到武漢這座城市的任性與傲嬌。 在宿舍里呆著煩了,明明感覺胃很撐,...
    砯zl閱讀 285評論 0 0
  • 這個世界是什么樣子的?我們又是什么樣子的?從小到大,我們從懵懵懂懂,到好奇所有,再到叛逆輕狂,然后嚷嚷著要改變世界...
    Riemann_Jin閱讀 696評論 0 10
  • 今天朋友圈里面下著好大的雪,鋪天蓋地,擁擁攘攘。我以為歌樂山也是要下雪的,但除了風和冷外,只有淅瀝的小雨點。也許我...
    張愛錢閱讀 430評論 0 0

友情鏈接更多精彩內(nèi)容