- PHP部分 (nearStore.php)
可以發現我們用$_GET來取得 Unity WWW Class 所傳遞過來的資料,而這邊geoPoint就是Unity Client端目前的lacation Data,而最後再將Query出來的結果encode成Json字串格式回傳給客戶端。
header('Content-Type: text/html; charset=utf-8');
$database = mysql_connect('DB_IP', 'DB_ACCOUNT', 'DB_PassWord') or die('Could not connect: ' . mysql_error());
mysql_query("SET NAMES 'UTF8'");
mysql_select_db('openfire_scores') or die('Could not select database');
$geoPoint = mysql_real_escape_string($_GET['geoPoint'], $database);
$query = "SELECT *,(GLength(LineStringFromWKB(LineString(geoPoint,GeomFromText('POINT({$geoPoint})'))))) AS distance FROM stores ORDER BY distance ASC LIMIT 5";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$num_results = mysql_num_rows($result);
for($i = 0; $i < $num_results; $i++)
{
$row = mysql_fetch_array($result);
$store_json[$i]["id"] = $row['s_id'];
$store_json[$i]["name"] = $row['s_name'];
$store_json[$i]["photoLink"] = $row['s_photoLink'];
$store_json[$i]["description"] = $row['s_description'];
}
$echo_json = json_encode($store_json);
echo $echo_json;
exit();
- C#部分 (HSController.cs)
Unity部分主要運用到幾個概念,StartCoroutine等待另一個Function完成、LacationService定位、WWW GET&retrieve PHP的echo Content,Using MiniJson來將PHP回傳的Json decoding 成字串存入陣列!程式邏輯如下:Start() -> GetStore() 嘗試發出Query但要先等待GetGps()得到geoPoint -> 完成後再回到GetStore -> 以GET方式將geoPoint Send往PHP來達成以目前為中心進行 LBS Query -> PHP回傳的JSON字串存在 www.text 再用MiniJson deCoding即可!
using UnityEngine;
using System.Collections;
using System.Timers;
using System.Collections.Generic;
using MiniJSON;
public class HSController : MonoBehaviour
{
public string findStoreURL = "http://your_ip/sample_test/nearStore.php";
LocationInfo currentGPSPosition;
public string gps_String;
void Start()
{
StartCoroutine(GetStores());
}
IEnumerator GetStores()
{
string id ="";
string name ="";
string url ="";
string desc ="";
yield return StartCoroutine (GetGps());//wait for gps
string findstore_url = findStoreURL + "?geoPoint=" + gps_String;
print (findstore_url);
WWW hs_get = new WWW(findstore_url);
yield return hs_get;
if (hs_get.error != null)
{
print("There was an error getting the nearest stores: " + hs_get.error);
}
else
{
IList jsonList = (IList)Json.Deserialize(hs_get.text);
foreach(IDictionary param in jsonList){
id = (string)param["id"];
name = (string)param["name"];
url = (string)param["photoLink"];
desc = (string)param["description"];
Debug.Log("id:"+id);
Debug.Log("name:"+name);
Debug.Log("url:"+url);
Debug.Log("desc:"+desc);
}
}
}
IEnumerator GetGps()
{
if (!Input.location.isEnabledByUser)
yield break;
Input.location.Start ();
int maxWait = 20;
while (Input.location.status == LocationServiceStatus.Initializing && maxWait>0) {
yield return new WaitForSeconds(1);
maxWait--;
}//end while
if (maxWait < 1) {
print ("Time out");
yield break;
}
if (Input.location.status == LocationServiceStatus.Failed) {
print("Unable to determine device location");
yield break;
} else {
print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp);
currentGPSPosition = Input.location.lastData;
gps_String = currentGPSPosition.longitude + "%20" + currentGPSPosition.latitude;
print (gps_String);
Input.location.Stop();
yield break;
}
}
}
或許這並不是一個好的解決方式,確是可行的方法,若有其他更好的做法也希望能與我分享討論,最後分享一些參考的連結:- Unity Scripting API - WWW
- Unity Scripting API - Couroutine
- Unity uses PHP connecting to MySQL - Server Side Highscores 實現排行板功能
好猛ㄛ >//////////////////////////<
回覆刪除