using System.IO;
|
using UnityEditor;
|
using UnityEngine;
|
|
namespace H2Engine
|
{
|
[CustomEditor(typeof(Bhv_MapData))]
|
public class MapEditor : Editor
|
{
|
private string LS_KEY_SAVEPATH;
|
private string LS_KEY_EXPORTPATH;
|
|
private Evt.E_EventType eventType = Evt.E_EventType.Enemy;
|
|
[MenuItem("程序/MapEditor | 地图编辑器")]
|
static void Init()
|
{
|
var _mono = GameObject.FindObjectOfType<Bhv_MapData>();
|
if (_mono == null)
|
{
|
var _root = CreateNewGO(Bhv_MapData.NodeName_Root);
|
_mono = _root.AddComponent<Bhv_MapData>();
|
Selection.activeGameObject = _root;
|
|
var _child = CreateNewGO(Bhv_MapData.NodeName_TriggerList);
|
_child.transform.SetParent(_root.transform);
|
|
_child = CreateNewGO(Bhv_MapData.NodeName_EventList);
|
_child.transform.SetParent(_root.transform);
|
|
_child = CreateNewGO(Bhv_MapData.NodeName_TransferList);
|
_child.transform.SetParent(_root.transform);
|
|
var _goes = FindObjectsOfType(typeof(GameObject)) as GameObject[];
|
foreach (var _go in _goes)
|
{
|
if (_go.layer == LayerUtility.Walkble)
|
{
|
_root.AddComponent<MeshFilter>().sharedMesh = _go.GetComponent<MeshFilter>().sharedMesh;
|
_root.AddComponent<MeshCollider>();
|
_root.transform.position = _go.transform.position;
|
_root.transform.rotation = _go.transform.rotation;
|
_root.transform.localScale = _go.transform.localScale;
|
_root.layer = LayerUtility.Walkble;
|
break;
|
}
|
}
|
}
|
}
|
|
public static GameObject CreateNewGO(string name)
|
{
|
var _go = new GameObject(name);
|
_go.transform.position = Vector3.zero;
|
_go.transform.eulerAngles = Vector3.zero;
|
_go.transform.localScale = Vector3.one;
|
return _go;
|
}
|
|
private GUISkin gUISkin;
|
|
/// <summary>
|
/// This function is called when the object becomes enabled and active.
|
/// </summary>
|
void OnEnable()
|
{
|
target.name = "MapEditor";
|
LS_KEY_SAVEPATH = System.Environment.CurrentDirectory + "/MapEditor/Save";
|
LS_KEY_EXPORTPATH = System.Environment.CurrentDirectory + "/MapEditor/Export";
|
EffectConfig.Init();
|
}
|
|
public override void OnInspectorGUI()
|
{
|
if (GUILayout.Button("测试"))
|
{
|
// Debug.Log("1 & 2 = " + (1 & 2));
|
var _center = Vector3.zero;
|
int _count = 18;
|
int _dropCount = 0;
|
while (_dropCount < _count)
|
{
|
var _cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
_dropCount += 1;
|
}
|
|
}
|
if (gUISkin == null)
|
{
|
gUISkin = AssetDatabase.LoadAssetAtPath<GUISkin>("Assets/Scripts/Core/MapEditor/Editor/EditorResources/EditorSkin.guiskin");
|
}
|
|
serializedObject.Update();
|
|
var _mapData = target as Bhv_MapData;
|
GUILayout.Space(5);
|
|
EditorGUILayout.BeginVertical(gUISkin.box);
|
|
EditorGUILayout.BeginHorizontal(gUISkin.box, GUILayout.Height(24));
|
EditorGUILayout.LabelField("数据ID", gUISkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
_mapData.id = EditorGUILayout.IntField(_mapData.id, gUISkin.textField, GUILayout.Height(22));
|
if (GUILayout.Button("加载", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
LoadJson();
|
}
|
if (GUILayout.Button("保存", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
SaveJson();
|
}
|
if (GUILayout.Button("导出", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
Export();
|
}
|
// if (GUILayout.Button("导入", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
// {
|
// MapData.LoadFormFile(10010);
|
// }
|
EditorGUILayout.EndHorizontal();
|
|
/// --------------------------------------------------------------------------------
|
/// 触发器列表 Start
|
EditorGUILayout.BeginVertical(gUISkin.box);
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
EditorGUI.indentLevel += 1;
|
if (_mapData.triggerList.Count > 0)
|
{
|
_mapData.showTriggerList = EditorGUILayout.Foldout(_mapData.showTriggerList, " 触发器列表", true, gUISkin.customStyles[3]);
|
}
|
else
|
{
|
EditorGUILayout.LabelField("触发器列表", gUISkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(100));
|
GUILayout.FlexibleSpace();
|
}
|
EditorGUI.indentLevel -= 1;
|
if (GUILayout.Button("添加", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
CreateTrigger();
|
_mapData.showTriggerList = true;
|
}
|
EditorGUILayout.EndHorizontal();
|
if (_mapData.showTriggerList)
|
{
|
for (int i = _mapData.triggerList.Count - 1; i >= 0; --i)
|
{
|
var _trigger = _mapData.triggerList[i];
|
if (_trigger == null)
|
{
|
_mapData.triggerList.RemoveAt(i);
|
continue;
|
}
|
if (_trigger.DrawUI(gUISkin))
|
{
|
_mapData.triggerList.RemoveAt(i);
|
DestroyImmediate(_trigger.gameObject);
|
}
|
}
|
}
|
EditorGUILayout.EndVertical();
|
/// 触发器列表 End
|
/// --------------------------------------------------------------------------------
|
|
/// --------------------------------------------------------------------------------
|
/// 事件列表 Start
|
EditorGUILayout.BeginVertical(gUISkin.box);
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
EditorGUI.indentLevel += 1;
|
if (_mapData.eventList.Count > 0)
|
{
|
_mapData.showEventList = EditorGUILayout.Foldout(_mapData.showEventList, " 事件列表", true, gUISkin.customStyles[3]);
|
}
|
else
|
{
|
EditorGUILayout.LabelField("事件列表", gUISkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(100));
|
GUILayout.FlexibleSpace();
|
}
|
EditorGUI.indentLevel -= 1;
|
eventType = (Evt.E_EventType)EditorGUILayout.EnumPopup(eventType, gUISkin.customStyles[1], GUILayout.Height(22), GUILayout.Width(100));
|
if (GUILayout.Button("添加", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
CreateEvent(eventType);
|
_mapData.showEventList = true;
|
}
|
EditorGUILayout.EndHorizontal();
|
if (_mapData.showEventList)
|
{
|
for (int i = _mapData.eventList.Count - 1; i >= 0; --i)
|
{
|
var _event = _mapData.eventList[i];
|
if (_event == null)
|
{
|
_mapData.eventList.RemoveAt(i);
|
continue;
|
}
|
if (_event.DrawUI(gUISkin))
|
{
|
_mapData.eventList.RemoveAt(i);
|
DestroyImmediate(_event.gameObject);
|
}
|
}
|
}
|
EditorGUILayout.EndVertical();
|
/// 事件列表 End
|
/// --------------------------------------------------------------------------------
|
|
/// --------------------------------------------------------------------------------
|
/// 传送点列表 Start
|
EditorGUILayout.BeginVertical(gUISkin.box);
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
EditorGUI.indentLevel += 1;
|
if (_mapData.transferList.Count > 0)
|
{
|
_mapData.showTransferList = EditorGUILayout.Foldout(_mapData.showTransferList, " 传送组列表", true, gUISkin.customStyles[3]);
|
}
|
else
|
{
|
EditorGUILayout.LabelField("传送组列表", gUISkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(100));
|
GUILayout.FlexibleSpace();
|
}
|
EditorGUI.indentLevel -= 1;
|
if (GUILayout.Button("添加", gUISkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
CreateTransferPoint();
|
_mapData.showTransferList = true;
|
}
|
EditorGUILayout.EndHorizontal();
|
if (_mapData.showTransferList)
|
{
|
for (int i = _mapData.transferList.Count - 1; i >= 0; --i)
|
{
|
var _transfer = _mapData.transferList[i];
|
if (_transfer == null)
|
{
|
_mapData.transferList.RemoveAt(i);
|
continue;
|
}
|
if (_transfer.DrawUI(_mapData, gUISkin))
|
{
|
_mapData.transferList.RemoveAt(i);
|
DestroyImmediate(_transfer.gameObject);
|
}
|
}
|
}
|
EditorGUILayout.EndVertical();
|
/// 传送点列表 End
|
/// --------------------------------------------------------------------------------
|
|
/// --------------------------------------------------------------------------------
|
/// 场景物件列表 Start
|
|
/// 场景物件列表 End
|
/// --------------------------------------------------------------------------------
|
|
EditorGUILayout.EndVertical();
|
|
if (GUI.changed)
|
{
|
EditorUtility.SetDirty(target);
|
serializedObject.ApplyModifiedProperties();
|
}
|
}
|
|
private void CreateTrigger()
|
{
|
var _mapData = target as Bhv_MapData;
|
var _id = _mapData.RequestTriggerID();
|
var _trigger = CreateNewGO(Bhv_MapData.NodeName_Trigger + _id);
|
var _triggerBhv = _trigger.AddComponent<Bhv_MapTrigger>();
|
_triggerBhv.id = _id;
|
_triggerBhv.boxCollider = _trigger.AddComponent<BoxCollider>();
|
_trigger.transform.SetParent(_mapData.transform.Find(Bhv_MapData.NodeName_TriggerList));
|
_mapData.triggerList.Add(_triggerBhv);
|
}
|
|
private void CreateEvent(Evt.E_EventType type)
|
{
|
var _mapData = target as Bhv_MapData;
|
|
if (type == Evt.E_EventType.Enemy)
|
{
|
int _id = _mapData.RequestEventID();
|
var _event = CreateNewGO(Bhv_MapData.NodeName_Event + "RefreshEvemy_" + _id);
|
var _eventBhv = _event.AddComponent<Bhv_Evt_RefreshMonster>();
|
_eventBhv.id = _id;
|
_eventBhv.type = type;
|
_event.transform.SetParent(_mapData.transform.Find(Bhv_MapData.NodeName_EventList));
|
_mapData.eventList.Add(_eventBhv);
|
|
_event.transform.position = SceneCameraRaycastPosition();
|
}
|
else if (type == Evt.E_EventType.SceneObject)
|
{
|
int _id = _mapData.RequestEventID();
|
var _event = CreateNewGO(Bhv_MapData.NodeName_Event + "RefreshSceneObject_" + _id);
|
var _eventBhv = _event.AddComponent<Bhv_Evt_RefreshSceneObject>();
|
_eventBhv.id = _id;
|
_eventBhv.type = type;
|
_event.transform.SetParent(_mapData.transform.Find(Bhv_MapData.NodeName_EventList));
|
_mapData.eventList.Add(_eventBhv);
|
|
_event.transform.position = SceneCameraRaycastPosition();
|
}
|
}
|
|
private void CreateTransferPoint()
|
{
|
var _mapData = target as Bhv_MapData;
|
var _transfer = CreateNewGO(Bhv_MapData.NodeName_Transfer + _mapData.transferList.Count);
|
var _transferBhv = _transfer.AddComponent<Bhv_Trasfer>();
|
_transfer.transform.SetParent(_mapData.transform.Find(Bhv_MapData.NodeName_TransferList));
|
_mapData.transferList.Add(_transferBhv);
|
}
|
|
private void Save()
|
{
|
var _mapData = target as Bhv_MapData;
|
string _defaultPath = EditorPrefs.GetString(LS_KEY_SAVEPATH, System.Environment.CurrentDirectory);
|
string _path = EditorUtility.SaveFilePanel("保存数据", _defaultPath, "map_" + _mapData.id, "ed");
|
if (string.IsNullOrEmpty(_path))
|
{
|
return;
|
}
|
using (var _fileStream = File.OpenWrite(_path))
|
{
|
using (var _binaryWriter = new BinaryWriter(_fileStream))
|
{
|
_mapData.Save(_binaryWriter);
|
EditorPrefs.SetString(LS_KEY_SAVEPATH, Directory.GetParent(_path).FullName);
|
}
|
}
|
}
|
|
private void SaveJson()
|
{
|
var _mapData = target as Bhv_MapData;
|
string _defaultPath = EditorPrefs.GetString(LS_KEY_SAVEPATH, System.Environment.CurrentDirectory);
|
string _path = EditorUtility.SaveFilePanel("保存数据", _defaultPath, "map_" + _mapData.id, "json");
|
if (string.IsNullOrEmpty(_path))
|
{
|
return;
|
}
|
EditorPrefs.SetString(LS_KEY_SAVEPATH, Path.GetDirectoryName(_path));
|
File.WriteAllText(_path, _mapData.SaveJson());
|
}
|
|
private void LoadJson()
|
{
|
|
var _defaultPath = EditorPrefs.GetString(LS_KEY_SAVEPATH);
|
if (string.IsNullOrEmpty(_defaultPath))
|
{
|
_defaultPath = System.Environment.CurrentDirectory;
|
}
|
var _loadPath = EditorUtility.OpenFilePanel("读取Json数据", _defaultPath, "json");
|
if (string.IsNullOrEmpty(_loadPath))
|
{
|
return;
|
}
|
|
var _mapData = target as Bhv_MapData;
|
_mapData.Clear();
|
|
var _strJson = File.ReadAllText(_loadPath);
|
var _jsonData = LitJson.JsonMapper.ToObject(_strJson);
|
|
_mapData.LoadJson(_jsonData);
|
}
|
|
private void Export()
|
{
|
var _mapData = target as Bhv_MapData;
|
string _defaultPath = EditorPrefs.GetString(LS_KEY_EXPORTPATH, Application.dataPath + "/ResourcesOut/Refdata/Config/");
|
string _path = EditorUtility.SaveFilePanel("导出数据", _defaultPath, MapData.MapEditorData_Suffix + _mapData.id, "txt");
|
if (string.IsNullOrEmpty(_path))
|
{
|
return;
|
}
|
using (var _fileStream = File.OpenWrite(_path))
|
{
|
using (var _binaryWriter = new BinaryWriter(_fileStream, System.Text.Encoding.UTF8))
|
{
|
_mapData.Export(_binaryWriter);
|
EditorPrefs.SetString(LS_KEY_EXPORTPATH, Directory.GetParent(_path).FullName);
|
}
|
}
|
}
|
|
private void Load()
|
{
|
var _mapData = target as Bhv_MapData;
|
string _defaultPath = EditorPrefs.GetString(LS_KEY_SAVEPATH, System.Environment.CurrentDirectory);
|
string _path = EditorUtility.OpenFilePanel("打开数据", _defaultPath, "ed");
|
if (string.IsNullOrEmpty(_path))
|
{
|
return;
|
}
|
|
_mapData.Clear();
|
|
using (var _fileStream = File.OpenRead(_path))
|
{
|
using (var _binaryReader = new BinaryReader(_fileStream, System.Text.Encoding.UTF8))
|
{
|
_mapData.Load(_binaryReader);
|
EditorPrefs.SetString(LS_KEY_SAVEPATH, Directory.GetParent(_path).FullName);
|
|
foreach (var _event in _mapData.eventList)
|
{
|
if (_event.id >= _mapData.GetEventSeed())
|
{
|
_mapData.SetEventID(_event.id + 1);
|
}
|
}
|
|
foreach (var _trigger in _mapData.triggerList)
|
{
|
if (_trigger.id >= _mapData.GetTriggerSeed())
|
{
|
_mapData.SetTriggerID(_trigger.id + 1);
|
}
|
}
|
}
|
}
|
}
|
|
public static Vector3 SceneCameraRaycastPosition()
|
{
|
RaycastHit _hit;
|
Ray _ray = SceneView.lastActiveSceneView.camera.ViewportPointToRay(new Vector3(.5f, .5f, 0));
|
if (Physics.Raycast(_ray, out _hit, 1000f, LayerUtility.WalkbleMask))
|
{
|
return _hit.point;
|
}
|
|
return Vector3.zero;
|
}
|
}
|
}
|