Unity对接Android SDK

Unity和安卓的交互:

    //Unity访问安卓非静态方法
    public void CallAndroid() {
        AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        activity.Call("init");

    }

    //Unity访问安卓静态方法
    public void CallAndroidStatic() {
        AndroidJavaClass jc = new AndroidJavaClass("com.sdk.OliverInterface");
        jc.CallStatic("Login");

    }

//安卓回调Unity

 UnityPlayer.UnitySendMessage("RecevieObject", "方法名","参数");// RecevieObject Unity中接收回调的Object名字


实际操作封装:

Unity端 SDKBase(不继承Mono)、SDKMgr单例类(继承Momo)、SDKForAndroid(继承自SDKBase)、测试类Test

public class SDKBase{
    public virtual void Init() { }
    public virtual void Login() { }
    public virtual void Logout() { }
    /// <summary>
    /// 支付方法
    /// </summary>
    /// <param name="s">后期用Json代替,做解析</param>
    public virtual void Pay(string s) { }
    /// <summary>
    /// 游戏分享
    /// </summary>
    /// <param name="s">后期也是用Json代替,做解析</param>
    public virtual void GameCenter(string s) { }

}


public class OliverSDKMgr : MonoBehaviour {
    public static OliverSDKMgr mInstance;
    private SDKBase mSDKApi;
    void Awake() {
        mInstance = this;
#if UNITY_EDITOR
        mSDKApi = new SDKBase();
#elif UNITY_ANDROID
        mSDKApi = new SDKForAndroid();//继承自SDKBase
#endif

    }

    public void Init() {
        mSDKApi.Init();

    }


    public void Login()
    {
        mSDKApi.Login();

    }


    public void Logout()
    {
        mSDKApi.Logout();

    }


    public void Pay(string s)
    {
        mSDKApi.Pay(s);
    }


    public void GameCenter(string s)
    {
        mSDKApi.GameCenter(s);
    }
    public void ReceiveNotifyFromSDK(string s) {
        Debug.LogError("Unity ----------ReceiveNotifyFromSDK--------:" + s);
    }

}


public class SDKForAndroid : SDKBase {


    public override void Init()
    {
        using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) {
                jo.Call("init");
            }
        }
    }

    public override void Login()
    {
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("login");
            }
        }
    }


    public override void Logout()
    {
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("logout");
            }
        }
    }


    public override void Pay(string s)
    {
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("pay",s);
            }
        }
    }


    public override void GameCenter(string s)
    {
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("gameCenter",s);
            }
        }
    }

}


public class Test : MonoBehaviour {


    void OnGUI() { 
        if(GUI.Button(new Rect(0,0,300,100),"Init")){
            Debug.LogError("this is Unity Init");
           // CallAndroid();
            OliverSDKMgr.mInstance.Init();
        }else if(GUI.Button(new Rect(0,130,300,100),"Login")){
            Debug.LogError("this is Unity Login");
            OliverSDKMgr.mInstance.Login();();
        }else if。。。
    }

}

安卓端  ①Unity导出安卓工程OliverBase 它的libs下有一个 unity-classes.jar 可以用unity的东西(eg:回调Unity)jar包就类似于C#里的dll。   ps:OliverBase 作为 is Library

            ②OliverSDK工程依赖OliverBase工程,其中MainActivity(主要在这里边开发)继承BaseActivity(在OliverBase中)。而BaseActivity又继承自UnityPlayerNativeActivity(就是我们的主Activity,即游戏Activity)

以后对接其他SDk,则只需再建一个OtherOliverSDK,再依赖OliverBase即可。


实际操作,接Vivo的SDk

步骤:①新建一个工程(SDK方给的Demo工程导入,做修改即可),将SDK工程中src下的报名改为自己Unity中的包名(com.xxx.xxx)

②右键SDK工程选Android,然后勾选Is Library选项,Add添加OliverBase(即SDKBase)

③将SDK工程下的MainActivity继承(extends)BaseActivity

④读文档,按照文档接即可,该拷贝的代码就直接拷贝   将权限(SDK方会提供)添加进工程的res目录下的AndroidManifest文件中,其中的package也要改成自己Unity的包名,以及文件中的activity要改成自己的MainActivity

最后,打包出包:

需要拷贝到Unity中Assets/Plugins/Adroid文件夹下的内容有:①OliverBase(SDKBase)工程下的bin下的oliverbase.jar  ②OliverVivoDev工程(之前需要接入的SDKDemo工程,修改后的那个)下的bin下的olivervivodev.jar

③OliverVivoDev工程下的AndroidManifest.xml文件

④OliverVivoDev工程下的assets文件夹

⑤OliverVivoDev工程下的libs文件夹

⑥OliverVivoDev工程下的res文件夹

然后,直接Unity中Build出apk包即可。

小问题:①打包出来,安装后闪退  做优化:AndroidManifest文件中加入android:installlocation = “preferExternal”;

游戏的装载位置防止内存不够,可以装载在sd卡

②可添加一些其他权限:诸如 是否支持大、小、正常屏幕 android:smallScreens = "true"; android:normalScreens = "true";

③是否可以后台运行

④android:luanchMode = "singleTask";如果已有此任务则直接打开,没有才去新创建(提高速度)

Unity是一款常用的游戏开发引擎,而海康则是一家专注于物联网和智能安防领域的企业。对接海康SDK的主要目的是为了在Unity中实现安防监控等功能,并运用到游戏中。 对接海康SDK的第一步是导入对应的海康SDK插件。Unity提供了插件管理器,我们可以通过导入插件来扩展Unity的功能。导入好插件后,我们需要按照海康SDK提供的文档进行配置,以确保Unity能够正确地调用SDK的功能。 在对接海康SDK后,我们可以利用其提供的接口来实现监控画面的渲染。通常情况下,渲染监控画面会使用到Shader来处理图像的显示效果。Shader是Unity中用于控制如何渲染3D模型和其他图形元素的程序,我们可以编写自定义的Shader来实现特定的渲染效果。 对接海康SDK时,我们可以将其提供的图像数据传递给自定义的Shader进行渲染。在Shader中,我们可以使用海康SDK提供的纹理数据来实现实时监控画面的渲染效果,比如调整亮度、对比度、色彩等。 除了渲染监控画面,我们还可以利用海康SDK提供的其他功能来增加游戏的互动性。比如,我们可以通过SDK的人脸识别功能来实现游戏中的角色识别,或者利用SDK的语音识别功能来实现游戏中的语音交互。 总之,通过对接海康SDK和使用Shader,我们可以在Unity中实现与海康的硬件设备和功能的对接,从而为游戏增加更多的交互性和创新性。这对于开发与安防、物联网相关的游戏来说,具有重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值