DragonWind

关于安卓SDK

安卓往Unity发消息

UnityPlayer.UnitySendMessage("UnityReceiver", "ReceiveMessageFromAndroid", message);

UnityReceiver是场景中的一个GameObject的名字

ReceiveMessageFromAndroid是这个GameObject挂载的MonoBehaviour的一个public方法,方法接收string参数,message是一个字符串

其实就类似Unity的SendMessage方法

双端交互数据通过string传,可以自定义协议,JSON之类,效率也还行。

Unity往安卓发消息

AndroidJavaClassCallStatic或者Call方法。

如果要返回值,能和java的对上。

Android环境搭建

package com.example.mylibrary;
import com.unity3d.player.UnityPlayer; // 引入 Unity 的类
public class SDKBridge {
    public static void logToUnity(String msg){
        UnityPlayer.UnitySendMessage("UnityReceiver", "ReceiveMessageFromAndroid", msg);
    }
    public static void echoMessage(String msg){
        logToUnity(msg);
    }
}

注意到这里import的Unity的类为什么能import呢?就是上一步dependencies加的编译时依赖。

打包aar,生成mylibrary-debug.aar文件。

Build -> AssemblyBundle

Unity环境搭建

这里以Unity6.1(6000.1.2f1)为例子,新建个项目,记得安装添加了Android依赖项。

把生成的mylibrary-debug.aar文件放到Assets/Plugins/Android目录下。

Build环境切换成Android。

在ProjectSettings下的Player下的Identification下的MinimumAPILevel的等级,要设为大于等于上一步骤在AndroidStudio中创建项目用的等级。

新建一个GameObject,名字就是UnityReceiver,挂一个Mono脚本。

新建个脚本,测试项

using UnityEngine;

public class Recv : MonoBehaviour
{
    public void ReceiveMessageFromAndroid(string msg)
    {
        Debug.Log(msg);
    }
    string m_Log="";
    private void OnGUI()
    {
        GUILayout.Label(m_Log);
    }
    private void Awake()
    {
        Application.logMessageReceived += (a, b, c) =>
        {
            m_Log += "\n" + a;
        };
    }
    void Start()
    {
        Debug.Log("Init!");
        AndroidJavaObject jc = new AndroidJavaObject("com.example.mylibrary.SDKBridge");
        jc.CallStatic("echoMessage", "echo");
    }
}

打包APK,运行,看到界面上显示Init!echo,表示成功。

在编辑器下用是没效果的,因为没有Android环境。

截屏操作

添加媒体URI变动,最新的一条是否包含截屏关键词,包含则触发事件,发回调给Unity