using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
///
/// 根据数据动态加载设备
///
public class DeviceManager : MonoBehaviour
{
[HideInInspector]
public static DeviceManager instance;
private void Awake()
{
instance = this;
}
///
/// 根据json加载设备
///
///
public void LoadDeviceByJson(DeviceData info)
{
ClearDevices();
GameObject device;
foreach (var item in info.devices)
{
Debug.Log(item.deviceSubType);
device=GameObject.Instantiate(Resources.Load("Prefab/Devices/" + item.deviceSubType));
device.name=item.deviceSubType;
device.transform.parent= transform;
device.transform.position = new Vector3(float.Parse(item.deviceX), float.Parse(item.deviceY), float.Parse(item.deviceZ));
device.transform.eulerAngles = new Vector3(device.transform.eulerAngles.x, float.Parse(item.deviceAngle), device.transform.eulerAngles.z);
device.GetComponent().code = item.deviceSeq;
device.GetComponent().floorIndex = int.Parse(item.floor);
}
}
///
/// 清空本地设备
///
public void ClearDevices()
{
foreach (Transform item in transform)
{
item.gameObject.SetActive(false);
Destroy(item.gameObject);
}
}
///
/// 将子物体中的设备数据记录成json(StreamingAssets/Json/DeviceInfo.json)
///
public static void RecordDataToJson(GameObject devicelist)
{
Debug.Log("开始记录...");
DeviceData devicelistData = new DeviceData();
devicelistData.devices = new DeviceInfo[devicelist.GetComponentsInChildren(true).Length];
int index = 0;
foreach (ModelItem item in devicelist.GetComponentsInChildren(true))
{
DeviceInfo _deviceinfo = new DeviceInfo();
_deviceinfo.hallCode = "";
_deviceinfo.deviceName = item.name;
_deviceinfo.deviceType = GetDeviceType(item.deviceType);
_deviceinfo.floor = item.floorIndex.ToString();
_deviceinfo.deviceSubType = GetPrefabAssetPath(item.gameObject);
_deviceinfo.deviceX = item.transform.position.x.ToString();
_deviceinfo.deviceY = item.transform.position.y.ToString();
_deviceinfo.deviceZ = item.transform.position.z.ToString();
_deviceinfo.deviceAngle = item.transform.eulerAngles.y.ToString();
_deviceinfo.deviceSeq = "";
devicelistData.devices[index]= _deviceinfo;
index++;
}
string infojson =JsonUtility.ToJson(devicelistData);
infojson=infojson.Replace("{\"devices\":", "");
infojson= infojson.Remove(infojson.Length-1);
Debug.Log(infojson);
CreateFile(Application.streamingAssetsPath+"/Json/DeviceInfo.json",infojson);
Debug.Log("保存成功!"+ Application.streamingAssetsPath + "/Json/DeviceInfo.json");
}
///
/// 获取设备类型编号
///
private static string GetDeviceType(DeviceType type)
{
string typecode = "";
switch (type)
{
case DeviceType.JiaoFeiJi:
typecode = "01";
break;
case DeviceType.FaPiaoDaYinJi:
typecode = "03";
break;
case DeviceType.YeWuJi:
typecode = "02";
break;
case DeviceType.SheXiangTou:
typecode = "04";
break;
case DeviceType.YuShouLiZhongDuan:
typecode = "06";
break;
case DeviceType.WangShangGuoWangYunZhongDuan:
typecode = "17";
break;
}
return typecode;
}
///
/// 获取预制体资源路径。
///
///
///
public static string GetPrefabAssetPath(GameObject gameObject)
{
#if UNITY_EDITOR
// Project中的Prefab是Asset不是Instance
if (UnityEditor.PrefabUtility.IsPartOfPrefabAsset(gameObject))
{
DirectoryInfo path = new DirectoryInfo(UnityEditor.AssetDatabase.GetAssetPath(gameObject));
// 预制体资源就是自身
return path.Name.Replace(".prefab", "");
}
// Scene中的Prefab Instance是Instance不是Asset
if (UnityEditor.PrefabUtility.IsPartOfPrefabInstance(gameObject))
{
// 获取预制体资源
var prefabAsset = UnityEditor.PrefabUtility.GetCorrespondingObjectFromOriginalSource(gameObject);
DirectoryInfo path = new DirectoryInfo(UnityEditor.AssetDatabase.GetAssetPath(prefabAsset));
return path.Name.Replace(".prefab", "");
}
#endif
// 不是预制体
return null;
}
///
/// Creates the file.创建文本的方法
///
/// File path. 文件的路径
/// Data. 文件的内容
public static void CreateFile(string _filePath, string _data)
{
StreamWriter sw;
DirectoryInfo fileinfo=new DirectoryInfo(_filePath);
if (!Directory.Exists(fileinfo.Parent.FullName))
{
Directory.CreateDirectory(fileinfo.Parent.FullName);
}
FileInfo fi = new FileInfo(_filePath);
//创建并覆盖文件
sw = fi.CreateText();
sw.WriteLine(_data);//以行的形式写入
//sw .Write (_data);//首位衔接的方式写入
sw.Close();//关闭流
sw.Dispose();//销毁流
}
}
[Serializable]
public struct DeviceData {
public DeviceInfo[] devices;
}
[Serializable]
public struct DeviceInfo {
///
/// 营业厅代码
///
public string hallCode;
///
/// 设备名称
///
public string deviceName;
///
/// 设备类型
///
public string deviceType;
///
/// 设备小类
///
public string deviceSubType;
///
/// 楼层索引
///
public string floor;
///
/// 设备坐标X
///
public string deviceX;
///
/// 设备坐标Y
///
public string deviceY;
///
/// 设备坐标Z
///
public string deviceZ;
///
/// 设备角度
///
public string deviceAngle;
///
/// 设备序号
///
public string deviceSeq;
}