Files
Studio/Assets/Scripts/Studio/Command/ObjectCommand/CopyObjectCommand.cs

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();
}
}
}