153 lines
8.2 KiB
C#
153 lines
8.2 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Studio.AssetTool;
|
|
using Studio.HierarchyTree;
|
|
using Studio.Manage;
|
|
using Studio.Util;
|
|
|
|
namespace Studio.Command
|
|
{
|
|
public class CopyObjectCommand : IReversibleCommand
|
|
{
|
|
private List<ConnectedAsset> copyList;
|
|
private CustomAssetConnector connector;
|
|
|
|
public CopyObjectCommand()
|
|
{
|
|
|
|
}
|
|
|
|
public string id { get => "Copy Object"; set => throw new System.NotImplementedException(); }
|
|
|
|
public bool CanExecute()
|
|
{
|
|
throw new System.NotImplementedException();
|
|
}
|
|
|
|
public void Execute()
|
|
{
|
|
var renderObjectHandler = ManagerHub.instance.Get<RenderObjectHandler>();
|
|
connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
|
|
|
if (renderObjectHandler.selectedRenderObjects.Count == 0)
|
|
return;
|
|
|
|
List<ConnectedAsset> copySources = new List<ConnectedAsset>();
|
|
copyList = new List<ConnectedAsset>();
|
|
for (int i = 0; i < renderObjectHandler.selectedRenderObjects.Count; i++)
|
|
{
|
|
ConnectedAsset searchAsset = connector.connectedAssets.Find((x) => x.renderObject == renderObjectHandler.selectedRenderObjects[i]);
|
|
copySources.Add(searchAsset);
|
|
ConnectedAsset copyAsset = new ConnectedAsset();
|
|
copyList.Add(copyAsset);
|
|
connector.connectedAssets.Add(copyAsset);
|
|
}
|
|
|
|
for (int i = 0; i < copyList.Count; i++)
|
|
{
|
|
ConnectedAsset copySource = copySources[i];
|
|
ConnectedAsset copyAsset = copyList[i];
|
|
if (copyAsset.hierarchyItem == null)
|
|
{
|
|
GameObject copyObject = Object.Instantiate(connector.renderObjectPrefab);
|
|
copyAsset.assetData = copySource.assetData;
|
|
copyAsset.hierarchyItem = copySource.hierarchyItem.Copy();
|
|
copyAsset.renderObject = copyObject.GetComponent<CustomAssetRenderObject>();
|
|
copyAsset.renderObject.getBounds = copySource.assetData.GetCombinedBoundary;
|
|
copyAsset.renderObject.onTransformChanged = copySource.assetData.OnTransformDataChanged;
|
|
copyAsset.renderObject.instantiateObject = copySource.assetData.InstantiateLoadedObject;
|
|
copyAsset.renderObject.CreateRenderObjectAndResizeBoundary();
|
|
copyAsset.hierarchyItem.linkedObject = copyObject;
|
|
copyAsset.renderObject.transform.position = copySource.renderObject.transform.position;
|
|
copyAsset.renderObject.transform.rotation = copySource.renderObject.transform.rotation;
|
|
copyAsset.renderObject.transform.localScale = copySource.renderObject.transform.localScale;
|
|
//copyAsset.renderObject.OnOverlabBegin += connector.interferedObjectManager.AddInterferedPair;
|
|
//copyAsset.renderObject.OnOverlabEnd += connector.interferedObjectManager.RemoveInterferedPair;
|
|
|
|
List <Transform> lastParent = new List<Transform>();
|
|
for (int j = 0; j < copyAsset.hierarchyItem.layerNum + 1; j++)
|
|
{
|
|
lastParent.Add(copyAsset.renderObject.transform);
|
|
}
|
|
|
|
List<HierarchyItem> srcChildren = copySource.hierarchyItem.GetAll(true);
|
|
List<HierarchyItem> dstChildren = copyAsset.hierarchyItem.GetAll(true);
|
|
for (int k = 0; k < srcChildren.Count; k++)
|
|
{
|
|
ConnectedAsset childSource = connector.connectedAssets.Find((x) => x.hierarchyItem == srcChildren[k]);
|
|
GameObject copyChildObject = Object.Instantiate(connector.renderObjectPrefab);
|
|
ConnectedAsset childAsset = new ConnectedAsset();
|
|
childAsset.assetData = childSource.assetData;
|
|
childAsset.hierarchyItem = dstChildren[k];
|
|
childAsset.renderObject = copyChildObject.GetComponent<CustomAssetRenderObject>();
|
|
childAsset.renderObject.getBounds = childAsset.assetData.GetCombinedBoundary;
|
|
childAsset.renderObject.onTransformChanged = childAsset.assetData.OnTransformDataChanged;
|
|
childAsset.renderObject.instantiateObject = childSource.assetData.InstantiateLoadedObject;
|
|
childAsset.renderObject.CreateRenderObjectAndResizeBoundary();
|
|
childAsset.hierarchyItem.linkedObject = copyChildObject;
|
|
childAsset.renderObject.transform.position = childSource.renderObject.transform.position;
|
|
childAsset.renderObject.transform.rotation = childSource.renderObject.transform.rotation;
|
|
childAsset.renderObject.transform.localScale = childSource.renderObject.transform.localScale;
|
|
childAsset.renderObject.transform.parent = lastParent[childAsset.hierarchyItem.layerNum - 1];
|
|
//childAsset.renderObject.OnOverlabBegin += connector.interferedObjectManager.AddInterferedPair;
|
|
//childAsset.renderObject.OnOverlabEnd += connector.interferedObjectManager.RemoveInterferedPair;
|
|
|
|
if (lastParent.Count <= childAsset.hierarchyItem.layerNum)
|
|
{
|
|
lastParent.Add(childAsset.renderObject.transform);
|
|
}
|
|
else
|
|
{
|
|
lastParent[childAsset.hierarchyItem.layerNum] = childAsset.renderObject.transform;
|
|
}
|
|
connector.connectedAssets.Add(childAsset);
|
|
}
|
|
}
|
|
copyAsset.assetData.AddTransformToRender(copyAsset.renderObject.transform);
|
|
copyAsset.renderObject.gameObject.SetActive(true);
|
|
copyAsset.renderObject.Hide();
|
|
connector.componentScrollView.AddItem(copyAsset.hierarchyItem);
|
|
}
|
|
for (int i = 0; i < copyList.Count; i++)
|
|
{
|
|
ConnectedAsset connectedAsset = copyList[i];
|
|
List<HierarchyItem> childItems = connectedAsset.hierarchyItem.GetAll(true);
|
|
for (int k = 0; k < childItems.Count; k++)
|
|
{
|
|
ConnectedAsset searchAsset = connector.connectedAssets.Find((x) => x.hierarchyItem == childItems[k]);
|
|
searchAsset.assetData.AddTransformToRender(searchAsset.renderObject.transform);
|
|
searchAsset.renderObject.gameObject.SetActive(true);
|
|
}
|
|
}
|
|
|
|
CanvasManager.instance.GetCanvas<Canvas_Popup>().panel_toastmessage.ActivateMessage("Copy");
|
|
}
|
|
|
|
public void Undo()
|
|
{
|
|
for (int i = 0; i < copyList.Count; i++)
|
|
{
|
|
ConnectedAsset connectedAsset = copyList[i];
|
|
connector.componentScrollView.RemoveItem(connectedAsset.hierarchyItem);
|
|
connectedAsset.assetData.RemoveTransform(connectedAsset.renderObject.transform);
|
|
connectedAsset.renderObject.gameObject.SetActive(false);
|
|
|
|
List<HierarchyItem> childItems = connectedAsset.hierarchyItem.GetAll(true);
|
|
for (int k = 0; k < childItems.Count; k++)
|
|
{
|
|
ConnectedAsset searchAsset = connector.connectedAssets.Find((x) => x.hierarchyItem == childItems[k]);
|
|
searchAsset.assetData.RemoveTransform(searchAsset.renderObject.transform);
|
|
searchAsset.renderObject.gameObject.SetActive(false);
|
|
}
|
|
}
|
|
ManagerHub.instance.Get<RenderObjectHandler>().DeselectAll();
|
|
var canvas = CanvasManager.instance.GetCanvas<Canvas_Popup>();
|
|
canvas.panel_dynamicobjectinfo.ResetObjectInfo();
|
|
//connector.onRemoveObjects?.Invoke();
|
|
connector.componentScrollView.DeselectAll();
|
|
var renderObjectHandler = ManagerHub.instance.Get<RenderObjectHandler>();
|
|
renderObjectHandler.DeselectAll();
|
|
}
|
|
}
|
|
|
|
} |