Android Studio 集成Unity 工程并相互调用

新建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);
        }
    }
}

调用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模块供主模块调用,让代码更简洁


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

同步代码混淆规则配置文件


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,431评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,691评论 2 59
  • 今天的武汉特别冷,比昨天低了好多好多度。又一次体会到武汉这座城市的任性与傲娇。 在宿舍里呆着烦了,明明感觉胃很撑,...
    砯zl阅读 176评论 0 0
  • 这个世界是什么样子的?我们又是什么样子的?从小到大,我们从懵懵懂懂,到好奇所有,再到叛逆轻狂,然后嚷嚷着要改变世界...
    Riemann_Jin阅读 604评论 0 10
  • 今天朋友圈里面下着好大的雪,铺天盖地,拥拥攘攘。我以为歌乐山也是要下雪的,但除了风和冷外,只有淅沥的小雨点。也许我...
    张爱钱阅读 338评论 0 0