Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

非淡泊无以明志,非宁静无以致远。这篇文章主要讲述Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作相关的知识,希望能为你提供帮助。
刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下
废话不多说
先上效果图
获取定位并根据手机朝向显示周边信息

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
           
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

使用的Unity版本为5.5,Androad Studio 2.3.1
接下来开始讲具体操作
首先是Androad Studio的基本配置

1.创建工程,空白的就行,反正也用不到界面布局
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

等待创建完成
 
2.新建库模块:
切换到Project视图
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

右击你的项目 新建一个库模块-用来负责与Unity交互
当然你也可以不选择新建库模块 直接在原生app模块进行操作
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

选择android Library
 
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

等待生成完成
你会看到多出来的
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

3.创建MainActivity:我们新建的library中没有启动这个模块的java类 所以需要手动创建一个
切换到Android视窗下 选中此文件右键创建
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

4.删除布局文件activity_main
布局文件是用来管理Android界面布局的,我们并不需要,所以将它删除,防止发生一些没必要的错误
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

5.修改配置文件:AndroidManifest
为了能够正常发布 需要将AndroidManifest进行一些修改
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

 
在这中间插入启动Activity的配置
 
 
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

< activity android:name=".MainActivity"> < intent-filter> < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> < /intent-filter> < /activity>

  到这里基本配置就完了
然后进行测试点击这个
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

或许你会发现报错了 原因是我们在创建MainActivity的时候他自动引用了布局文件 所以这里应该将这一行删除
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

然后再次更新 成功
到这里基本配置以及完成
 
引入Unity与高德地图的包
 
下载高德地图包 这里有个定制选你要用的功能下载就好 这里我用到的是定位和搜索
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

 
  将下载好的包拖入libs中
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

接下来是Unity的包
新建Unity工程
发布平台改Android 
设置package name与你新建的library库一致
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

然后发布系统ADT 导出
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

  在libs中找到
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

复制进Android Sturio中的libs
选中两个包Add As Library
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

选library工程 OK
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

等待加载完成
到这里引入包的操作已经完成
 
更改MainActivity并发布
主要内容为
获取当前定位信息
获取查询指定字符串周边信息
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
1 package com.example.autlibrary; 2 3 import android.os.Bundle; 4 import android.util.Log; 5 import android.widget.Toast; 6 import com.amap.api.location.AMapLocation; 7 import com.amap.api.location.AMapLocationClient; 8 import com.amap.api.location.AMapLocationClientOption; 9 import com.amap.api.location.AMapLocationListener; 10 import com.amap.api.services.core.LatLonPoint; 11 import com.amap.api.services.core.PoiItem; 12 import com.amap.api.services.poisearch.PoiResult; 13 import com.amap.api.services.poisearch.PoiSearch; 14 import com.unity3d.player.UnityPlayerActivity; 15 16 public class MainActivity 17extends UnityPlayerActivity 18implements PoiSearch.OnPoiSearchListener 19 { 20public AMapLocationClient mLocationClient = null; 21public AMapLocationClientOption mLocationOption = null; 22private String LocationInfo; 23private String strRerurnInfo; 24private PoiSearch.Query query; 25private PoiResult poir; 26private double Latitude; 27private double Longitude; 28private boolean bolIsPoi = false; 29 30protected void onCreate(Bundle savedInstanceState) 31{ 32super.onCreate(savedInstanceState); 33} 34//获取定位信息 35public String GetInfo() 36{ 37startLocation(); 38this.bolIsPoi = true; 39return this.LocationInfo; 40} 41//获取周边POI信息 42public String GetPoi(String content, String val, int index) 43{ 44startLocation(); 45search(content, val, index); 46return this.strRerurnInfo; 47} 48 49protected void onStart() 50{ 51super.onStart(); 52} 53 54private void startLocation() 55{ 56this.mLocationClient = new AMapLocationClient(getApplicationContext()); 57this.mLocationClient.setLocationListener(this.mLocationListener); 58this.mLocationOption = new AMapLocationClientOption(); 59this.mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); 60this.mLocationOption.setInterval(2000L); 61this.mLocationClient.setLocationOption(this.mLocationOption); 62this.mLocationClient.startLocation(); 63} 64 65//三个参数分别为搜索字符串、搜索类型、查询第几页 66//前两个参数选其一 67//如:酒店、""、1 68//第二个参数为poi搜索类型: 69//汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务| 70// 医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务| 71// 交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施 72public void search(String content, String val, int index) 73{ 74if (this.bolIsPoi) { 75if (content == null) 76{ 77Toast.makeText(this, "输入为空", Toast.LENGTH_SHORT).show(); 78} 79else 80{ 81this.query = new PoiSearch.Query(content, val, ""); 82this.query.setPageSize(30); 83this.query.setPageNum(index); 84PoiSearch poiSearch = new PoiSearch(this, this.query); 85if ((this.Latitude != 0.0D) & & (this.Longitude != 0.0D)) 86{ 87poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(this.Latitude, this.Longitude), 6000)); 88 89poiSearch.setOnPoiSearchListener(this); 90poiSearch.searchPOIAsyn(); 91} 92else 93{ 94Toast.makeText(this, "定位失败", Toast.LENGTH_SHORT).show(); 95} 96} 97} 98} 99 100public void onPoiSearched(PoiResult result, int code) 101{ 102this.bolIsPoi = false; 103System.out.println("Result" + (result.getPois().get(0)).getLatLonPoint()); 104System.out.println("Code" + code); 105this.poir = result; 106StringBuffer sb = new StringBuffer(256); 107for (int j = 0; j < this.poir.getPois().size(); j++) 108{ 109sb.append("\\n名字:"); 110sb.append((this.poir.getPois().get(j)).getTitle()); 111sb.append("\\n> 地址:"); 112sb.append((this.poir.getPois().get(j)).getSnippet()); 113sb.append("\\n> 距离:"); 114sb.append((this.poir.getPois().get(j)).getDistance()); 115} 116this.strRerurnInfo = sb.toString(); 117} 118 119@Override 120public void onPoiItemSearched(PoiItem poiItem, int i) { 121 122} 123 124public AMapLocationListener mLocationListener = new AMapLocationListener() { 125@Override 126public void onLocationChanged(AMapLocation location) { 127if (location != null) { 128if (location.getErrorCode() == 0) { 129//获取坐标信息 130Latitude = location.getLatitude(); 131Longitude = location.getLongitude(); 132 133StringBuffer sb = new StringBuffer(256); 134sb.append("时间: " + location.getTime()); 135sb.append("\\n纬度:" + location.getLatitude()); 136sb.append("\\n经度:" + location.getLongitude()); 137sb.append("\\n精度:" + location.getAccuracy()); 138sb.append("\\n地址:" + location.getAddress()); 139sb.append("\\n国家信息:" + location.getCountry()); 140sb.append("\\n省信息:" + location.getProvince()); 141sb.append("\\n城市信息:" + location.getCity()); 142sb.append("\\n城区信息:" + location.getDistrict()); 143sb.append("\\n街道信息:" + location.getStreet()); 144sb.append("\\n街道门牌号信息:" + location.getStreetNum()); 145sb.append("\\n城市编码:" + location.getCityCode()); 146sb.append("\\n地区编码:" + location.getAdCode()); 147sb.append("\\n定位点AOI信息:" + location.getAoiName()); 148LocationInfo = sb.toString(); 149}else { 150Log.e("AmapError","location Error, ErrCode:" 151+ location.getErrorCode() + ", errInfo:" 152+ location.getErrorInfo()); 153} 154} 155} 156}; 157 }

MainActivity 
修改完MainActivity 无错误的话 就可以发布了
发布到library库中
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

然后你在
“你的工程目录”\\autlibrary\\build\\intermediates\\bundles\\debug中会有这些
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

右键Show in Exploer   并在文件夹中找到他们
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

这样就发布成功了
 
与Unity间的交互
上一步我们导出了工程包
我们需要将它修改为Unity可用的工程
 
复制classes.jar
粘贴到libs 
删除libs中的unity-classes.jar
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

-
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

-
 
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

这样的话就修改成功了   然后我们将它导入Unity
复制libs和res文件夹到Unity
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

需要创建Plugins和Android文件夹 复制过后是这样的关系
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

 
这样就成功导入进了Unity
配置AndroidManifest.Xml文件,并创建C#脚本
不知道你还记不记得我们在Unity中导出的包  找到它!我们需要里面的Xml文件
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

将它复制到\\Assets\\Plugins\\Android下
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

 
接着就要对它进行修改了
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
1 < ?xml version="1.0" encoding="utf-8"?> 2 < manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.autlibrary" xmlns:tools="http://schemas.android.com/tools" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> 3< supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> 4< application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner"> 5< meta-data 6android:name="com.amap.api.v2.apikey" 7android:value="https://www.songbingjia.com/android/64c821ae174ab7429fa45535d01f20ae"/> 8< activity 9android:label="@string/app_name" android:screenOrientation="fullSensor" 10android:launchMode="singleTask" 11android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" 12android:name="com.example.autlibrary.MainActivity"> 13< service android:name="com.amap.api.location.APSService" > < /service> 14< intent-filter> 15< action android:name="android.intent.action.MAIN" /> 16< category android:name="android.intent.category.LAUNCHER" /> 17< category android:name="android.intent.category.LEANBACK_LAUNCHER" /> 18< /intent-filter> 19< meta-data android:name="unityplayer.UnityActivity" android:value="https://www.songbingjia.com/android/true" /> 20< /activity> 21< /application> 22< uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25" /> 23< uses-feature android:glEsVersion="0x00020000" /> 24< uses-feature android:name="android.hardware.touchscreen" android:required="false" /> 25< uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> 26< uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> 27< uses-permission android:name="android.permission.INTERNET" /> 28< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 29< uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 30< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 31< uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 32< uses-permission android:name="android.permission.READ_PHONE_STATE" /> 33< uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 34< uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 35< uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 36< uses-permission android:name="android.permission.WAKE_LOCK" /> 37< uses-permission android:name="android.permission.WRITE_SETTINGS" /> 38 < /manifest>

AndroidManifest 
配置完毕就可以搭界面和写C#逻辑了
新建GetLocationAndPoiInfo脚本
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 6 public class GetLocationAndPoiInfo : MonoBehaviour { 7 8public Text locText; 9public Text poiText; 10public Button locBtn; 11public Button poiBtn; 12 13AndroidJavaClass jc; 14AndroidJavaObject jo; 15 16// Use this for initialization 17void Start () { 18OnStart(); 19locBtn.onClick.AddListener(() => { GetLocationInfo(); }); 20poiBtn.onClick.AddListener(() => { GetPoiInfo(); }); 21} 22void OnStart() { 23jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 24jo = jc.GetStatic< AndroidJavaObject> ("currentActivity"); 25} 26 27void GetLocationInfo() { 28locText.text = ""; 29OnStart(); 30locText.text = jo.Call< string> ("GetInfo"); 31} 32 33void GetPoiInfo() { 34locText.text = ""; 35OnStart(); 36poiText.text = jo.Call< string> ("GetPoi", "酒店", "", 1); 37} 38 }

GetLocationAndPoiInfo 
将脚本挂在任何一个物体上
布置界面
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

因为是Android工程发布到手机(或模拟器)才能运行
上成果图
Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

文章图片

到这里接高德地图SDK的工作就做完了
 
根据手机朝向显示不同店家的逻辑我就不写了 挺麻烦的
我说一下思路:
在AndroidStudio中获取各个店家的经纬度与自身坐标点的相对位置信息并输出
在Unity中获取到这个信息、解析、并转换为角度、再转换为匹配Input.compass指南针坐标系的角度
然后设置一个视野范围(度数)
最后根据手机朝向显示视野范围内不同的店家
 
这么做有什么用处呢
做类似pokemon go这样的东西时候这些信息就有用了
 
【Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作】写在最后:第一次公开写博,如有不妥之处请多指教


    推荐阅读