SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

156 lines
6.0 KiB

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;
using UnityEngine;
namespace ARLocation {
public class WebMapLoader : MonoBehaviour
{
public class DataEntry
{
public int id;
public double lat;
public double lng;
public double altitude;
public string altitudeMode;
public string name;
public string meshId;
public float movementSmoothing;
public int maxNumberOfLocationUpdates;
public bool useMovingAverage;
public bool hideObjectUtilItIsPlaced;
public AltitudeMode getAltitudeMode()
{
if (altitudeMode == "GroundRelative") {
return AltitudeMode.GroundRelative;
} else if (altitudeMode == "DeviceRelative") {
return AltitudeMode.DeviceRelative;
} else if (altitudeMode == "Absolute") {
return AltitudeMode.Absolute;
} else {
return AltitudeMode.Ignore;
}
}
}
/// <summary>
/// The `PrefabDatabase` ScriptableObject, containing a dictionary of Prefabs with a string ID.
/// </summary>
public PrefabDatabase PrefabDatabase;
/// <summary>
/// The XML data file download from the Web Map Editor (htttps://editor.unity-ar-gps-location.com)
/// </summary>
public TextAsset XmlDataFile;
/// <summary>
/// If true, enable DebugMode on the `PlaceAtLocation` generated instances.
/// </summary>
public bool DebugMode;
private List<DataEntry> _dataEntries = new List<DataEntry>();
private List<GameObject> _stages = new List<GameObject>();
private List<PlaceAtLocation> _placeAtComponents = new List<PlaceAtLocation>();
// Start is called before the first frame update
void Start()
{
LoadXmlFile();
BuildGameObjects();
}
void BuildGameObjects()
{
foreach (var entry in _dataEntries)
{
var Prefab = PrefabDatabase.GetEntryById(entry.meshId);
if (!Prefab)
{
Debug.LogWarning($"[ARLocation#WebMapLoader]: Prefab {entry.meshId} not found.");
continue;
}
var PlacementOptions = new PlaceAtLocation.PlaceAtOptions()
{
MovementSmoothing = entry.movementSmoothing,
MaxNumberOfLocationUpdates = entry.maxNumberOfLocationUpdates,
UseMovingAverage = entry.useMovingAverage,
HideObjectUntilItIsPlaced = entry.hideObjectUtilItIsPlaced
};
var location = new Location()
{
Latitude = entry.lat,
Longitude = entry.lng,
Altitude = entry.altitude,
AltitudeMode = entry.getAltitudeMode(),
Label = entry.name
};
var instance = PlaceAtLocation.CreatePlacedInstance(Prefab,
location,
PlacementOptions,
DebugMode);
_stages.Add(instance);
}
}
// Update is called once per frame
void LoadXmlFile()
{
var xmlString = XmlDataFile.text;
Debug.Log(xmlString);
XmlDocument xmlDoc = new XmlDocument();
try {
xmlDoc.LoadXml(xmlString);
} catch(XmlException e) {
Debug.LogError("[ARLocation#WebMapLoader]: Failed to parse XML file: " + e.Message);
}
var root = xmlDoc.FirstChild;
var nodes = root.ChildNodes;
foreach (XmlNode node in nodes)
{
Debug.Log(node.InnerXml);
Debug.Log(node["id"].InnerText);
int id = int.Parse(node["id"].InnerText);
double lat = double.Parse(node["lat"].InnerText, CultureInfo.InvariantCulture);
double lng = double.Parse(node["lng"].InnerText, CultureInfo.InvariantCulture);
double altitude = double.Parse(node["altitude"].InnerText, CultureInfo.InvariantCulture);
string altitudeMode = node["altitudeMode"].InnerText;
string name = node["name"].InnerText;
string meshId = node["meshId"].InnerText;
float movementSmoothing = float.Parse(node["movementSmoothing"].InnerText, CultureInfo.InvariantCulture);
int maxNumberOfLocationUpdates = int.Parse(node["maxNumberOfLocationUpdates"].InnerText);
bool useMovingAverage = bool.Parse(node["useMovingAverage"].InnerText);
bool hideObjectUtilItIsPlaced = bool.Parse(node["hideObjectUtilItIsPlaced"].InnerText);
DataEntry entry = new DataEntry() {
id = id,
lat = lat,
lng = lng,
altitudeMode = altitudeMode,
altitude = altitude,
name = name,
meshId = meshId,
movementSmoothing = movementSmoothing,
maxNumberOfLocationUpdates = maxNumberOfLocationUpdates,
useMovingAverage =useMovingAverage,
hideObjectUtilItIsPlaced = hideObjectUtilItIsPlaced };
_dataEntries.Add(entry);
Debug.Log($"{id}, {lat}, {lng}, {altitude}, {altitudeMode}, {name}, {meshId}, {movementSmoothing}, {maxNumberOfLocationUpdates}, {useMovingAverage}, {hideObjectUtilItIsPlaced}");
}
}
}
}