跳至主要內容

将 unity 嵌入 cocos(安卓)

muzzik大约 2 分钟文章CocosCreatorUnityAndroid

使用配置

unity 2021.3.20f1c1
cocos creator 3.6.1

###备注:

  • unity 打包依赖 sdk,ndk,il2cpp 需要提前使用 UnityHub 下载

接入步骤

  • 导出 unity 安卓项目

  • 将导出的 unity 安卓项目中的 unityLibrary 拷贝到 cocos 安卓项目根目录下

  • unity 安卓项目根目录\launcher\src\main\res 拷贝到 cocos项目根目录\native\engine\android\res,选择覆盖

  • cocos 安卓项目根目录\unityLibrary\libs\unity-classes.jar 解压缩删除 com\google 文件夹后再压缩为 unity-classes.jar

  • settings.gradle 内增加 include,project('')

  • build.gradle(Module)修改

  • build.gradle(Project)修改

  • 在 cocos 安卓项目的 AndroidManifest 中修改 unityActivity 为单独进程,防止退出 unity 结束主进程

  • 添加原生跳转方法

  • 同步模块 ndk,sdk 版本设置

问题解决

  • 安装后出现两个图标,删除蓝色区域代码

  • 进入 Unity 切后台旋转屏幕 activity 被重载,同步 unity 的 activity 属性

  • 取消 activity 跳转动画,修改 android:theme

  • activity 透明背景导致残留上个 activity 的画面,修改 unity 场景内摄像机的清除标志和背景,初始的应该是透明的,所以能看到后面的 activity

示例代码

AppActivity.java


public class AppActivity extends CocosActivity {
    private static AppActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 初始化单例
        AppActivity.instance = this;
    }

    public static AppActivity getInstance() {
        return instance;
    }

    public static void jumpToUnity() {
        // 启动 unity activity
        instance.startActivity(new Intent(instance, UnityActivity.class));
    }
}

UnityActivity.java

public class UnityActivity extends UnityPlayerActivity {
    private static UnityActivity instance;

    public static UnityActivity getInstance() {
        return instance;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 初始化单例
        instance = this;
    }

    public void jumpToCocos() {
        instance.startActivity(new Intent(instance, AppActivity.class));
    }
}

cocos 跳 unity 代码

buttonJumpToUnity(): void {
	cc.native.reflection.callStaticMethod(
		"com/cocos/game/AppActivity",
		"jumpToUnity",
		"()V"
	)
}

unity 跳 cocos 代码

public void buttonJumpToCocos() {
    // UnityActivity 类的全路径
    string unityActivityClassName = "com.cocos.game.UnityActivity";
    // 创建 UnityActivity 对象
    AndroidJavaClass unityActivityClass = new AndroidJavaClass(unityActivityClassName);
    AndroidJavaObject unityActivity = unityActivityClass.CallStatic<AndroidJavaObject>("getInstance");
    // 调用 UnityActivity 对象的 jumpToCocos 方法
    unityActivity.Call("jumpToCocos");
}

未解决问题

  • 进入 unity 时需要停止 cocosActivity 渲染(减少性能浪费)
    如果你把 unityActivity 设置为半透明就能看到 cocosActivity 还在渲染

📣 觉得很赞?分享给你的朋友吧!