Integrar Unity & Location Kit
Tags: hmscore, huawei, huaweimobileservices, android
Published: 2021-03-04 01:42:36

#Introducción:
En este artículo, aprenderemos cómo integrar el kit de ubicación y obtener la última latitud y longitud de ubicación conocidas en unidad utilizando el complemento Huawei HMS Core App Services.
#Requisitos:
1. Unity IDE
2. Visual Code
3. Dispositivo HMS
#Output:
Mostrar última latitud y longitud conocidas.
#Consideraciones:
Para las bibliotecas del kit de ubicación y conexión de App Gallery, usaremos una versión específica, verifique si hay una versión más nueva disponible.
#Pasos para integrar:
##Crea un proyecto de Unity
Abra Unity Hub y cree un proyecto (en nuestro caso, un proyecto 2D). El nombre del proyecto será UnityLocationKit.
En Unity, vaya a Windows> Asset Store, busque HMS Core App Services y haga clic en Importar.
![Alt Text](https://miro.medium.com/max/700/0*N27HjiyvP6A5iqNH.png)

Cambiar plataforma: haga clic en Configuración de compilación, seleccione Android y presione Cambiar plataforma.

![Alt Text](https://miro.medium.com/max/700/0*N27HjiyvP6A5iqNH.png)

Seleccione Configuración del reproductor> Configuración de publicación> Administrador de almacén de claves y cree un nuevo archivo de almacén de claves de la siguiente manera.

![Alt Text](https://miro.medium.com/max/700/0*-gZZuOhShgi8x65K.png)

![Alt Text](https://miro.medium.com/max/500/0*PZXiyozyBOofaHAD.png)

Actualice el nombre del paquete.
En Configuración del proyecto> Configuración de publicación, habilite las siguientes opciones.

![Alt Text](https://miro.medium.com/max/333/0*mYKLzRckoJjaK_fv.png)

En el terminal de la línea de comandos, ejecute el siguiente comando y obtenga la clave SHA:

```
keytool -list -v -keystore D:\yourpath\UnityLocationKit.keystore
```

![Alt Text](https://miro.medium.com/max/700/0*HLB0C283jDeFPiVb.png)

##Crea y configura el proyecto en AppGallery
Navegue a AGC Console y cree un nuevo proyecto con el mismo nombre que el proyecto de Unity (en este caso, UnityLocationKit).

![Alt Text](https://miro.medium.com/max/621/0*UpkXCTcO2VCHmv_6.png)

Agregar aplicación

![Alt Text](https://miro.medium.com/max/700/0*UOyjG076SUpqV8rT.png)

Guarde la clave SHA en la consola AGC.

![Alt Text](https://huawei-latinoamerica.medium.com/integrar-unity-location-kit-38d1cd1990f)

Habilitar el kit de ubicación
![Alt Text](https://miro.medium.com/max/700/0*6Q3t6x6ApYLihGwA.png)

Descargue agconnect-services.json y cópielo en Assets> Plugins> Android in unity project.
##Agregar complementos y dependencias de HMS
En Manifiesto, agregue permisos de uso y etiqueta de servicio:

```
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<receiver   android:name="com.unity.hms.location.LocationBroadcastReceiver"   android:exported="true">
      <intent-filter>
          <action android:name="com.huawei.hmssample.location.LocationBroadcastReceiver.ACTION_PROCESS_LOCATION"   />
      </intent-filter>
</receiver>
<receiver   android:name="com.unity.hms.location.GeoFenceBroadcastReceiver"   android:exported="true">
      <intent-filter>
          <action android:name="com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION"   />
      </intent-filter>
</receiver>
```

En LaucherTemplate agregue el complemento y las dependencias

```
apply plugin: 'com.huawei.agconnect'
```
```
implementation 'com.huawei.agconnect:agconnect-core:1.2.0.300'
implementation   'com.huawei.hms:location:5.0.0.302'
implementation   'com.android.support:appcompat-v7:28.0.0'
```
En MainTemplate agregue las dependencias:

```
implementation 'com.huawei.hms:location:5.0.0.302'
```
En BaseProjectTemplate, agregue esto en los repositorios de buildscript y en todos los repositorios del proyecto y en la ruta de clases de App Gallery Connect.

```
maven { url 'https://developer.huawei.com/repo/' }
classpath 'com.huawei.agconnect:agcp:1.2.1.301'
```
Debe verse así:
```
allprojects {
        buildscript {
            repositories {**ARTIFACTORYREPOSITORY**
                google()
                jcenter()
                maven { url 'https://developer.huawei.com/repo/' }
            }
            dependencies {
                classpath 'com.android.tools.build:gradle:3.4.0'
                classpath 'com.huawei.agconnect:agcp:1.2.1.301'
                **BUILD_SCRIPT_DEPS**
            }
        }
        repositories {**ARTIFACTORYREPOSITORY**
            google()
            jcenter()
            flatDir {
                dirs "${project(':unityLibrary').projectDir}/libs"
            }
            maven { url 'https://developer.huawei.com/repo/' }
        }
}
```

Vaya a Archivo> Configuración de compilación> Configuración del reproductor> Reproductor y actualice el nombre de la empresa y el nombre del paquete

![Alt Text](https://huawei-latinoamerica.medium.com/integrar-unity-location-kit-38d1cd1990f)

##Crear GameObjects y codificación
Mostraremos la ubicación en un objeto de juego TEXT, haga clic en GameObject> UI> TEXT y cambiaremos el nombre del objeto creado a LocationText
Cree un GameObject vacío, haga clic en GameObject> Create Empty y cambie el nombre del objeto a LocationManagerGameObject.

![Alt Text](https://miro.medium.com/max/700/0*zEsrQZeo474HPz0-.png)

Dentro de la carpeta de activos crear carpeta de script.
Haga clic derecho dentro de la carpeta y haga clic en Crear> C # Script y asígnele el nombre LocationManager.
Haga clic en LocationManagerGameObject, haga clic en Agregar componente y seleccione el script LocationManager.
Abrir secuencia de comandos LocationManager.
Agregue la siguiente secuencia de comandos:

```
using HuaweiHms;
using System;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;
using Exception = HuaweiHms.Exception;
public class LocationManager : MonoBehaviour
{
    private static Text locationText;
    private FusedLocationProviderClient mFusedLocationProviderClient;
    public delegate void SuccessCallBack<T>(T o);
    public delegate void FailureCallBack(Exception e);
    public LocationRequest mLocationRequest;
    
    void Start()
    {
        locationText = GameObject.Find("LocationText").GetComponent<Text>();
        locationText.text = "Location";
        if (!Permission.HasUserAuthorizedPermission(Permission.CoarseLocation))
        {
            Permission.RequestUserPermission(Permission.CoarseLocation);
        }
    }
    
    void OnGUI()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.CoarseLocation))
        {
            // permission denied, no access should be visible, when activated when requested permission
            locationText.text = "Permission denied";
            return;
        }
        GetLastLocation();
    }
    
    public void GetLastLocation()
    {
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(new Context());
        try
        {
            Task lastLocation = null;
            mLocationRequest = new LocationRequest();
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HD_ACCURACY);
            lastLocation = mFusedLocationProviderClient.getLastLocationWithAddress(mLocationRequest);
            lastLocation.addOnSuccessListener(new HmsSuccessListener<Location>((location) =>
            {
                if (location == null)
                {
                    locationText.text = "getLastLocation onSuccess location is null";
                    return;
                }
                locationText.text = "getLastLocation onSuccess location[Longitude,Latitude]:" + location.getLongitude() + "," + location.getLatitude();
            })).addOnFailureListener(new HmsFailureListener((Exception e) =>
            {
                locationText.text = "getLastLocation onFailure " + e.toString();
            }));
        }
        catch (System.Exception e)
        {
            locationText.text = "getLastLocation exception:" + e.Message;
        }
    }
 
    public class HmsSuccessListener<T> : OnSuccessListener
    {
        public SuccessCallBack<T> CallBack;
        public HmsSuccessListener(SuccessCallBack<T> c)
        {
            CallBack = c;
        }
        public void onSuccess(T arg0)
        {
            locationText.text = "OnSuccessListener onSuccess";
            if (CallBack != null)
            {
                CallBack.Invoke(arg0);
            }
        }
 
        public override void onSuccess(AndroidJavaObject arg0)
        {
            locationText.text = "OnSuccessListener onSuccess";
            if (CallBack != null)
            {
                Type type = typeof(T);
                IHmsBase ret = (IHmsBase)Activator.CreateInstance(type);
                ret.obj = arg0;
                CallBack.Invoke((T)ret);
            }
        }
    }
 
    public class HmsFailureListener : OnFailureListener
    {
        public FailureCallBack CallBack;
        public HmsFailureListener(FailureCallBack c)
        {
            CallBack = c;
        }
        public override void onFailure(Exception arg0)
        {
            locationText.text = "OnFailureListener onFailure";
            if (CallBack != null)
            {
                CallBack.Invoke(arg0);
            }
        }
    }
}
```
Cree su archivo apk haciendo clic en Archivo> Configuración de compilación> Compilar e instalarlo en su dispositivo.
Abra su juego, acepte la solicitud de permisos de ubicación y vea el resultado.

![Alt Text](https://miro.medium.com/max/700/0*jedP8ZQsi6AnjH8O.jpg)