feat: Add SkillModule and WeaponModule for managing skills and weapons
- Implemented SkillModule to manage FormSkillSO assets with a detailed UI for editing and displaying skill properties. - Implemented WeaponModule to manage WeaponSO assets with a detailed UI for editing and displaying weapon properties. - Created AssetOperations class for centralized CRUD operations on ScriptableObject assets, including create, rename, delete, and clone functionalities. - Added DetailHeader for displaying and renaming asset names in the UI. - Introduced SoListPane for a reusable ScriptableObject list panel with search functionality and context menus. - Added meta files for all new scripts to ensure proper asset management in Unity.
This commit is contained in:
123
Assets/_Game/Scripts/Editor/Shared/DetailHeader.cs
Normal file
123
Assets/_Game/Scripts/Editor/Shared/DetailHeader.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace BaseGames.Editor
|
||||
{
|
||||
/// <summary>
|
||||
/// 详情区顶部标题行:显示资产名称,双击或按 ✏ 进入行内重命名。
|
||||
/// </summary>
|
||||
public class DetailHeader : VisualElement
|
||||
{
|
||||
// ── 事件 ─────────────────────────────────────────────────────────────
|
||||
/// <summary>用户确认重命名时触发,参数为新名称字符串。</summary>
|
||||
public event Action<string> RenameRequested;
|
||||
|
||||
// ── 私有字段 ──────────────────────────────────────────────────────────
|
||||
private Label _nameLabel;
|
||||
private TextField _renameField;
|
||||
private bool _renaming;
|
||||
|
||||
// ── 构造 ─────────────────────────────────────────────────────────────
|
||||
|
||||
public DetailHeader()
|
||||
{
|
||||
style.flexDirection = FlexDirection.Row;
|
||||
style.alignItems = Align.Center;
|
||||
style.paddingLeft = 12;
|
||||
style.paddingRight = 8;
|
||||
style.paddingTop = 10;
|
||||
style.paddingBottom = 10;
|
||||
style.borderBottomWidth = 1;
|
||||
style.borderBottomColor = new StyleColor(new Color(0.5f, 0.5f, 0.5f, 0.2f));
|
||||
|
||||
// 名称 Label
|
||||
_nameLabel = new Label("(未选中)");
|
||||
_nameLabel.style.flexGrow = 1;
|
||||
_nameLabel.style.fontSize = 15;
|
||||
_nameLabel.style.unityFontStyleAndWeight = FontStyle.Bold;
|
||||
_nameLabel.RegisterCallback<MouseDownEvent>(e =>
|
||||
{
|
||||
if (e.clickCount == 2) BeginRename();
|
||||
});
|
||||
Add(_nameLabel);
|
||||
|
||||
// 重命名输入框(默认隐藏)
|
||||
_renameField = new TextField();
|
||||
_renameField.style.flexGrow = 1;
|
||||
_renameField.style.fontSize = 15;
|
||||
_renameField.style.display = DisplayStyle.None;
|
||||
_renameField.RegisterCallback<KeyDownEvent>(e =>
|
||||
{
|
||||
if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter)
|
||||
{
|
||||
e.StopPropagation();
|
||||
CommitRename();
|
||||
}
|
||||
else if (e.keyCode == KeyCode.Escape)
|
||||
{
|
||||
e.StopPropagation();
|
||||
CancelRename();
|
||||
}
|
||||
});
|
||||
_renameField.RegisterCallback<FocusOutEvent>(_ => CommitRename());
|
||||
Add(_renameField);
|
||||
|
||||
// 编辑按钮
|
||||
var btnEdit = new Button(BeginRename) { text = "✏", tooltip = "重命名(双击名称也可触发)" };
|
||||
btnEdit.style.width = 24;
|
||||
btnEdit.style.height = 24;
|
||||
btnEdit.style.marginLeft = 6;
|
||||
btnEdit.style.paddingLeft = 0;
|
||||
btnEdit.style.paddingRight = 0;
|
||||
btnEdit.style.fontSize = 13;
|
||||
Add(btnEdit);
|
||||
}
|
||||
|
||||
// ── 公共 API ──────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>绑定新资产,更新标题显示。</summary>
|
||||
public void SetAsset(UnityEngine.Object asset)
|
||||
{
|
||||
CancelRename();
|
||||
_nameLabel.text = asset != null ? asset.name : "(未选中)";
|
||||
}
|
||||
|
||||
// ── 内部逻辑 ──────────────────────────────────────────────────────────
|
||||
|
||||
private void BeginRename()
|
||||
{
|
||||
if (_renaming) return;
|
||||
_renaming = true;
|
||||
_renameField.value = _nameLabel.text;
|
||||
_nameLabel.style.display = DisplayStyle.None;
|
||||
_renameField.style.display = DisplayStyle.Flex;
|
||||
schedule.Execute(() =>
|
||||
{
|
||||
_renameField.Focus();
|
||||
_renameField.SelectAll();
|
||||
});
|
||||
}
|
||||
|
||||
private void CommitRename()
|
||||
{
|
||||
if (!_renaming) return;
|
||||
_renaming = false;
|
||||
_nameLabel.style.display = DisplayStyle.Flex;
|
||||
_renameField.style.display = DisplayStyle.None;
|
||||
|
||||
var newName = _renameField.value.Trim();
|
||||
if (!string.IsNullOrEmpty(newName) && newName != _nameLabel.text)
|
||||
RenameRequested?.Invoke(newName);
|
||||
}
|
||||
|
||||
private void CancelRename()
|
||||
{
|
||||
if (!_renaming) return;
|
||||
_renaming = false;
|
||||
_nameLabel.style.display = DisplayStyle.Flex;
|
||||
_renameField.style.display = DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user