Unity开发之插件---高德地图定位和地理围栏(Android)

Unity3d是一款3D游戏开发引擎,也可以开发2D游戏。

可一键式发布到多种平台,可发布到iOS,Android,Windows,macOS等。

其原理就是在底层帮开发者根据不同平台做了处理。但这并不是万能的,有时候我们需要自己来开发Unity和平台API交互的程序,即Unity插件。

下面总结开发iOS和Android插件。 Android制作Unity插件请参考:在 Unity 中使用 Android SDK ,简单有效。下面说一下集成高德定位的部分。 下载高德定位sdk,集成的版本是AMap_Location_V3.5.0_20170731.jar,将下载好的文件放置在libs目录 参考高德提供的功能示例,编写AMapHelper.java类,主要功能代码: 启动定位:

public void startLocation(String apiKey){
        AMapLocationClient.setApiKey(apiKey);

        //初始化client
        locationClient = new AMapLocationClient(Utils.getContext());
        locationOption = getDefaultOption();
        //设置定位参数
        locationClient.setLocationOption(locationOption);
        // 设置定位监听     
        locationClient.setLocationListener(locationListener);

        // 启动定位
        locationClient.startLocation();
    }

停止定位:

public void stopLocation(){
        // 停止定位
        locationClient.stopLocation();

        showLog("停止定位成功!");
    }

添加围栏及停用:

public void startGeoFence(String jsonString) throws Exception{
        initGeoFence();
        addFence(jsonString);
    }

    public void stopGeoFence(){
        if (null != fenceClient) {
            fenceClient.removeGeoFence();
        }

        try {
            Utils.getContext().unregisterReceiver(mGeoFenceReceiver);
        } 
        catch (Throwable e) {
        }
    }

回调Unity代码:

private void SendMessage(int what, String msg){
        switch(what){
        case 0:
            UnityPlayer.UnitySendMessage("AMapHelper","onLocationChanged",msg); 
            break;
        case 1:
            UnityPlayer.UnitySendMessage("AMapHelper","onFenceChanged",msg); 
            break;
        }
    }

Unity中同样定义AMapHelper类用来调用Java类,关键代码:

#elif UNITY_ANDROID
        private AndroidJavaClass jcu;
        private AndroidJavaObject jou;
        private AndroidJavaObject amapHelper;

          /// <summary>
        /// 开始定位
        /// </summary>
        public void StartLocation(string apiKey)
        {
            error = false;
            errorInfo = "";

            try
            {
                if(jcu == null){

                    jcu = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                    jou = jcu.GetStatic<AndroidJavaObject>("currentActivity");
                    amapHelper = new AndroidJavaObject("com.shuimu.plugin.AMapHelper");
                }

                amapHelper.Call("startLocation",apiKey);
            }
            catch (System.Exception ex)
            {
                UnityLibs.Debuger.Log(ex.Message);
                error = true;
                errorInfo = ex.Message;
            }
        }

        public void StopLocation()
        {
            amapHelper.Call("stopLocation");
        }


        public void StartGeoFence(string jsonString) {
            amapHelper.Call("startGeoFence", jsonString);
        }

        public void StopGeoFence() {
            amapHelper.Call("stopGeoFence");
        }

         void OnDestroy()
        {
            if(amapHelper != null)
                amapHelper.Call("deactivate");
        }

#elif UNITY_IOS

定位及围栏回调:

 //围栏状态更新
        void onFenceChanged(string msg) {
            int status = int.Parse(msg);
            fenceStatus = (GeoFence)status;

            if (fenceChanged != null)
            {
                fenceChanged();
            }
        }

        //定位更新
        void onLocationChanged(string msg) {
            string\[\] msgs = msg.Split(';');
            if (msgs\[0\] == "0")
            {
                locationInfo.Latitude = double.Parse(msgs\[1\]);
                locationInfo.Longitude = double.Parse(msgs\[2\]);
            }
            else {
                error = false;
                errorInfo = "定位失败";
            }

            if (locationChanged != null)
            {
                locationChanged();
            }
        }
    }

使用方法: 1.在场景中AMapHelper附加到一空对象 2.初始化及设置回调:

amapHelper.locationChanged += locationChanged;
amapHelper.StartLocation(GlobalDef.AMap_ApiKey);

下一篇介绍iOS插件。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com

文章标题:Unity开发之插件---高德地图定位和地理围栏(Android)

文章字数:581

本文作者:max-xue

发布时间:2018-01-03, 15:47:14

最后更新:2019-11-09, 21:47:44

原始链接:http://blog.le-more.com/2018/01/03/u3d/e5-9c-b0-e7-90-86-e5/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏