Files
Main/Assets/Plugins/Code/FuncellEditor/SceneEditor/Proxy/MapInfoDataReader.cs

227 lines
8.3 KiB
C#
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
#if FUNCELL_EDITOR
namespace SceneEditor.Proxy.Editor
#else
namespace SceneEditor.Proxy.Plugin
#endif
{
/// <summary>
/// MapInfo数据的读操作
/// </summary>
public static class MapInfoDataReader
{
public static Dictionary<string, MapInfoBody> _mapInfoBodys = new Dictionary<string, MapInfoBody>();
/// <summary>
/// 读取场景对象数据,sceneName.bytes
/// 读取二进制数据
/// </summary>
/// <param name="pathName"></param>
/// <param name="sceneName"></param>
/// <returns></returns>
public static MapInfoBody LoadSceneObjectData(String pathName, String fileName)
{
if (String.IsNullOrEmpty(fileName))
return null;
string filePath = pathName + "/" + fileName;
string mapName = fileName.Replace("_MapInfo.bytes", "");
try
{
var bytes = File.ReadAllBytes(filePath);
if (bytes != null)
{
int readLen = 0;
MapInfoHeader header = new MapInfoHeader();
header.Read(bytes, ref readLen);
MapInfoBody body = new MapInfoBody(header);
if (body.Read(bytes))
{
if (!_mapInfoBodys.ContainsKey(mapName))
{
_mapInfoBodys[mapName] = body;
}
return body;
}
}
}
catch (Exception e)
{
Debug.LogErrorFormat("LoadSceneObjectData failed! {0}", filePath);
Debug.LogException(e);
}
return null;
}
///// <summary>
///// 为世界地图读取MapInfo数据,sceneName.bytes
///// 文件是二进制数据
///// </summary>
///// <param name="pathName"></param>
///// <param name="sceneName"></param>
///// <returns></returns>
//public static MapInfoBody LoadSceneObjectData_ForWorldMap(String pathName, String sceneName)
//{
// String[] dirs = sceneName.Split(new char[] { '/' });
// if (dirs.Length == 0)
// {
// return null;
// }
// String fileName = dirs[dirs.Length - 1];
// MemoryStream fs = null;
// try
// {
// var bytes = File.ReadAllBytes(pathName + '/' + fileName);
// if (bytes != null)
// {
// fs = new MemoryStream(bytes);
// BinaryReader r = new BinaryReader(fs);
// MapInfoHeader header = new MapInfoHeader();
// header.Read(r);
// r.BaseStream.Seek(0, SeekOrigin.Begin);
// // read header successed
// MapInfoBody body = new MapInfoBody(header);
// if (body.Read(r))
// {
// return body;
// }
// }
// }
// catch (IOException e)
// {
// Debug.LogFormat("Save MapInfo data failed! " , e);
// }
// finally
// {
// if (fs != null)
// {
// fs.Close();
// }
// }
// return null;
//}
/// <summary>
/// 使用ObjectSerializer,从xml文件中加载MapInfo数据
/// </summary>
/// <param name="sceneName"></param>
/// <returns></returns>
public static GameObject LoadScene(string mapName)
{
GameObject go = GameObject.Find(MapInfoConstDefine.SceneObjectsRootName);
if (go == null)
{
go = new GameObject();
go.name = MapInfoConstDefine.SceneObjectsRootName;
go.transform.position = Vector3.zero;
go.transform.rotation = Quaternion.identity;
go.transform.localScale = Vector3.one;
}
if(_mapInfoBodys.ContainsKey(mapName))
{
MapInfoBody body = _mapInfoBodys[mapName];
//加载路点信息
Transform wayPointParent = go.transform.Find("[WayPoint]");
if (wayPointParent == null)
{
GameObject temp = new GameObject("[WayPoint]");
wayPointParent = temp.transform;
wayPointParent.position = Vector3.zero;
wayPointParent.rotation = Quaternion.identity;
wayPointParent.localScale = Vector3.one;
wayPointParent.parent = go.transform;
}
List<WayPointData> wayPointDatas = body.mapWayPoints;
WayPointPlanData.LoadWayPointData(wayPointParent.gameObject, wayPointDatas);
//加载Trigger信息
Transform triggerParent = go.transform.Find("[Trigger]");
if(triggerParent == null)
{
GameObject temp = new GameObject("[Trigger]");
triggerParent = temp.transform;
triggerParent.position = Vector3.zero;
triggerParent.rotation = Quaternion.identity;
triggerParent.localScale = Vector3.one;
triggerParent.parent = go.transform;
}
List<TriggerData> triggerDatas = body.mapTriggers;
TriggerPlanData.LoadTriggerData(triggerParent.gameObject, triggerDatas);
//加载动态阻挡
Transform dynamicBlockerParent = go.transform.Find("[DynamicBlocker]");
if (dynamicBlockerParent == null)
{
GameObject temp = new GameObject("[DynamicBlocker]");
dynamicBlockerParent = temp.transform;
dynamicBlockerParent.position = Vector3.zero;
dynamicBlockerParent.rotation = Quaternion.identity;
dynamicBlockerParent.localScale = Vector3.one;
dynamicBlockerParent.parent = go.transform;
}
List<DynamicBlockerData> dynamicBlockerDatas = body.mapDynamicBlockers;
TriggerPlanData.LoadDynamicBlockerData(dynamicBlockerParent.gameObject, dynamicBlockerDatas);
//加载场景音乐
Transform soundParent = go.transform.Find("[Sound]");
if (soundParent == null)
{
GameObject temp = new GameObject("[Sound]");
soundParent = temp.transform;
soundParent.position = Vector3.zero;
soundParent.rotation = Quaternion.identity;
soundParent.localScale = Vector3.one;
soundParent.parent = go.transform;
}
List<SoundData> soundDatas = body.mapSounds;
TriggerPlanData.LoadSoundData(dynamicBlockerParent.gameObject, soundDatas);
}
else
{
Debug.LogError(mapName + "=====not exist config file======");
}
return go;
}
//获取int
public static int GetInt(byte[] bytes, ref int readLen)
{
var result = BitConverter.ToInt32(bytes, readLen);
readLen += 4;
return result;
}
//获取int16
public static Int16 GetInt16(byte[] bytes, ref int readLen)
{
var result = BitConverter.ToInt16(bytes, readLen);
readLen += 2;
return result;
}
//获fload
public static float GetFloat(byte[] bytes, ref int readLen)
{
var result = BitConverter.ToSingle(bytes, readLen);
readLen += 4;
return result;
}
//获取string
public static string GetStringFixSize(byte[] bytes, int size, ref int readLen)
{
var result = System.Text.Encoding.UTF8.GetString(bytes, readLen, size).Trim((char)0);
readLen += size;
return result;
}
}
}