Desenvolvimento

11 ago, 2016

Pokemon GO – O passo a passo para fazer o seu – Parte 02

Publicidade

Como vimos na primeira parte desta série, vamos aprender a construir o nosso próprio Pokemon GO.

Após fazer os passos explicados anteriormente, vamos agora para terceira etapa:

Etapa 3: Integrar Caractere e interação com dados do GPS

Crie o LocationManager Gameobject e adicione o seguinte código, que está usando os dados do GPS e atualizando o Google Maps quando os dados do GPS são alterado.

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class LocationManager : MonoBehaviour {

	public GameObject map;
	public float lat;
	public float lon;
	float lastlat,lastlon;
	public GameObject latText;
	public GameObject lonText;
// Use this for initialization
	void Start () {
Input.location.Start (); // enable the mobile device GPS
map = GameObject.FindGameObjectWithTag ("Map");
if (Input.location.isEnabledByUser) { // if mobile device GPS is enabled
float lat = Input.location.lastData.latitude; //get GPS Data
float lon = Input.location.lastData.longitude;
}

}

// Update is called once per frame
void Update () {
//      
//        if (Input.location.isEnabledByUser) {
//            float lat = Input.location.lastData.latitude;
//            float lon = Input.location.lastData.longitude;
//            DebugConsole.Log ("Lon:" + lon.ToString () + " Lat:" + lat.ToString ());
//            if (lastlat != lat || lastlon != lon) {
//                map.GetComponent ().centerLocation.latitude = lat;
//                map.GetComponent ().centerLocation.longitude = lon;
//                latText.GetComponent ().text = "Lat" + lat.ToString ();
//                lonText.GetComponent ().text = "Lon" + lon.ToString ();
//                map.GetComponent ().Refresh ();
//            }
//            lastlat = lat;
//            lastlon = lon;
//        }
//      

//      
	if (lastlat != lat || lastlon != lon) {
		map.GetComponent ().centerLocation.latitude = lat;
		map.GetComponent ().centerLocation.longitude = lon;
		map.GetComponent ().Refresh ();
	}
	lastlat = lat;
	lastlon = lon;
//      

}

Faça o teste do Google Maps novamente. Será bem sucedido se a localização do Google Maps for alterada conforme a indicação dos dados do GPS.

poke18

poke19

Depois disso, crie uma cápsula como um personagem e um cubo de direção do personagem no topo do Google Map. (para mim, eu coloquei o personagem em X:0 Y:0.07 Z:0). Adicione uma bússola ao seu personagem quando você testar o dispositivo móvel.

poke20

Verifique se seu personagem está situado corretamente com base na latitude e longitude do Google Maps.

poke21

Etapa 4: Gerando monstros no Mapa (Parte A)

Para a geração de monstros, nós precisamos fazer alguns cálculos para posicionar o monstro com sua latitude e longitude – porque a relação entre Google Maps, realidade e Unity3d XYZ é diferente.

Para descobrir como calcular a relação entre eles, precisamos de dados fictícios (para mais detalhes sobre como calcular, acesse este link).

Primeiro de tudo, nós precisamos definir a latitude e longitude inicial no Google Maps (você pode escolher onde quiser) e defina os marcadores no Google Maps.

poke22

Pressione Run e você encontrará a etiqueta no seu Google Maps.

poke23

Observação: Não podemos usar o marcador para ser um monstro porque ele é combinado com a textura. O marcador em si é uma parte da textura, mas não um Gameobject, por isso não podemos fazer qualquer implementação nisso. Ao invés, vamos fazer alguns dados GPS como monstro fictício no servidor Parse, por isso precisamos de saber a proporção correspondente na posição de objeto jogo monstro.

poke24

Depois disso, nós criamos um cubo em cima da etiqueta.

poke25

Grave esta posição. Agora, precisamos saber a distância exata entre a localização do jogador GPS e a localização do marcador GPS. A distância entre o início (37,38373, -122,0133) e marcador (37,384782, -122,012893) pode ser calculada por este script.

public static double DistanceBetweenPlaces(double lon1, double lat1, double lon2, double lat2)
{
	float R = 6371000; // m
	double sLat1 = Math.Sin(deg2rad(lat1));
	double sLat2 = Math.Sin(deg2rad(lat2));
	double cLat1 = Math.Cos(deg2rad(lat1));
	double cLat2 = Math.Cos(deg2rad(lat2));
	double cLon = Math.Cos(deg2rad(lon1) - deg2rad(lon2));

	double cosD = sLat1*sLat2 + cLat1*cLat2*cLon;

	double d = Math.Acos(cosD);

	double dist = R * d;

	return dist;
}

E depois calcule a distância mundo XYZ entre o fabricante de cubo e o jogador (-0.563,0.07, -1,915) E (0,0.07,0). Este é um cálculo simples, então, eu não mostro como fazê-lo. Depois disso, a relação será encontrada por esta equação:

Relação = distância mundo XYZ / distância exata

Uma vez que temos esta relação, somos capazes de calcular o quanto o monstro deve ser colocado de acordo com a localização do jogador. No entanto, a possível localização ainda está indefinida, porque não temos o rolamento entre o jogador e o monstro.

Para calcular o rolamento, podemos usar este código:

ublic static double BearingBetweenPlaces(double lon1,double lat1,double lon2,double lat2){
	double y = Math.Sin (deg2rad (lon2) - deg2rad (lon1)) * Math.Cos (deg2rad (lat2));
	double x = Math.Cos (deg2rad (lat1)) * Math.Sin (deg2rad (lat2)) - Math.Sin (deg2rad (lat1)) * Math.Cos (deg2rad (lat2)) * Math.Cos (deg2rad (lon2) - deg2rad (lon1));
	double bearing = Math.Atan2 (y, x);
	return bearing;
}

Depois de obter a relação e o rolamento, é possível converter Longitude Latitude para uma coordenação mundo XYZ, o que significa que pode colocar qualquer monstro com localização longitude latitude para corrigir localização do mundo do jogo.

public static double[] convertXZ(double lon1,double lat1,double lon2,double lat2){
	double ratio = 0.0162626572;
	double bearing = BearingBetweenPlaces (lon1, lat1, lon2, lat2);
	double distance = DistanceBetweenPlaces(lon1, lat1, lon2, lat2);
	double x = Math.Sin (-bearing) * distance * ratio;
	double z = -Math.Cos (bearing) * distance * ratio;
	Debug.Log ("X" + x.ToString () + "Z" + z.ToString ());
	double[] xz = { x, z };
	return xz;
}

Com o código acima, sabemos as cordenadas XYZ corretas para desovar monstro.

Vamos agora para próxima etapa: Gerando Monstros no Mapa. Mas isso só na parte 3 da nossa série.

Até a parte final do artigo!