NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Level/LevelEditor.cs

109 lines
2.7 KiB
C#

using System.Diagnostics;
using System.IO;
using Framework;
using Gameplay.Level;
using PhxhSDK.Phxh;
using Sirenix.OdinInspector;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using Debug = UnityEngine.Debug;
[ExecuteAlways]
public class LevelEditor : MonoBehaviour
{
private const string LEVEL_DATA_NAME = "LevelData";
public LevelData LevelData { get; private set; }
public TextAsset LevelDataJson
{
get => _levelDataJson;
private set
{
var data = JsonToLevelData(value);
_levelDataJson = value;
LevelData = data;
}
}
[SerializeField]
[LabelText("关卡数据")]
[OnValueChanged("OnLevelDataJsonChanged")]
private TextAsset _levelDataJson;
private void OnLevelDataJsonChanged()
{
LevelDataJson = _levelDataJson;
}
[Button("创建关卡数据")]
[Conditional("UNITY_EDITOR")]
private void CreateLevelData()
{
#if UNITY_EDITOR
var scene = gameObject.scene;
var levelDataDir = Path.GetDirectoryName(Constants.LEVEL_CONFIG_FORMAT_PATH);
var count = AssetDatabase.FindAssets("t:TextAsset", new[] { levelDataDir }).Length;
var dataName = $"{scene.name}_{count + 1}";
var dataPath = $"{levelDataDir}/{dataName}.json";
using (var fileStream = File.Create(dataPath))
{
}
AssetDatabase.Refresh();
var textAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(dataPath);
EditorGUIUtility.PingObject(textAsset);
if (_levelDataJson == null)
LevelDataJson = textAsset;
#endif
}
private LevelData JsonToLevelData(TextAsset jsonText)
{
#if UNITY_EDITOR
LevelData levelData = null;
if (jsonText != null)
{
var jsonStr = jsonText.text;
if (string.IsNullOrEmpty(jsonStr))
{
levelData = new();
}
else
{
var path = AssetDatabase.GetAssetPath(jsonText);
levelData = JsonHelper.LoadJson<LevelData>(path);
}
}
return levelData;
#else
return null;
#endif
}
private void Awake()
{
LevelData = JsonToLevelData(_levelDataJson);
}
private void OnDestroy()
{
SaveLevelData();
}
public void SaveLevelData()
{
#if UNITY_EDITOR
if (_levelDataJson != null && !Application.isPlaying)
{
var path = AssetDatabase.GetAssetPath(_levelDataJson);
JsonHelper.SaveJson(path, LevelData);
AssetDatabase.Refresh();
Debug.Log($"保存关卡数据成功!");
}
#endif
}
}