Files
plugin-library/Assets/10.StoryEditor/Editor/Graph/GraphCreateWindow.cs
mzh f5a79aabf8 【m】10. StoryEditor [1.1.0] - 2026-01-08
### Added
- 新增剧本设置窗口,在窗口中打开和导出剧本
### Fixed
- 修改Graph创建时的默认位置,防止热更分包导致脚本丢失报错
- 修改Graph导出时对加载器的加载逻辑,解决跨包无法加载的问题
2026-01-08 17:31:26 +08:00

137 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
// ReSharper disable Unity.PerformanceCriticalCodeInvocation
namespace Stary.Evo.StoryEditor.Editor
{
public class GraphCreateWindow : EditorWindow
{
private int _selectedIndex;
private string _scriptName = "graph";
private bool _showTip;
private string _tip;
private string[] _options = Array.Empty<string>();
private Dictionary<string, string> _paths = new();
[MenuItem("Evo/剧本编辑器/创建剧本")]
private static void Open()
{
// 打开一个浮动窗口
GetWindow<GraphCreateWindow>( "创建配置" ) ;
}
private void OnEnable()
{
minSize = maxSize = new Vector2(300, 200);
// 记录Package地址并返回选项
var packages = GraphEditorTools.GetPackages();
_paths.Clear();
packages.ForEach(path => _paths.Add(Path.GetFileName(path), path));
_options = _paths.Keys.ToArray();
}
private void OnGUI()
{
GUILayout.Space(15);
EditorGUILayout.BeginHorizontal();
GUILayout.Space(10);
EditorGUILayout.BeginVertical();
// Package选项
_selectedIndex = GraphEditorTools.Popup("请选择剧本所在的Package", _selectedIndex, _options);
GUILayout.Space(15);
EditorGUILayout.LabelField( "请输入剧本名称" , EditorStyles.boldLabel ) ;
var newName = EditorGUILayout.TextField(_scriptName);
if (_scriptName != newName)
{
_scriptName = newName;
_showTip = false;
}
if (_showTip)
{
GUIStyle redBold = new GUIStyle(EditorStyles.boldLabel)
{
normal = { textColor = Color.red }
};
EditorGUILayout.LabelField(_tip, redBold) ;
}
GUILayout.Space(15);
// 创建按钮
if (GUILayout.Button("创建剧本"))
{
try
{
CreateScriptGraph(_options[_selectedIndex]);
}
catch (Exception e)
{
Debug.LogException(e);
}
}
EditorGUILayout.EndVertical();
GUILayout.Space(10);
EditorGUILayout.EndHorizontal();
}
/// <summary>
/// 创建剧本
/// </summary>
/// <param name="packageID">包体ID</param>
private void CreateScriptGraph(string packageID)
{
// 检查剧本名称是否有效
if (string.IsNullOrEmpty(_scriptName))
{
_tip = "剧本名称不能为空";
_showTip = true;
return;
}
if (_paths.TryGetValue(packageID, out var path))
{
// 包体目录排空
var graphDir = Path.Combine(Application.dataPath, "StoryEditor", "Graphs",
$"{(string.IsNullOrEmpty(packageID) ? "default" : packageID)}");
if (!Directory.Exists(graphDir))
{
Directory.CreateDirectory(graphDir);
}
// 检查资源存在性
var graphFilePath = Path.Combine(graphDir.Replace(Application.dataPath,"Assets"), $"{_scriptName}.asset");
var existAsset = AssetDatabase.LoadAssetAtPath<ScriptGraph>(graphFilePath);
if (existAsset)
{
_tip = "该名称的剧本已存在";
_showTip = true;
return;
}
// 创建剧本图表
var graphPath = Path.Combine(path, "Main","Res","Graphs", $"{_scriptName}.sg.json").Replace(Application.dataPath, "").Replace('\\', '/');
graphPath = graphPath[1..];
var graph = CreateInstance<ScriptGraph>();
graph.packageID = packageID;
graph.graphPath = graphPath;
AssetDatabase.CreateAsset(graph, graphFilePath);
}
else
{
Debug.LogError($"未记录Package路径{packageID}");
}
}
}
}