复制粘贴删除

This commit is contained in:
SoulliesOfficial
2025-02-19 19:01:21 -05:00
parent 28e8d54a7b
commit 0d69138e1b
11 changed files with 190 additions and 45 deletions

File diff suppressed because one or more lines are too long

View File

@@ -12,8 +12,9 @@ GameObject:
- component: {fileID: 6763562507922544190} - component: {fileID: 6763562507922544190}
- component: {fileID: 8976681661139621974} - component: {fileID: 8976681661139621974}
- component: {fileID: 4366070571324766663} - component: {fileID: 4366070571324766663}
- component: {fileID: 6485919050370088522}
m_Layer: 5 m_Layer: 5
m_Name: GoToElementButton m_Name: DeleteButton
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -36,7 +37,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 165.00002, y: 0} m_AnchoredPosition: {x: 140, y: 0}
m_SizeDelta: {x: 30, y: 30} m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6763562507922544190 --- !u!222 &6763562507922544190
@@ -121,6 +122,18 @@ MonoBehaviour:
m_OnClick: m_OnClick:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
--- !u!114 &6485919050370088522
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1975073476707558943}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e6089dfd1807d473f80c6597f9b063dc, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2037738709231332070 --- !u!1 &2037738709231332070
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -156,8 +169,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -25, y: 0} m_AnchoredPosition: {x: 3, y: 0}
m_SizeDelta: {x: 360, y: 30} m_SizeDelta: {x: 310, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &3176678068745517715 --- !u!1 &3176678068745517715
GameObject: GameObject:
@@ -404,8 +417,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -0.000024795532, y: 0} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 300, y: 30} m_SizeDelta: {x: 250, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8557913501037026989 --- !u!222 &8557913501037026989
CanvasRenderer: CanvasRenderer:
@@ -554,7 +567,7 @@ MonoBehaviour:
m_OnCullStateChanged: m_OnCullStateChanged:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_text: '>' m_text: X
m_isRightToLeft: 0 m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
@@ -794,7 +807,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 30} m_SizeDelta: {x: 310, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &7456916159291301029 --- !u!114 &7456916159291301029
MonoBehaviour: MonoBehaviour:
@@ -821,7 +834,7 @@ MonoBehaviour:
tabMainRect: {fileID: 4977671911614392296} tabMainRect: {fileID: 4977671911614392296}
tabButton: {fileID: 2984872097914611565} tabButton: {fileID: 2984872097914611565}
expandButton: {fileID: 2749324553351544168} expandButton: {fileID: 2749324553351544168}
gotoButton: {fileID: 4366070571324766663} deleteButton: {fileID: 6485919050370088522}
tabButtonText: {fileID: 2880005684537739809} tabButtonText: {fileID: 2880005684537739809}
--- !u!114 &-1606289094185495319 --- !u!114 &-1606289094185495319
MonoBehaviour: MonoBehaviour:
@@ -879,7 +892,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -165.00003, y: 0} m_AnchoredPosition: {x: -140.00003, y: 0}
m_SizeDelta: {x: 30, y: 30} m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1982148510309425424 --- !u!222 &1982148510309425424

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class DoubleCheckButton : MonoBehaviour, IPointerExitHandler
{
private Button button;
private bool isConfirmState = false;
public UnityAction onConfirm;
void Awake()
{
button = GetComponent<Button>();
button.onClick.AddListener(OnButtonClick);
}
private void OnButtonClick()
{
if (!isConfirmState)
{
// 第一次点击,进入确认状态(变红)
isConfirmState = true;
button.image.color = Color.red;
}
else
{
// 第二次点击,执行命令
ExecuteCommand();
ResetButtonState();
}
}
public void OnPointerExit(PointerEventData eventData)
{
// 鼠标移出时,重置按钮状态
ResetButtonState();
}
private void ExecuteCommand()
{
onConfirm?.Invoke();
}
private void ResetButtonState()
{
isConfirmState = false;
button.image.color = Color.white;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e6089dfd1807d473f80c6597f9b063dc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +1,10 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using Michsky.MUIP;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
namespace Ichni.Editor namespace Ichni.Editor
@@ -18,13 +20,13 @@ namespace Ichni.Editor
public int tabLayer; public int tabLayer;
public bool isSelected; public bool isSelected;
public bool isExpanded; public bool isExpanded;
public RectTransform tabRect; public RectTransform tabRect;
public LayoutElement layoutElement; public LayoutElement layoutElement;
public RectTransform tabMainRect; public RectTransform tabMainRect;
public Button tabButton; public Button tabButton;
public Button expandButton; public Button expandButton;
public Button gotoButton; public DoubleCheckButton deleteButton;
public TMP_Text tabButtonText; public TMP_Text tabButtonText;
public void SetTab(GameElement targetElement, GameElement parentElement) public void SetTab(GameElement targetElement, GameElement parentElement)
@@ -57,16 +59,21 @@ namespace Ichni.Editor
for (int i = 1; i <= this.tabLayer; i++) for (int i = 1; i <= this.tabLayer; i++)
{ {
float lineX = 30 * i - 10; float lineX = 30 * i - 15;
Instantiate(indentationLinePrefab, tabRect).GetComponent<RectTransform>().anchoredPosition = new Vector2(lineX, 0); Instantiate(indentationLinePrefab, tabRect).GetComponent<RectTransform>().anchoredPosition = new Vector2(lineX, 0);
} }
} }
float posX = -25 +( 30 * tabLayer); float posX = (30 * tabLayer);
tabMainRect.anchoredPosition = new Vector2(posX, tabMainRect.anchoredPosition.y); tabMainRect.anchoredPosition = new Vector2(posX, tabMainRect.anchoredPosition.y);
tabButton.onClick.AddListener(SelectGameElement); tabButton.onClick.AddListener(SelectGameElement);
expandButton.onClick.AddListener(ExpandOrFold); expandButton.onClick.AddListener(ExpandOrFold);
deleteButton.onConfirm = () =>
{
connectedGameElement.parentElement.childElementList.Remove(connectedGameElement);
connectedGameElement.Delete();
};
} }
} }
@@ -86,6 +93,7 @@ namespace Ichni.Editor
private void SelectGameElement() private void SelectGameElement()
{ {
EditorManager.instance.operationManager.SelectElement(connectedGameElement);
EditorManager.instance.uiManager.inspector.SetInspector(connectedGameElement); EditorManager.instance.uiManager.inspector.SetInspector(connectedGameElement);
} }

View File

@@ -206,7 +206,6 @@ namespace Ichni.RhythmGame
public override void ExecuteBM() public override void ExecuteBM()
{ {
attachedElement = GameElement_BM.GetElement(attachedElementGuid); attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Debug.Log(attachedElementGuid);
(attachedElement as IHaveTransformSubmodule).transformSubmodule = new TransformSubmodule(attachedElement, originalPosition, originalEulerAngles, originalScale); (attachedElement as IHaveTransformSubmodule).transformSubmodule = new TransformSubmodule(attachedElement, originalPosition, originalEulerAngles, originalScale);
attachedElement.submoduleList.Add((attachedElement as IHaveTransformSubmodule).transformSubmodule); attachedElement.submoduleList.Add((attachedElement as IHaveTransformSubmodule).transformSubmodule);
} }

View File

@@ -124,7 +124,7 @@ namespace Ichni.RhythmGame
/// </summary> /// </summary>
public virtual void Delete() public virtual void Delete()
{ {
if (this.childElementList != null) if (childElementList is { Count: > 0 })
{ {
for (int i = 0; i < childElementList.Count; i++) for (int i = 0; i < childElementList.Count; i++)
{ {
@@ -133,13 +133,16 @@ namespace Ichni.RhythmGame
} }
OnDelete(); OnDelete();
#if UNITY_EDITOR LogWindow.Log("Deleted element: " + elementName);
Debug.Log("Delete " + elementName + "(" + elementGuid + ")");
#endif
EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除 EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除
this.parentElement.childElementList.Remove(this);
Destroy(connectedTab.gameObject); if (connectedTab != null)
{
Destroy(connectedTab.gameObject);
}
Destroy(gameObject); //销毁 Destroy(gameObject); //销毁
} }
} }

View File

@@ -17,6 +17,7 @@ namespace Ichni
public ProjectManager projectManager; public ProjectManager projectManager;
public EditorUIManager uiManager; public EditorUIManager uiManager;
public EditorSettings editorSettings; public EditorSettings editorSettings;
public OperationManager operationManager;
public BackgroundController backgroundController; public BackgroundController backgroundController;
public CameraManager cameraManager; public CameraManager cameraManager;
@@ -32,6 +33,8 @@ namespace Ichni
{ {
instance = this; instance = this;
projectManager = new ProjectManager(); projectManager = new ProjectManager();
operationManager = new OperationManager();
if (!ES3.FileExists(Application.streamingAssetsPath + "/EditorSettings.es3")) if (!ES3.FileExists(Application.streamingAssetsPath + "/EditorSettings.es3"))
{ {
editorSettings = new EditorSettings(300, 100, 100); editorSettings = new EditorSettings(300, 100, 100);

View File

@@ -52,6 +52,14 @@ namespace Ichni.Editor
EditorManager.instance.projectManager.exportManager.Export(); EditorManager.instance.projectManager.exportManager.Export();
} }
if (Keyboard.current.cKey.wasPressedThisFrame)
{
EditorManager.instance.operationManager.copyPasteModule.CopyElement(EditorManager.instance.operationManager.currentSelectedElement);
}
else if (Keyboard.current.vKey.wasPressedThisFrame)
{
EditorManager.instance.operationManager.copyPasteModule.PasteElement(EditorManager.instance.operationManager.currentSelectedElement);
}
if (Keyboard.current.digit1Key.wasPressedThisFrame) if (Keyboard.current.digit1Key.wasPressedThisFrame)
{ {

View File

@@ -1,18 +1,70 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine; using UnityEngine;
public class OperationManager : MonoBehaviour namespace Ichni.Editor
{ {
// Start is called before the first frame update public class OperationManager
void Start()
{ {
public GameElement currentSelectedElement { get; private set; }
public CopyPasteModule copyPasteModule;
public OperationManager()
{
copyPasteModule = new CopyPasteModule();
}
public void SelectElement(GameElement gameElement)
{
currentSelectedElement = gameElement;
}
} }
// Update is called once per frame public class CopyPasteModule
void Update()
{ {
public GameElement copiedElement;
public void CopyElement(GameElement gameElement)
{
LogWindow.Log("Copied element: " + gameElement.elementName);
copiedElement = gameElement;
}
public void PasteElement(GameElement parentElement)
{
if (copiedElement == null)
{
LogWindow.Log("No element copied.");
return;
}
LogWindow.Log("Pasted element: " + copiedElement.elementName + " to " + parentElement.elementName);
AffiliatedPaste(copiedElement, parentElement);
}
private GameElement AffiliatedPaste(GameElement gameElement, GameElement parent)
{
gameElement.SaveBM();
GameElement pastedElement = (gameElement.matchedBM as GameElement_BM).DuplicateBM(parent);
gameElement.submoduleList.ForEach(submodule =>
{
submodule.SaveBM();
(submodule.matchedBM as Submodule_BM).DuplicateBM(pastedElement);
});
if (gameElement.childElementList != null)
{
for (int i = 0; i < gameElement.childElementList.Count; i++)
{
AffiliatedPaste(gameElement.childElementList[i], pastedElement);
}
}
return pastedElement;
}
} }
} }