using System.Collections.Generic; using PhxhSDK; using PhxhSDK.AOT; using UnityEngine; using PhxhSDK.Phxh; using Sirenix.OdinInspector; #if UNITY_EDITOR using UnityEditor; using UnityEngine.SceneManagement; #endif [ExecuteAlways] public class LegionLevelEditor : MonoBehaviour { public LegionLevelData LevelData { get; private set; } public TextAsset LevelDataJson { get => _levelDataJson; set { var data = JsonToLevelData(value); _levelDataJson = value; LevelData = data; } } [SerializeField] [LabelText("关卡数据")] [OnValueChanged("OnLevelDataJsonChanged")] private TextAsset _levelDataJson; private void OnLevelDataJsonChanged() { LevelDataJson = _levelDataJson; } private LegionLevelData JsonToLevelData(TextAsset jsonText) { #if UNITY_EDITOR LegionLevelData levelData = null; if (jsonText != null) { var jsonStr = jsonText.text; if (string.IsNullOrEmpty(jsonStr)) { levelData = new(); } else { var path = AssetDatabase.GetAssetPath(jsonText); levelData = JsonHelper.LoadJson(path); } } return levelData; #else return null; #endif } private void Awake() { if (BusyWrapper.isBusy) return; LevelData = JsonToLevelData(_levelDataJson); } private void OnDestroy() { if (BusyWrapper.isBusy) return; SaveLevelData(); } public void SaveLevelData() { #if UNITY_EDITOR var currentScene = gameObject.scene; if (currentScene.name.Contains("_PostProcess")) return; if (_levelDataJson != null && !Application.isPlaying && currentScene == SceneManager.GetActiveScene()) { var path = AssetDatabase.GetAssetPath(_levelDataJson); JsonHelper.SaveJson(path, LevelData); AssetDatabase.Refresh(); SaveDataForServer(); DebugUtil.Log("保存军团关卡数据成功!"); } #endif } #if UNITY_EDITOR [SerializeField] [LabelText("服务器所用数据")] private TextAsset _levelDataJsonForServer; public LegionDataForServer LevelDataForServer; public TextAsset LevelDataJsonForServer { get => _levelDataJsonForServer; set { var data = JsonToLevelDataServer(value); _levelDataJsonForServer = value; LevelDataForServer = data; } } private LegionDataForServer JsonToLevelDataServer(TextAsset jsonText) { LegionDataForServer levelData = null; if (jsonText != null) { var jsonStr = jsonText.text; if (string.IsNullOrEmpty(jsonStr)) { levelData = new(); } else { var path = AssetDatabase.GetAssetPath(jsonText); levelData = JsonHelper.LoadJson(path); } } return levelData; } private void SaveDataForServer() { var currentScene = gameObject.scene; if (currentScene.name.Contains("_PostProcess")) return; if (_levelDataJsonForServer != null && !Application.isPlaying && currentScene == SceneManager.GetActiveScene()) { var path = AssetDatabase.GetAssetPath(_levelDataJsonForServer); JsonHelper.SaveJson(path, LevelDataForServer); AssetDatabase.Refresh(); } } /// /// 服务器所用数据 /// public class LegionDataForServer { public int _width; public int _height; public float radius; public float length; public List buildings; public List linkBuildings; public List born_pos_a; public List born_pos_b; public List speed_hex; public class BuildingsForServer { public int id; public int x; public int z; public int building; } public class PositionForServer { public int x; public int z; } public class LinkBuilding { public int build_a; public int build_b; } } #endif }